style: Apply Prettier formatting with 4-space indentation

Applied consistent code formatting across the project using Prettier, now configured to use 4-space indentation instead of tabs.
This commit is contained in:
Scott Idem
2025-11-18 18:40:50 -05:00
parent 6d1f9989d0
commit 0987cd6ad9
346 changed files with 86645 additions and 84459 deletions

View File

@@ -1,31 +1,31 @@
/** @type { import("eslint").Linter.Config } */ /** @type { import("eslint").Linter.Config } */
module.exports = { module.exports = {
root: true, root: true,
extends: [ extends: [
'eslint:recommended', 'eslint:recommended',
'plugin:@typescript-eslint/recommended', 'plugin:@typescript-eslint/recommended',
'plugin:svelte/recommended', 'plugin:svelte/recommended',
'prettier' 'prettier'
], ],
parser: '@typescript-eslint/parser', parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'], plugins: ['@typescript-eslint'],
parserOptions: { parserOptions: {
sourceType: 'module', sourceType: 'module',
ecmaVersion: 2020, ecmaVersion: 2020,
extraFileExtensions: ['.svelte'] extraFileExtensions: ['.svelte']
}, },
env: { env: {
browser: true, browser: true,
es2017: true, es2017: true,
node: true node: true
}, },
overrides: [ overrides: [
{ {
files: ['*.svelte'], files: ['*.svelte'],
parser: 'svelte-eslint-parser', parser: 'svelte-eslint-parser',
parserOptions: { parserOptions: {
parser: '@typescript-eslint/parser' parser: '@typescript-eslint/parser'
} }
} }
] ]
}; };

View File

@@ -1,9 +1,9 @@
{ {
"useTabs": false, "useTabs": false,
"tabWidth": 4, "tabWidth": 4,
"singleQuote": true, "singleQuote": true,
"trailingComma": "none", "trailingComma": "none",
"printWidth": 100, "printWidth": 100,
"plugins": ["prettier-plugin-svelte"], "plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
} }

234
.vscode/settings.json vendored
View File

@@ -1,119 +1,119 @@
{ {
"prettier.documentSelectors": ["**/*.svelte"], "prettier.documentSelectors": ["**/*.svelte"],
"tailwindCSS.classAttributes": [ "tailwindCSS.classAttributes": [
"class", "class",
"accent", "accent",
"active", "active",
"animIndeterminate", "animIndeterminate",
"aspectRatio", "aspectRatio",
"background", "background",
"badge", "badge",
"bgBackdrop", "bgBackdrop",
"bgDark", "bgDark",
"bgDrawer", "bgDrawer",
"bgLight", "bgLight",
"blur", "blur",
"border", "border",
"button", "button",
"buttonAction", "buttonAction",
"buttonBack", "buttonBack",
"buttonClasses", "buttonClasses",
"buttonComplete", "buttonComplete",
"buttonDismiss", "buttonDismiss",
"buttonNeutral", "buttonNeutral",
"buttonNext", "buttonNext",
"buttonPositive", "buttonPositive",
"buttonTextCancel", "buttonTextCancel",
"buttonTextConfirm", "buttonTextConfirm",
"buttonTextFirst", "buttonTextFirst",
"buttonTextLast", "buttonTextLast",
"buttonTextNext", "buttonTextNext",
"buttonTextPrevious", "buttonTextPrevious",
"buttonTextSubmit", "buttonTextSubmit",
"caretClosed", "caretClosed",
"caretOpen", "caretOpen",
"chips", "chips",
"color", "color",
"controlSeparator", "controlSeparator",
"controlVariant", "controlVariant",
"cursor", "cursor",
"display", "display",
"element", "element",
"fill", "fill",
"fillDark", "fillDark",
"fillLight", "fillLight",
"flex", "flex",
"flexDirection", "flexDirection",
"gap", "gap",
"gridColumns", "gridColumns",
"height", "height",
"hover", "hover",
"inactive", "inactive",
"indent", "indent",
"justify", "justify",
"meter", "meter",
"padding", "padding",
"position", "position",
"regionAnchor", "regionAnchor",
"regionBackdrop", "regionBackdrop",
"regionBody", "regionBody",
"regionCaption", "regionCaption",
"regionCaret", "regionCaret",
"regionCell", "regionCell",
"regionChildren", "regionChildren",
"regionChipList", "regionChipList",
"regionChipWrapper", "regionChipWrapper",
"regionCone", "regionCone",
"regionContent", "regionContent",
"regionControl", "regionControl",
"regionDefault", "regionDefault",
"regionDrawer", "regionDrawer",
"regionFoot", "regionFoot",
"regionFootCell", "regionFootCell",
"regionFooter", "regionFooter",
"regionHead", "regionHead",
"regionHeadCell", "regionHeadCell",
"regionHeader", "regionHeader",
"regionIcon", "regionIcon",
"regionInput", "regionInput",
"regionInterface", "regionInterface",
"regionInterfaceText", "regionInterfaceText",
"regionLabel", "regionLabel",
"regionLead", "regionLead",
"regionLegend", "regionLegend",
"regionList", "regionList",
"regionListItem", "regionListItem",
"regionNavigation", "regionNavigation",
"regionPage", "regionPage",
"regionPanel", "regionPanel",
"regionRowHeadline", "regionRowHeadline",
"regionRowMain", "regionRowMain",
"regionSummary", "regionSummary",
"regionSymbol", "regionSymbol",
"regionTab", "regionTab",
"regionTrail", "regionTrail",
"ring", "ring",
"rounded", "rounded",
"select", "select",
"shadow", "shadow",
"slotDefault", "slotDefault",
"slotFooter", "slotFooter",
"slotHeader", "slotHeader",
"slotLead", "slotLead",
"slotMessage", "slotMessage",
"slotMeta", "slotMeta",
"slotPageContent", "slotPageContent",
"slotPageFooter", "slotPageFooter",
"slotPageHeader", "slotPageHeader",
"slotSidebarLeft", "slotSidebarLeft",
"slotSidebarRight", "slotSidebarRight",
"slotTrail", "slotTrail",
"spacing", "spacing",
"text", "text",
"track", "track",
"transition", "transition",
"width", "width",
"zIndex" "zIndex"
], ],
"explorer.fileNesting.enabled": false "explorer.fileNesting.enabled": false
} }

View File

@@ -9,16 +9,16 @@ The Aether project is a Svelte and SvelteKit based application, utilizing Tailwi
## 2. Core Technologies ## 2. Core Technologies
- **Frontend Framework:** Svelte 5 and SvelteKit v2 - **Frontend Framework:** Svelte 5 and SvelteKit v2
- **Routing:** SvelteKit's file-system based routing. - **Routing:** SvelteKit's file-system based routing.
- **Styling:** Tailwind CSS 3.x (with plans to upgrade to 4.x when ShadCN is ready) - **Styling:** Tailwind CSS 3.x (with plans to upgrade to 4.x when ShadCN is ready)
- **UI Component Libraries:** - **UI Component Libraries:**
- Skeleton (Design System, Tailwind Components, Functional Components - with plans to upgrade to v3) - Skeleton (Design System, Tailwind Components, Functional Components - with plans to upgrade to v3)
- Flowbite (Tailwind Components) - Flowbite (Tailwind Components)
- **Note:** ShadCN is currently used but is planned for removal. - **Note:** ShadCN is currently used but is planned for removal.
- **Text/Code Editors:** - **Text/Code Editors:**
- CodeMirror 6.x (primary text and code editor, planned for rich text editing) - CodeMirror 6.x (primary text and code editor, planned for rich text editing)
- Edra (TipTap based Rich Text Editor) - Edra (TipTap based Rich Text Editor)
- **Note:** ShadEditor TipTap is present but marked for removal, with CodeMirror being the preferred solution for all text editing needs. - **Note:** ShadEditor TipTap is present but marked for removal, with CodeMirror being the preferred solution for all text editing needs.
- **Icons:** Lucide Icons (SVG Icons) - **Icons:** Lucide Icons (SVG Icons)
- **Markdown Parsing:** `marked` library - **Markdown Parsing:** `marked` library
- **State Management:** Svelte stores, potentially with `liveQuery` from Dexie for reactive IndexedDB interactions. - **State Management:** Svelte stores, potentially with `liveQuery` from Dexie for reactive IndexedDB interactions.
@@ -139,4 +139,4 @@ A list of potential future standard fields, often prefixed with `obj_`. These ar
- `lq__xyz_obj`: Used for general read-only access to liveQuery results. - `lq__xyz_obj`: Used for general read-only access to liveQuery results.
- `lqw__xyz_obj`: Used for forms and binding values, representing a writable snapshot of liveQuery results. - `lqw__xyz_obj`: Used for forms and binding values, representing a writable snapshot of liveQuery results.
- **Note:** Care must be taken when binding to `lqw__xyz_obj` to manage updates and potential conflicts with the underlying liveQuery. - **Note:** Care must be taken when binding to `lqw__xyz_obj` to manage updates and potential conflicts with the underlying liveQuery.

View File

@@ -12,63 +12,63 @@ These components are part of the core application shell and provide global funct
- **`main/module`s**: Main content area for modules. - **`main/module`s**: Main content area for modules.
- **`footer`**: Application-wide footer. - **`footer`**: Application-wide footer.
- **`app`**: Provides global application functionalities such as: - **`app`**: Provides global application functionalities such as:
- Refresh application state. - Refresh application state.
- Clear IndexedDB. - Clear IndexedDB.
- Clear local storage (settings). - Clear local storage (settings).
- Toggle iframe visibility (also updates URL parameter). - Toggle iframe visibility (also updates URL parameter).
- Copy current URL. - Copy current URL.
- Generate and display QR codes. - Generate and display QR codes.
- **`menu`**: Various menus for different purposes: - **`menu`**: Various menus for different purposes:
- **`mode`**: Edit mode toggle, more options (all or details). - **`mode`**: Edit mode toggle, more options (all or details).
- **`access_type`**: Passcode input, clear access. - **`access_type`**: Passcode input, clear access.
- **`user`**: Sign in/out, reset password, email link, change username and email. - **`user`**: Sign in/out, reset password, email link, change username and email.
- **`theme`**: Mode (light/dark), name (theme list). - **`theme`**: Mode (light/dark), name (theme list).
- **`debug`**: Developer-facing tools: - **`debug`**: Developer-facing tools:
- Toggle debug mode (also updates URL parameter). - Toggle debug mode (also updates URL parameter).
- Show core and module storages. - Show core and module storages.
- Manually set initial timestamp. - Manually set initial timestamp.
- **`scroll_to`**: Navigation controls for scrolling: - **`scroll_to`**: Navigation controls for scrolling:
- Scroll to top of the page. - Scroll to top of the page.
- Scroll page up. - Scroll page up.
- Scroll page down. - Scroll page down.
- Scroll to bottom of the page. - Scroll to bottom of the page.
### 1.2. Core Components ### 1.2. Core Components
These are reusable components that provide common functionalities across different modules. These are reusable components that provide common functionalities across different modules.
- **`copy_btn`**: A button to copy content to the clipboard. - **`copy_btn`**: A button to copy content to the clipboard.
- Properties: `clipboard`, `bind:value`, `btn_text`, `btn_html`. - Properties: `clipboard`, `bind:value`, `btn_text`, `btn_html`.
- **`txt_editor`**: A basic text area editor. - **`txt_editor`**: A basic text area editor.
- **`md_editor`**: Markdown editor. - **`md_editor`**: Markdown editor.
- Uses CodeMirror (planned for rich text editing). - Uses CodeMirror (planned for rich text editing).
- **Note:** ShadEditor TipTap is present but marked for removal. ShadCN components are also being phased out in favor of CodeMirror for text editing. - **Note:** ShadEditor TipTap is present but marked for removal. ShadCN components are also being phased out in favor of CodeMirror for text editing.
- **`html_editor`**: HTML editor. - **`html_editor`**: HTML editor.
- **`media_player`**: Component for playing media files. - **`media_player`**: Component for playing media files.
- Properties: `hosted_file`, `archive_content`, `media_player`. - Properties: `hosted_file`, `archive_content`, `media_player`.
- Bindings: `bind:host_id`, `bind:media_type`. - Bindings: `bind:host_id`, `bind:media_type`.
- Status: `stopped`, `paused`, `playing`. - Status: `stopped`, `paused`, `playing`.
- **`hosted_file_li`**: Manages a list of hosted files, making them available for selection. - **`hosted_file_li`**: Manages a list of hosted files, making them available for selection.
- **`hosted_file_link_to`**: Lists links per object, with bindings to add/remove links. - **`hosted_file_link_to`**: Lists links per object, with bindings to add/remove links.
- **`upload_to_host`**: Component for uploading files to the host. - **`upload_to_host`**: Component for uploading files to the host.
- Handles multiple files. - Handles multiple files.
- Properties: `link_type`, `link_id`, `inner fragment` (label html). - Properties: `link_type`, `link_id`, `inner fragment` (label html).
- Bindings: `bind:trigger`, `bind:show_spinner`, `bind:show_percent`. - Bindings: `bind:trigger`, `bind:show_spinner`, `bind:show_percent`.
- Status: `started`, `uploading`, `finished`. - Status: `started`, `uploading`, `finished`.
- **`upload_file_tbl`**: Table for uploaded files, includes checks for duplicate file hashes and removal from the list. - **`upload_file_tbl`**: Table for uploaded files, includes checks for duplicate file hashes and removal from the list.
- **`download_from_host`**: Component for downloading files from the host. - **`download_from_host`**: Component for downloading files from the host.
- Bindings: `bind:host_file_id`, `bind:filename`, `bind:file_ext`. - Bindings: `bind:host_file_id`, `bind:filename`, `bind:file_ext`.
- Properties: `btn inner fragment`. - Properties: `btn inner fragment`.
- Bindings: `bind:trigger`, `bind:show_spinner`, `bind:show_percent`. - Bindings: `bind:trigger`, `bind:show_spinner`, `bind:show_percent`.
- Status: `started`, `downloading`, `finished`. - Status: `started`, `downloading`, `finished`.
- **`data_store`**: Component for interacting with data stores. - **`data_store`**: Component for interacting with data stores.
- **`ae_crud`**: Generic CRUD (Create, Read, Update, Delete) component. - **`ae_crud`**: Generic CRUD (Create, Read, Update, Delete) component.
- **Note:** Needs simplification. - **Note:** Needs simplification.
- Properties: `obj`, `prop`, `current_value`. - Properties: `obj`, `prop`, `current_value`.
- Bindings: `bind:value`, `bind:trigger`, `inner fragment`. - Bindings: `bind:value`, `bind:trigger`, `inner fragment`.
- **`ae_obj_prop_val`**: A wrapper for a function to manage object property values. - **`ae_obj_prop_val`**: A wrapper for a function to manage object property values.
- Bindings: `bind:obj_type`, `bind:obj_id`, `bind:obj_prop`, `bind:obj_value`, `bind:obj_new_value`, `bind:trigger`, `bind:show_spinner`, `bind:show_percent`. - Bindings: `bind:obj_type`, `bind:obj_id`, `bind:obj_prop`, `bind:obj_value`, `bind:obj_new_value`, `bind:trigger`, `bind:show_spinner`, `bind:show_percent`.
- Status: `status`, `result`. - Status: `status`, `result`.
- **`sql_qry`**: Component for executing SQL queries. - **`sql_qry`**: Component for executing SQL queries.
- **`obj_tbl`**: Object SQL results table or similar. - **`obj_tbl`**: Object SQL results table or similar.
- **`qr_scanner`**: Component for scanning QR codes. - **`qr_scanner`**: Component for scanning QR codes.
@@ -79,8 +79,8 @@ These are reusable components that provide common functionalities across differe
These are components specific to main application sections or individual modules. These are components specific to main application sections or individual modules.
- **`menu`**: - **`menu`**:
- **`options`**: Various settings, show/hide content and options, limit, sorting options. - **`options`**: Various settings, show/hide content and options, limit, sorting options.
- **`actions`**: Various actions, sign in/out, email. - **`actions`**: Various actions, sign in/out, email.
### 1.4. Object Menu ### 1.4. Object Menu
@@ -91,31 +91,31 @@ A standardized menu for interacting with objects.
- **Actions:** `create`, `view`, `edit`, `update`, `hide`, `disable`, `delete`, `alert` (message), `archive` (not yet ready). - **Actions:** `create`, `view`, `edit`, `update`, `hide`, `disable`, `delete`, `alert` (message), `archive` (not yet ready).
- **Future Actions:** `copy`, `import`. - **Future Actions:** `copy`, `import`.
- **Sort Options:** - **Sort Options:**
- `[default]`: `group > priority > sort (ASC/DESC) > alert > name` - `[default]`: `group > priority > sort (ASC/DESC) > alert > name`
- `[sort_updated]`: `group > priority > sort (ASC/DESC) > alert > updated_on > created_on` - `[sort_updated]`: `group > priority > sort (ASC/DESC) > alert > updated_on > created_on`
- `[priority_updated]`: `group > priority > updated_on (ASC/DESC) > created_on` - `[priority_updated]`: `group > priority > updated_on (ASC/DESC) > created_on`
- `[priority_name]`: `group > priority > name (ASC/DESC) > sort > alert > updated_on > created_on` - `[priority_name]`: `group > priority > name (ASC/DESC) > sort > alert > updated_on > created_on`
- `[name]`: `priority > name (ASC/DESC) > sort > alert > updated_on > created_on` - `[name]`: `priority > name (ASC/DESC) > sort > alert > updated_on > created_on`
- `[created_on]`: `priority > created_on (ASC/DESC)` - `[created_on]`: `priority > created_on (ASC/DESC)`
- `[updated_on]`: `priority > updated_on (ASC/DESC) > created_on` - `[updated_on]`: `priority > updated_on (ASC/DESC) > created_on`
## 2. Pop-ups ## 2. Pop-ups
Standardized structure for various types of pop-up elements. Standardized structure for various types of pop-up elements.
- **`modal_header`**: - **`modal_header`**:
- `title` - `title`
- `close` button - `close` button
- **`modal_main`**: Main content area of the modal. - **`modal_main`**: Main content area of the modal.
- **`modal_meta`**: Meta-information section. - **`modal_meta`**: Meta-information section.
- **`modal_footer`**: - **`modal_footer`**:
- `close` button - `close` button
- **`Pop-up Modal (blocking)`**: A modal that blocks interaction with the rest of the page. - **`Pop-up Modal (blocking)`**: A modal that blocks interaction with the rest of the page.
- `modal position` - `modal position`
- **`Pop-up Modal Inline`**: A modal that appears inline with content. - **`Pop-up Modal Inline`**: A modal that appears inline with content.
- `inline`, `inline-block`, `block` display options. - `inline`, `inline-block`, `block` display options.
- **`Pop-up Dialog`**: A dialog box. - **`Pop-up Dialog`**: A dialog box.
- `dialog position` - `dialog position`
## 3. Containers ## 3. Containers

View File

@@ -87,4 +87,4 @@ Dexie's `liveQuery` is used to provide reactive data streams from IndexedDB.
- `lq__xyz_obj`: Represents a read-only liveQuery result for a single object. - `lq__xyz_obj`: Represents a read-only liveQuery result for a single object.
- `lqw__xyz_obj`: Represents a writable liveQuery result, typically used for forms and data binding. - `lqw__xyz_obj`: Represents a writable liveQuery result, typically used for forms and data binding.
- **Note:** When using `lqw__xyz_obj`, developers must carefully manage updates to avoid conflicts with the underlying liveQuery and ensure data integrity. - **Note:** When using `lqw__xyz_obj`, developers must carefully manage updates to avoid conflicts with the underlying liveQuery and ensure data integrity.

View File

@@ -13,10 +13,10 @@ Core Aether modules
Additional Aether modules Additional Aether modules
- events - events
- presentation management - import the program data (events, session, presentations, presenters, event files, locations/rooms, devices) - presentation management - import the program data (events, session, presentations, presenters, event files, locations/rooms, devices)
- launcher - Technically this is used with presentation management. It is part of the native app that uses Electron. One of the libraries is for functions that only work when the site is opened in an Electron app. For example the regular browser can not move files around on the local computer or run local commands. - launcher - Technically this is used with presentation management. It is part of the native app that uses Electron. One of the libraries is for functions that only work when the site is opened in an Electron app. For example the regular browser can not move files around on the local computer or run local commands.
- badge printing - badge printing
- lead retrieval - attendee tracking; QR codes - lead retrieval - attendee tracking; QR codes
- journals - journal, documentation, notes, diary, blog, etc - journals - journal, documentation, notes, diary, blog, etc
- idaa - One of my clients - idaa - One of my clients
@@ -49,18 +49,18 @@ The refactoring strategy involved creating a local, non-exported `_process_gener
**Key aspects of the refactoring:** **Key aspects of the refactoring:**
- **In-file Generic Helper (`_process_generic_props`):** This function handles common data transformations: - **In-file Generic Helper (`_process_generic_props`):** This function handles common data transformations:
- **`*_random` ID Aliasing:** It automatically iterates over object keys and creates a non-suffixed alias for any key ending in `_random` (e.g., `person_id_random` becomes `person_id`). This is crucial for client-side logic that expects standard ID fields. - **`*_random` ID Aliasing:** It automatically iterates over object keys and creates a non-suffixed alias for any key ending in `_random` (e.g., `person_id_random` becomes `person_id`). This is crucial for client-side logic that expects standard ID fields.
- **`tmp_sort` Field Generation:** It creates a set of basic `tmp_sort` fields for client-side sorting. - **`tmp_sort` Field Generation:** It creates a set of basic `tmp_sort` fields for client-side sorting.
- **`specific_processor` Callback:** Module-specific logic is handled by a `specific_processor` callback function passed to the `_process_generic_props` helper. This allows for: - **`specific_processor` Callback:** Module-specific logic is handled by a `specific_processor` callback function passed to the `_process_generic_props` helper. This allows for:
- **Unique `tmp_sort` Logic:** Modules can override the default `tmp_sort` fields with their own specific sorting requirements. - **Unique `tmp_sort` Logic:** Modules can override the default `tmp_sort` fields with their own specific sorting requirements.
- **Content Processing:** Asynchronous operations like Markdown parsing (using `marked.parse`) are handled within the `specific_processor` for the relevant modules (e.g., `ae_journals__journal_entry.ts`). - **Content Processing:** Asynchronous operations like Markdown parsing (using `marked.parse`) are handled within the `specific_processor` for the relevant modules (e.g., `ae_journals__journal_entry.ts`).
- **Other Special Cases:** Any other module-specific data transformations are handled in this callback. - **Other Special Cases:** Any other module-specific data transformations are handled in this callback.
- **`core__crud_generic.ts` Cleanup:** The generic CRUD functions in `src/lib/ae_core/core__crud_generic.ts` were simplified: - **`core__crud_generic.ts` Cleanup:** The generic CRUD functions in `src/lib/ae_core/core__crud_generic.ts` were simplified:
- The `process_ae_obj__props` function in this file was deprecated. - The `process_ae_obj__props` function in this file was deprecated.
- All calls to `process_ae_obj__props` and `db_save_ae_obj_li__ae_obj` were removed from the generic CRUD functions (`load_ae_obj_id`, `load_ae_obj_li`, etc.). - All calls to `process_ae_obj__props` and `db_save_ae_obj_li__ae_obj` were removed from the generic CRUD functions (`load_ae_obj_id`, `load_ae_obj_li`, etc.).
- These functions are now responsible only for API interaction, delegating all data processing and caching to the module-specific functions that call them. This enforces a cleaner separation of concerns. - These functions are now responsible only for API interaction, delegating all data processing and caching to the module-specific functions that call them. This enforces a cleaner separation of concerns.
### Tiptap to CodeMirror Migration (2025-11-17) ### Tiptap to CodeMirror Migration (2025-11-17)

View File

@@ -13,46 +13,46 @@
- **Database Definition Files:** `db_<module>.ts` (e.g., `db_core.ts`, `db_journals.ts`) - **Database Definition Files:** `db_<module>.ts` (e.g., `db_core.ts`, `db_journals.ts`)
- **Svelte Store Files:** `ae_<module>_stores.ts` (e.g., `ae_core_stores.ts`, `ae_journals_stores.ts`) - **Svelte Store Files:** `ae_<module>_stores.ts` (e.g., `ae_core_stores.ts`, `ae_journals_stores.ts`)
- **Svelte Components:** - **Svelte Components:**
- **Module-specific components:** `ae_comp__<module>__<component_name>.svelte` (e.g., `ae_comp__events__event_card.svelte`) - **Module-specific components:** `ae_comp__<module>__<component_name>.svelte` (e.g., `ae_comp__events__event_card.svelte`)
- **Generic/reusable components:** `element_<component_name>.svelte` (e.g., `element_input_file.svelte`, `element_qr_scanner_v2.svelte`) - **Generic/reusable components:** `element_<component_name>.svelte` (e.g., `element_input_file.svelte`, `element_qr_scanner_v2.svelte`)
- **SvelteKit Routes:** Follow SvelteKit's standard routing conventions (e.g., `+page.svelte`, `+layout.svelte`, `[id]/+page.svelte`). - **SvelteKit Routes:** Follow SvelteKit's standard routing conventions (e.g., `+page.svelte`, `+layout.svelte`, `[id]/+page.svelte`).
- **CSS Files:** `ae-<module>-<purpose>.css` (e.g., `ae-c-idaa-light.css`, `ae-osit-default.css`) - **CSS Files:** `ae-<module>-<purpose>.css` (e.g., `ae-c-idaa-light.css`, `ae-osit-default.css`)
## 3. Function and Variable Naming ## 3. Function and Variable Naming
- **Style:** Strictly `snake_case` for all function and variable names. - **Style:** Strictly `snake_case` for all function and variable names.
- **Deprecated:** `camelCase` should be refactored to `snake_case`. - **Deprecated:** `camelCase` should be refactored to `snake_case`.
- **Prefixes:** - **Prefixes:**
- `load_ae_obj_id__<object_type>`: For loading a single Aether object by ID. - `load_ae_obj_id__<object_type>`: For loading a single Aether object by ID.
- `load_ae_obj_li__<object_type>`: For loading a list of Aether objects. - `load_ae_obj_li__<object_type>`: For loading a list of Aether objects.
- `create_ae_obj__<object_type>`: For creating an Aether object. - `create_ae_obj__<object_type>`: For creating an Aether object.
- `update_ae_obj__<object_type>`: For updating an Aether object. - `update_ae_obj__<object_type>`: For updating an Aether object.
- `delete_ae_obj_id__<object_type>`: For deleting an Aether object by ID. - `delete_ae_obj_id__<object_type>`: For deleting an Aether object by ID.
- `db_save_ae_obj_li__<object_type>`: For saving a list of Aether objects to IndexedDB. - `db_save_ae_obj_li__<object_type>`: For saving a list of Aether objects to IndexedDB.
- `db_update_ae_obj_id__<object_type>`: For updating an Aether object in IndexedDB. - `db_update_ae_obj_id__<object_type>`: For updating an Aether object in IndexedDB.
- `process_ae_obj__<object_type>_props`: For module-specific data transformation functions. - `process_ae_obj__<object_type>_props`: For module-specific data transformation functions.
- **Deprecated:** Ambiguous `handle_` prefixes should be replaced with more descriptive `snake_case` names (e.g., `handle_submit_form` -> `submit_form`). - **Deprecated:** Ambiguous `handle_` prefixes should be replaced with more descriptive `snake_case` names (e.g., `handle_submit_form` -> `submit_form`).
## 4. Object and Property Naming ## 4. Object and Property Naming
- **Singularity:** Use singular nouns for objects and properties (e.g., `example.id`, not `examples.id`). - **Singularity:** Use singular nouns for objects and properties (e.g., `example.id`, not `examples.id`).
- **IDs:** - **IDs:**
- `id`: Primary key for an object (internal use, often a UUID). - `id`: Primary key for an object (internal use, often a UUID).
- `<object_type>_id`: Specific ID for an object (e.g., `person_id`). - `<object_type>_id`: Specific ID for an object (e.g., `person_id`).
- `<object_type>_id_random`: Randomly generated ID for an object (often used for external exposure or URL parameters). - `<object_type>_id_random`: Randomly generated ID for an object (often used for external exposure or URL parameters).
- `account_id`, `site_id`, `user_id`, etc.: Foreign keys. - `account_id`, `site_id`, `user_id`, etc.: Foreign keys.
- **Common Properties:** - **Common Properties:**
- `code`: Short, unique identifier. - `code`: Short, unique identifier.
- `name`: Display name. - `name`: Display name.
- `description`: Longer text description. - `description`: Longer text description.
- `enable`: Boolean for active/inactive status. - `enable`: Boolean for active/inactive status.
- `hide`: Boolean for visibility. - `hide`: Boolean for visibility.
- `priority`: Numeric value for ordering. - `priority`: Numeric value for ordering.
- `sort`: Numeric value for ordering. - `sort`: Numeric value for ordering.
- `group`: Categorization string. - `group`: Categorization string.
- `notes`: General notes/comments. - `notes`: General notes/comments.
- `created_on`: Timestamp of creation. - `created_on`: Timestamp of creation.
- `updated_on`: Timestamp of last update. - `updated_on`: Timestamp of last update.
- **Special Use Properties:** `for_type`, `for_id`, `archive_on`, `passcode`, `external_id`. - **Special Use Properties:** `for_type`, `for_id`, `archive_on`, `passcode`, `external_id`.
- **Config/JSON Properties:** `cfg_json`, `data_json`, `linked_li_json`. - **Config/JSON Properties:** `cfg_json`, `data_json`, `linked_li_json`.
- **Special Generated Fields (Client-side):** `tmp_sort_1`, `tmp_sort_2`, `tmp_sort_3` (for client-side sorting). - **Special Generated Fields (Client-side):** `tmp_sort_1`, `tmp_sort_2`, `tmp_sort_3` (for client-side sorting).
@@ -82,12 +82,12 @@
## 10. Local Storage and IndexedDB Keys ## 10. Local Storage and IndexedDB Keys
- **Local Storage:** - **Local Storage:**
- `api` - `api`
- `app` (global) - `app` (global)
- `core` (core modules) - `core` (core modules)
- `<module>` (extended modules) - `<module>` (extended modules)
- `<custom>` (custom modules) - `<custom>` (custom modules)
- **IndexedDB:** - **IndexedDB:**
- `ae_core_db` - `ae_core_db`
- `<module>` - `<module>`
- `<custom>` - `<custom>`

View File

@@ -22,45 +22,45 @@
- [md_editor] CodeMirror, ShadEditor TipTap (need to remove) - [md_editor] CodeMirror, ShadEditor TipTap (need to remove)
- [html_editor] - [html_editor]
- [media_player] - [media_player]
- hosted_file archive_content media_player, - hosted_file archive_content media_player,
- bind:host_id, - bind:host_id,
- bind:media_type - bind:media_type
- status - stopped, paused, playing - status - stopped, paused, playing
- [hosted_file_li] manage_hosted_file_li, make available for selection - [hosted_file_li] manage_hosted_file_li, make available for selection
- [hosted_file_link_to] list links per object, bind:add link, bind:remove link - [hosted_file_link_to] list links per object, bind:add link, bind:remove link
- [upload_to_host] - input_hosted_file; needs to handle multiple files - [upload_to_host] - input_hosted_file; needs to handle multiple files
- link_type, - link_type,
- link_id, - link_id,
- inner fragment - label html - inner fragment - label html
- bind:trigger - bind:trigger
- bind:show_spinner - bind:show_spinner
- bind:show_percent - bind:show_percent
- status - status
- result - started, uploading, finished - result - started, uploading, finished
- [upload_file_tbl] input_hosted_file_tbl, check for dup file hash, remove from list - [upload_file_tbl] input_hosted_file_tbl, check for dup file hash, remove from list
- [download_from_host] - [download_from_host]
- bind:host_file_id - bind:host_file_id
- bind:filename - bind:filename
- bind:file_ext - bind:file_ext
- btn inner fragment - btn inner fragment
- bind:trigger - bind:trigger
- bind:show_spinner - bind:show_spinner
- bind:show_percent - bind:show_percent
- status - status
- result - started, downloading, finished - result - started, downloading, finished
- [data_store] - [data_store]
- [ae_crud] need to simplify! obj, prop, current_value, bind:value, bind:trigger, inner fragment - [ae_crud] need to simplify! obj, prop, current_value, bind:value, bind:trigger, inner fragment
- [ae_obj_prop_val] - essentially a wrapper for the function - [ae_obj_prop_val] - essentially a wrapper for the function
- bind:obj_type - bind:obj_type
- bind:obj_id - bind:obj_id
- bind:obj_prop - bind:obj_prop
- bind:obj_value - bind:obj_value
- bind:obj_new_value - bind:obj_new_value
- bind:trigger - bind:trigger
- bind:show_spinner - bind:show_spinner
- bind:show_percent - bind:show_percent
- status - status
- result - result
- [sql_qry] - [sql_qry]
- [obj_tbl] obj sql results tbl or similar - [obj_tbl] obj sql results tbl or similar
- [qr_scanner] - [qr_scanner]
@@ -78,23 +78,23 @@
- actions: create, view, edit, update, hide, disable, delete, alert (message), archive (not ready yet) - actions: create, view, edit, update, hide, disable, delete, alert (message), archive (not ready yet)
- future actions: copy, import - future actions: copy, import
- sort options: - sort options:
- [default] group > priority > sort (ASC/DESC) > alert > name - [default] group > priority > sort (ASC/DESC) > alert > name
- [sort_updated] group > priority > sort (ASC/DESC) > alert > updated_on > created_on - [sort_updated] group > priority > sort (ASC/DESC) > alert > updated_on > created_on
- [priority_updated] group > priority > updated_on (ASC/DESC) > created_on - [priority_updated] group > priority > updated_on (ASC/DESC) > created_on
- [priority_name] group > priority > name (ASC/DESC) > sort > alert > updated_on > created_on - [priority_name] group > priority > name (ASC/DESC) > sort > alert > updated_on > created_on
- [name] priority > name (ASC/DESC) > sort > alert > updated_on > created_on - [name] priority > name (ASC/DESC) > sort > alert > updated_on > created_on
- [created_on] priority > created_on (ASC/DESC) - [created_on] priority > created_on (ASC/DESC)
- [updated_on] priority > updated_on (ASC/DESC) > created_on - [updated_on] priority > updated_on (ASC/DESC) > created_on
### Pop-ups: ### Pop-ups:
- modal_header - modal_header
- title - title
- close - close
- modal_main - modal_main
- modal_meta - modal_meta
- modal_footer - modal_footer
- close - close
#### Pop-up Modal (blocking) #### Pop-up Modal (blocking)

View File

@@ -118,54 +118,56 @@ Sort of related.... more permission/security though: Create a new table that wil
```ts ```ts
let lq__post_obj = $derived( let lq__post_obj = $derived(
liveQuery(async () => { liveQuery(async () => {
if (log_lvl) { if (log_lvl) {
console.log(`lq__post_obj: post_id = ${$idaa_slct?.post_id}`); console.log(`lq__post_obj: post_id = ${$idaa_slct?.post_id}`);
} }
let results = await db_posts.post.get($idaa_slct.post_id ?? ''); // null or undefined does not reset things like '' does let results = await db_posts.post.get($idaa_slct.post_id ?? ''); // null or undefined does not reset things like '' does
// Check if results are different than the current $idaa_slct.post_obj // Check if results are different than the current $idaa_slct.post_obj
if ($idaa_slct.post_obj && results) { if ($idaa_slct.post_obj && results) {
if (JSON.stringify($idaa_slct.post_obj) !== JSON.stringify(results)) { if (JSON.stringify($idaa_slct.post_obj) !== JSON.stringify(results)) {
$idaa_slct.post_obj = { ...results }; $idaa_slct.post_obj = { ...results };
if (log_lvl) { if (log_lvl) {
console.log(`$idaa_slct.post_obj = `, $idaa_slct.post_obj); console.log(`$idaa_slct.post_obj = `, $idaa_slct.post_obj);
} }
} else { } else {
if (log_lvl) { if (log_lvl) {
console.log(`Post object has not changed for post_id: ${$idaa_slct.post_id}`); console.log(`Post object has not changed for post_id: ${$idaa_slct.post_id}`);
} }
} }
} }
return results; return results;
}) })
); );
let lq__post_comment_obj_li = $derived( let lq__post_comment_obj_li = $derived(
liveQuery(async () => { liveQuery(async () => {
let results = await db_posts.comment let results = await db_posts.comment
.where('post_id') .where('post_id')
.equals($idaa_slct.post_id ?? '') // null or undefined does not reset things like '' does .equals($idaa_slct.post_id ?? '') // null or undefined does not reset things like '' does
.reverse() .reverse()
.sortBy('updated_on'); .sortBy('updated_on');
// .sortBy('title'); // .sortBy('title');
if ( if (
$idaa_slct.post_comment_obj_li && $idaa_slct.post_comment_obj_li &&
JSON.stringify($idaa_slct.post_comment_obj_li) !== JSON.stringify(results) JSON.stringify($idaa_slct.post_comment_obj_li) !== JSON.stringify(results)
) { ) {
$idaa_slct.post_comment_obj_li = [...results]; $idaa_slct.post_comment_obj_li = [...results];
if (log_lvl) { if (log_lvl) {
console.log(`$idaa_slct.post_comment_obj_li = `, $idaa_slct.post_comment_obj_li); console.log(`$idaa_slct.post_comment_obj_li = `, $idaa_slct.post_comment_obj_li);
} }
} else { } else {
if (log_lvl) { if (log_lvl) {
console.log(`Post comment object list has not changed for post_id: ${$idaa_slct.post_id}`); console.log(
} `Post comment object list has not changed for post_id: ${$idaa_slct.post_id}`
} );
}
}
return results; return results;
}) })
); );
``` ```

View File

@@ -109,8 +109,8 @@ I am slowly switching from Font-Awesome to Lucide
## Tiptap Editor ## Tiptap Editor
- Eventually use Edra? https://edra.tsuzat.com/ - Eventually use Edra? https://edra.tsuzat.com/
- Best Rich Text Editor, made for Svelte Developers with Tiptap - Best Rich Text Editor, made for Svelte Developers with Tiptap
- ShadEditor is "evolving" to be Edra. - ShadEditor is "evolving" to be Edra.
- ShadCN is still stuck on Tailwind 3. Waiting to upgrade to Tailwind 4.x. Tailwind 4.x was released in late January 2025. ShadCN is still being worked on as of late March 2025. - ShadCN is still stuck on Tailwind 3. Waiting to upgrade to Tailwind 4.x. Tailwind 4.x was released in late January 2025. ShadCN is still being worked on as of late March 2025.
- [https://github.com/huntabyte/shadcn-svelte/issues/1643](https://github.com/huntabyte/shadcn-svelte/issues/1643) - [https://github.com/huntabyte/shadcn-svelte/issues/1643](https://github.com/huntabyte/shadcn-svelte/issues/1643)

View File

@@ -23,23 +23,23 @@ Dexie.js is a lightweight, minimalistic wrapper for IndexedDB that makes it easi
### Key Classes and Methods ### Key Classes and Methods
- **`Dexie`:** The main class for creating and managing IndexedDB databases. - **`Dexie`:** The main class for creating and managing IndexedDB databases.
- `new Dexie(databaseName)`: Creates a new database instance. - `new Dexie(databaseName)`: Creates a new database instance.
- `version(versionNumber).stores({ ... })`: Defines the database schema. - `version(versionNumber).stores({ ... })`: Defines the database schema.
- **`Table`:** Represents an object store (table) in the database. - **`Table`:** Represents an object store (table) in the database.
- `add(item)`: Adds a new item to the table. - `add(item)`: Adds a new item to the table.
- `put(item)`: Adds or updates an item in the table. - `put(item)`: Adds or updates an item in the table.
- `update(key, changes)`: Updates an existing item. - `update(key, changes)`: Updates an existing item.
- `delete(key)`: Deletes an item by its primary key. - `delete(key)`: Deletes an item by its primary key.
- `get(key)`: Retrieves an item by its primary key. - `get(key)`: Retrieves an item by its primary key.
- `where(index)`: Starts a query using an index. - `where(index)`: Starts a query using an index.
- `toArray()`: Retrieves all items from the table as an array. - `toArray()`: Retrieves all items from the table as an array.
- **`Collection`:** Represents a collection of items resulting from a query. - **`Collection`:** Represents a collection of items resulting from a query.
- `toArray()`: Retrieves all items in the collection as an array. - `toArray()`: Retrieves all items in the collection as an array.
- `first()`: Retrieves the first item in the collection. - `first()`: Retrieves the first item in the collection.
- `last()`: Retrieves the last item in the collection. - `last()`: Retrieves the last item in the collection.
- `each(callback)`: Iterates over each item in the collection. - `each(callback)`: Iterates over each item in the collection.
- `modify(changes)`: Updates all items in the collection. - `modify(changes)`: Updates all items in the collection.
- `delete()`: Deletes all items in the collection. - `delete()`: Deletes all items in the collection.
For a complete list of API methods, refer to the [Dexie.js API Reference](https://dexie.org/docs/API-Reference). For a complete list of API methods, refer to the [Dexie.js API Reference](https://dexie.org/docs/API-Reference).
@@ -63,13 +63,13 @@ import { readable } from 'svelte/store';
import { db } from './db'; // Your Dexie database instance import { db } from './db'; // Your Dexie database instance
export function createLiveQueryStore<T>(query: () => T | Promise<T>) { export function createLiveQueryStore<T>(query: () => T | Promise<T>) {
return readable<T | undefined>(undefined, (set) => { return readable<T | undefined>(undefined, (set) => {
const subscription = liveQuery(query).subscribe({ const subscription = liveQuery(query).subscribe({
next: (result) => set(result), next: (result) => set(result),
error: (error) => console.error(error) error: (error) => console.error(error)
}); });
return () => subscription.unsubscribe(); return () => subscription.unsubscribe();
}); });
} }
``` ```
@@ -77,16 +77,16 @@ export function createLiveQueryStore<T>(query: () => T | Promise<T>) {
```html ```html
<script> <script>
import { createLiveQueryStore } from './stores'; import { createLiveQueryStore } from './stores';
import { db } from './db'; import { db } from './db';
const friends = createLiveQueryStore(() => db.friends.toArray()); const friends = createLiveQueryStore(() => db.friends.toArray());
</script> </script>
<ul> <ul>
{#if $friends} {#each $friends as friend} {#if $friends} {#each $friends as friend}
<li>{friend.name}</li> <li>{friend.name}</li>
{/each} {/if} {/each} {/if}
</ul> </ul>
``` ```

256
TODO.md
View File

@@ -30,22 +30,22 @@ This is a list of tasks to be completed before the next event/show/conference.
- [ ] **Goal:** Enforce a single, consistent naming standard across the entire codebase. - [ ] **Goal:** Enforce a single, consistent naming standard across the entire codebase.
- [ ] **Files:** - [ ] **Files:**
- Logic: `ae_<module>__<concept>.ts` - Logic: `ae_<module>__<concept>.ts`
- DB Definitions: `db_<module>.ts` - DB Definitions: `db_<module>.ts`
- Svelte Stores: `ae_<module>_stores.ts` - Svelte Stores: `ae_<module>_stores.ts`
- Consolidate helper files (e.g., `ae_core_functions.ts`) into the above files. - Consolidate helper files (e.g., `ae_core_functions.ts`) into the above files.
- [ ] **Functions & Variables:** - [ ] **Functions & Variables:**
- [x] Enforce `snake_case` for all function and variable names. - [x] Enforce `snake_case` for all function and variable names.
- [x] Deprecate and remove `camelCase`. - [x] Deprecate and remove `camelCase`.
- [x] Deprecate and refactor ambiguous `handle_` prefixes. - [x] Deprecate and refactor ambiguous `handle_` prefixes.
- [ ] **Object & Property Naming:** - [ ] **Object & Property Naming:**
- Use singular nouns for objects and properties (e.g., `example.id`, not `examples.id`). - Use singular nouns for objects and properties (e.g., `example.id`, not `examples.id`).
- [ ] **List Suffixes:** - [ ] **List Suffixes:**
- Use `_li` for simple, unordered arrays. - Use `_li` for simple, unordered arrays.
- Use `_kv` for key-value objects/maps. - Use `_kv` for key-value objects/maps.
- [ ] **Process:** - [ ] **Process:**
- Refactor one module at a time to ensure internal consistency before moving to the next. Start with `ae_core`. - Refactor one module at a time to ensure internal consistency before moving to the next. Start with `ae_core`.
- **Update 2025-11-13:** `ae_core_functions.ts` has been temporarily restored to resolve a critical issue. The refactoring of `process_ae_obj__*_props()` functions will now proceed module by module, ensuring stability at each step. - **Update 2025-11-13:** `ae_core_functions.ts` has been temporarily restored to resolve a critical issue. The refactoring of `process_ae_obj__*_props()` functions will now proceed module by module, ensuring stability at each step.
### 2. Component Standardization ### 2. Component Standardization
@@ -65,21 +65,21 @@ This is a list of tasks to be completed before the next event/show/conference.
These functions are frequently used and critical to the application's data flow. Reviewing and cleaning them up will significantly improve the codebase. These functions are frequently used and critical to the application's data flow. Reviewing and cleaning them up will significantly improve the codebase.
1. **`get_ae_obj_li_for_obj_id_crud_v2()`** (from `src/lib/ae_api/api_get__crud_obj_li_v2.ts`) 1. **`get_ae_obj_li_for_obj_id_crud_v2()`** (from `src/lib/ae_api/api_get__crud_obj_li_v2.ts`)
- **Why:** This is the main function for fetching lists of data from the backend, used extensively across all modules. - **Why:** This is the main function for fetching lists of data from the backend, used extensively across all modules.
- **Cleanup:** Review parameters and return types for consistency, improve error handling, and add more detailed logging for debugging. - **Cleanup:** Review parameters and return types for consistency, improve error handling, and add more detailed logging for debugging.
2. **`db_save_ae_obj_li__ae_obj()`** (from `src/lib/ae_core/core__idb_dexie.ts`) 2. **`db_save_ae_obj_li__ae_obj()`** (from `src/lib/ae_core/core__idb_dexie.ts`)
- **Why:** This function is the single point of entry for saving data to the local Dexie database, critical for performance and reliability. - **Why:** This function is the single point of entry for saving data to the local Dexie database, critical for performance and reliability.
- **Cleanup:** Optimize for bulk operations, add robust error handling and logging, and ensure correct handling of updates to existing objects. - **Cleanup:** Optimize for bulk operations, add robust error handling and logging, and ensure correct handling of updates to existing objects.
3. **The `process_ae_obj__*_props()` family of functions** (e.g., `process_ae_obj__journal_props()` from `src/lib/ae_journals/ae_journals__journal.ts`) 3. **The `process_ae_obj__*_props()` family of functions** (e.g., `process_ae_obj__journal_props()` from `src/lib/ae_journals/ae_journals__journal.ts`)
- **Why:** These functions transform API data for the frontend and are a common source of bugs and inconsistencies. - **Why:** These functions transform API data for the frontend and are a common source of bugs and inconsistencies.
- **Cleanup:** Standardize their structure across all modules, ensure they are pure functions, and add unit tests for correctness. - **Cleanup:** Standardize their structure across all modules, ensure they are pure functions, and add unit tests for correctness.
- **Update 2025-11-13 (Temporary Rollback):** The previous refactoring of these functions has been temporarily rolled back due to an `InternalError`. `ae_core_functions.ts` has been restored. The new plan is to refactor these functions module by module, ensuring stability at each step. The generic CRUD functions in `core__crud_generic.ts` were simplified to remove data processing and caching, delegating those responsibilities to the module-specific functions. The deprecated `process_ae_obj__props` function in that file was left in place but is no longer used by the generic CRUD functions. - **Update 2025-11-13 (Temporary Rollback):** The previous refactoring of these functions has been temporarily rolled back due to an `InternalError`. `ae_core_functions.ts` has been restored. The new plan is to refactor these functions module by module, ensuring stability at each step. The generic CRUD functions in `core__crud_generic.ts` were simplified to remove data processing and caching, delegating those responsibilities to the module-specific functions. The deprecated `process_ae_obj__props` function in that file was left in place but is no longer used by the generic CRUD functions.
4. **Usage of `liveQuery` from Dexie** 4. **Usage of `liveQuery` from Dexie**
- **Why:** `liveQuery` is powerful for reactive UIs, but current usage suggests complexity and potential issues. - **Why:** `liveQuery` is powerful for reactive UIs, but current usage suggests complexity and potential issues.
- **Cleanup:** Review `liveQuery` usage throughout the application, simplify queries, and investigate reactivity issues. Consider wrapping `liveQuery` in a custom Svelte store for a more predictable interface. - **Cleanup:** Review `liveQuery` usage throughout the application, simplify queries, and investigate reactivity issues. Consider wrapping `liveQuery` in a custom Svelte store for a more predictable interface.
--- ---
@@ -99,8 +99,8 @@ These functions are frequently used and critical to the application's data flow.
- [ ] **Data:** Define the `Account` interface in a new file `src/lib/ae_core/core__account.ts`. - [ ] **Data:** Define the `Account` interface in a new file `src/lib/ae_core/core__account.ts`.
- [ ] **API:** Implement functions in `core__account.ts` for CRUD operations on accounts. - [ ] **API:** Implement functions in `core__account.ts` for CRUD operations on accounts.
- [ ] **UI:** - [ ] **UI:**
- [ ] Create a `+page.svelte` to list all accounts. - [ ] Create a `+page.svelte` to list all accounts.
- [ ] Create a `[account_id]` dynamic route to view and edit account details. - [ ] Create a `[account_id]` dynamic route to view and edit account details.
### 3. Site & Domain Management ### 3. Site & Domain Management
@@ -108,37 +108,37 @@ These functions are frequently used and critical to the application's data flow.
- [ ] **Data:** Define `Site` and `Site_Domain` interfaces in a new file `src/lib/ae_core/core__site.ts`. - [ ] **Data:** Define `Site` and `Site_Domain` interfaces in a new file `src/lib/ae_core/core__site.ts`.
- [ ] **API:** Implement functions in `core__site.ts` for CRUD operations on sites and domains. - [ ] **API:** Implement functions in `core__site.ts` for CRUD operations on sites and domains.
- [ ] **UI:** - [ ] **UI:**
- [ ] Create a `+page.svelte` to list all sites. - [ ] Create a `+page.svelte` to list all sites.
- [ ] Create a `[site_id]` dynamic route to view and edit site details and manage associated domains. - [ ] Create a `[site_id]` dynamic route to view and edit site details and manage associated domains.
### 4. Person Management ### 4. Person Management
- [ ] **Enhance:** Improve the existing person management components under `/core/person`. - [ ] **Enhance:** Improve the existing person management components under `/core/person`.
- [ ] **UI:** - [ ] **UI:**
- [ ] Create a dedicated page for creating new person records. - [ ] Create a dedicated page for creating new person records.
- [ ] Add search and filtering capabilities to the person list. - [ ] Add search and filtering capabilities to the person list.
### 5. User Management ### 5. User Management
- [ ] **Route:** Create a new route at `/core/users`. - [ ] **Route:** Create a new route at `/core/users`.
- [ ] **UI:** - [ ] **UI:**
- [ ] Create a `+page.svelte` to list all users. - [ ] Create a `+page.svelte` to list all users.
- [ ] Create a `[user_id]` dynamic route to view and edit user details, including permissions. - [ ] Create a `[user_id]` dynamic route to view and edit user details, including permissions.
- [ ] Implement a component to link users to person records. - [ ] Implement a component to link users to person records.
### 6. Hosted File Management ### 6. Hosted File Management
- [ ] **Route:** Create a new route at `/core/hosted_files`. - [ ] **Route:** Create a new route at `/core/hosted_files`.
- [ ] **UI:** - [ ] **UI:**
- [ ] Create a `+page.svelte` to list all hosted files with filters (e.g., by file type, uploader). - [ ] Create a `+page.svelte` to list all hosted files with filters (e.g., by file type, uploader).
- [ ] Implement a file viewer for common file types. - [ ] Implement a file viewer for common file types.
- [ ] Add functionality to upload new files and associate them with other objects (e.g., a person, a journal entry). - [ ] Add functionality to upload new files and associate them with other objects (e.g., a person, a journal entry).
### 7. Shared Lookup Lists ### 7. Shared Lookup Lists
- [ ] **Route:** Create a new route at `/core/lookups`. - [ ] **Route:** Create a new route at `/core/lookups`.
- [ ] **UI:** - [ ] **UI:**
- [ ] Create a simple UI to view and manage the shared lookup lists (e.g., `countries`, `time_zones`). - [ ] Create a simple UI to view and manage the shared lookup lists (e.g., `countries`, `time_zones`).
--- ---
@@ -157,9 +157,9 @@ These functions are frequently used and critical to the application's data flow.
- [ ] **Offline Support:** Improve offline capabilities by pre-fetching and caching more data. Review the current Dexie implementation for optimizations. - [ ] **Offline Support:** Improve offline capabilities by pre-fetching and caching more data. Review the current Dexie implementation for optimizations.
- [ ] **Search & Filtering:** Enhance the UI with more advanced search and filtering options for journals and entries (e.g., by date range, content, tags). - [ ] **Search & Filtering:** Enhance the UI with more advanced search and filtering options for journals and entries (e.g., by date range, content, tags).
- [ ] **User Experience (UX):** - [ ] **User Experience (UX):**
- Implement better loading indicators and skeleton loaders. - Implement better loading indicators and skeleton loaders.
- Provide clearer empty state messages (e.g., "No journals found, create one!"). - Provide clearer empty state messages (e.g., "No journals found, create one!").
- Improve error handling and provide more informative error messages to the user. - Improve error handling and provide more informative error messages to the user.
- [ ] **Encryption:** Review and enhance the encryption implementation for journal entries to ensure it is secure and user-friendly. - [ ] **Encryption:** Review and enhance the encryption implementation for journal entries to ensure it is secure and user-friendly.
- [ ] **Templates:** Fully implement and document the "templates" feature for creating new journals and entries. - [ ] **Templates:** Fully implement and document the "templates" feature for creating new journals and entries.
@@ -181,28 +181,28 @@ These functions are frequently used and critical to the application's data flow.
### Archives Module (`/idaa/archives`) ### Archives Module (`/idaa/archives`)
- [ ] **UI/UX:** - [ ] **UI/UX:**
- [ ] Add a loading indicator while archives are being fetched. - [ ] Add a loading indicator while archives are being fetched.
- [ ] Implement a more engaging "empty state" when no archives are available. - [ ] Implement a more engaging "empty state" when no archives are available.
- [ ] **Performance:** - [ ] **Performance:**
- [ ] Implement pagination or infinite scrolling for the archive list. - [ ] Implement pagination or infinite scrolling for the archive list.
### Bulletin Board Module (`/idaa/bb`) ### Bulletin Board Module (`/idaa/bb`)
- [ ] **UI/UX:** - [ ] **UI/UX:**
- [ ] Improve the UI for creating and editing posts and comments. - [ ] Improve the UI for creating and editing posts and comments.
- [x] Add a rich text editor for a better writing experience. - [x] Add a rich text editor for a better writing experience.
- [ ] **Features:** - [ ] **Features:**
- [ ] Implement user-specific features, such as editing their own posts and comments. - [ ] Implement user-specific features, such as editing their own posts and comments.
### Recovery Meetings Module (`/idaa/recovery_meetings`) ### Recovery Meetings Module (`/idaa/recovery_meetings`)
- [ ] **Refactoring:** - [ ] **Refactoring:**
- [ ] Simplify the search and filtering logic. The current implementation with `setInterval` is complex and could be replaced with a more modern approach using debouncing or reactive statements. - [ ] Simplify the search and filtering logic. The current implementation with `setInterval` is complex and could be replaced with a more modern approach using debouncing or reactive statements.
- [ ] **UI/UX:** - [ ] **UI/UX:**
- [ ] Make the search and filtering interface more intuitive and responsive. - [ ] Make the search and filtering interface more intuitive and responsive.
- [ ] Provide instant feedback to the user as they type in the search box. - [ ] Provide instant feedback to the user as they type in the search box.
- [ ] **Performance:** - [ ] **Performance:**
- [ ] Optimize the search query to be faster and more efficient. - [ ] Optimize the search query to be faster and more efficient.
--- ---
@@ -217,28 +217,28 @@ These functions are frequently used and critical to the application's data flow.
### Core Event Management ### Core Event Management
- [ ] **Event List (`/events`):** - [ ] **Event List (`/events`):**
- [ ] Add search and filtering capabilities to the main event list. - [ ] Add search and filtering capabilities to the main event list.
- [ ] Implement pagination for the event list. - [ ] Implement pagination for the event list.
- [ ] **Event Creation/Editing:** - [ ] **Event Creation/Editing:**
- [ ] Create a dedicated page or modal for creating and editing events. - [ ] Create a dedicated page or modal for creating and editing events.
### Sub-modules (`/events/[event_id]/...`) ### Sub-modules (`/events/[event_id]/...`)
- [ ] **Sessions, Presentations, Presenters, etc.:** - [ ] **Sessions, Presentations, Presenters, etc.:**
- [ ] For each sub-module (sessions, presentations, etc.), implement a consistent set of features: - [ ] For each sub-module (sessions, presentations, etc.), implement a consistent set of features:
- [ ] List view with search and filtering. - [ ] List view with search and filtering.
- [ ] Detail view. - [ ] Detail view.
- [ ] Create and edit forms. - [ ] Create and edit forms.
- [ ] Delete functionality with confirmation. - [ ] Delete functionality with confirmation.
- [ ] **File Management:** - [ ] **File Management:**
- [ ] Improve the file upload component (`ae_comp__event_files_upload.svelte`) with features like drag-and-drop and progress bars. - [ ] Improve the file upload component (`ae_comp__event_files_upload.svelte`) with features like drag-and-drop and progress bars.
- [ ] Enhance the file list view with more details and actions. - [ ] Enhance the file list view with more details and actions.
- [ ] \*\*Launcher (`/events/[event_id]/launcher`): - [ ] \*\*Launcher (`/events/[event_id]/launcher`):
- [ ] Add documentation to explain the purpose and usage of the launcher. - [ ] Add documentation to explain the purpose and usage of the launcher.
- [ ] Improve the UI to make it more intuitive for users. - [ ] Improve the UI to make it more intuitive for users.
- [ ] \*\*Badges (`/events/[event_id]/badges`): - [ ] \*\*Badges (`/events/[event_id]/badges`):
- [ ] Enhance the badge printing interface with more customization options. - [ ] Enhance the badge printing interface with more customization options.
- [ ] Add a preview of the badge before printing. - [ ] Add a preview of the badge before printing.
### Performance ### Performance
@@ -250,14 +250,14 @@ These functions are frequently used and critical to the application's data flow.
## UI/UX Consistency ## UI/UX Consistency
- [ ] **Broad UI/UX Review:** Conduct a comprehensive review of UI elements across the application to ensure consistency. This includes, but is not limited to: - [ ] **Broad UI/UX Review:** Conduct a comprehensive review of UI elements across the application to ensure consistency. This includes, but is not limited to:
- Buttons (style, placement, wording) - Buttons (style, placement, wording)
- Lists (style, actions) - Lists (style, actions)
- Links vs. Buttons (correct semantic usage) - Links vs. Buttons (correct semantic usage)
- Menus (style, options) - Menus (style, options)
- Debug components and other developer-facing UI. - Debug components and other developer-facing UI.
- **Wording:** Standardize the text used in common UI elements (e.g., "Save", "Cancel", "Delete", "Add New"). - **Wording:** Standardize the text used in common UI elements (e.g., "Save", "Cancel", "Delete", "Add New").
- **Scope:** This should be done on a per-module basis to ensure local consistency, with a goal of achieving global consistency where possible. - **Scope:** This should be done on a per-module basis to ensure local consistency, with a goal of achieving global consistency where possible.
- **Note on IDAA:** The `idaa` modules are semi-custom for a client and may have their own specific UI/UX requirements. Their consistency should be evaluated separately, keeping the client's needs in mind. - **Note on IDAA:** The `idaa` modules are semi-custom for a client and may have their own specific UI/UX requirements. Their consistency should be evaluated separately, keeping the client's needs in mind.
--- ---
@@ -280,81 +280,81 @@ These are just quick notes, thoughts, ideas, and reminders for myself.
### Events modules and main landing pages ### Events modules and main landing pages
- **Presentation Management** - **Presentation Management**
- Manage - Manage
- Session Search - Session Search
- View Session - View Session
- View Presenter - View Presenter
- Locations List - Locations List
- View Location - View Location
- Devices List - Devices List
- View Device - View Device
- Reports - Reports
- **Launcher** (desktop first; tablet second; mobile last) - **Launcher** (desktop first; tablet second; mobile last)
- Manage - Various admin and configuration options - Manage - Various admin and configuration options
- Menu Section - Event; Location; Sessions; Show/Hide - Menu Section - Event; Location; Sessions; Show/Hide
- Content Section - Shows session specific files; Shows session specific presentations; presentation specific presenters are shown per presentation; presenter specific files are shown per presenter - Content Section - Shows session specific files; Shows session specific presentations; presentation specific presenters are shown per presentation; presenter specific files are shown per presenter
- Header Section - Event Name; Location Name; Current Time; Offline/Online Status; Sync Status - Header Section - Event Name; Location Name; Current Time; Offline/Online Status; Sync Status
- Footer Section - Other status indicators; sync button - Footer Section - Other status indicators; sync button
- **Badge Printing** - **Badge Printing**
- Manage - Manage
- Print Badges - Print Badges
- View Badge (show full preview before printing) - View Badge (show full preview before printing)
- Review Badge (attendee confirms key info before printing; agree/disagree to terms; agree/disagree to lead retrieval and tracking) - Review Badge (attendee confirms key info before printing; agree/disagree to terms; agree/disagree to lead retrieval and tracking)
- Manually add Badge - Manually add Badge
- Reports - Reports
- **Lead Retrieval** - **Lead Retrieval**
- Manage - Manage
- View Leads - View Leads
- Add Lead (Scan or Manual Entry) - Add Lead (Scan or Manual Entry)
- License Management and Payment (Stripe) - License Management and Payment (Stripe)
- **Admin or Manage or Configure Event** - **Admin or Manage or Configure Event**
### New Directory Structure? ### New Directory Structure?
- src/lib/ - Shared libraries and components - src/lib/ - Shared libraries and components
- src/routes/core/ - Core Aether management module - src/routes/core/ - Core Aether management module
- sub-directories for: - sub-directories for:
- accounts - accounts
- account (by ID) - account (by ID)
- sites - sites
- site (by ID) - site (by ID)
- site_domains - site_domains
- site_domain (by ID) - site_domain (by ID)
- people - people
- person (by ID) - person (by ID)
- users - users
- user (by ID) - user (by ID)
- hosted_files - hosted_files
- hosted_file (by ID or partial hash match???) - hosted_file (by ID or partial hash match???)
- lookups - lookups
- (countries) - (countries)
- (state_provinces) - (state_provinces)
- (time_zones) - (time_zones)
- src/routes/events/ - Events main landing page and event management - src/routes/events/ - Events main landing page and event management
- src/routes/events/[event_id]/(presentations)/ - Event presentation management module - src/routes/events/[event_id]/(presentations)/ - Event presentation management module
- sub-directories for: - sub-directories for:
- sessions - sessions
- session (by ID or code) - session (by ID or code)
- presentations - presentations
- presenters - presenters
- presenter (by ID or code???) - presenter (by ID or code???)
- event_files - event_files
- locations - locations
- location (by ID or code) - location (by ID or code)
- devices - devices
- device (by ID or code) - device (by ID or code)
- reports - reports
- report (by name of report) - report (by name of report)
- src/routes/events/[event_id]/(launcher)/ - Event launcher module - src/routes/events/[event_id]/(launcher)/ - Event launcher module
- src/routes/events/[event_id]/(badges)/ - Event badge printing module - src/routes/events/[event_id]/(badges)/ - Event badge printing module
- src/routes/events/[event_id]/(leads)/ - Event lead retrieval module - src/routes/events/[event_id]/(leads)/ - Event lead retrieval module
- src/routes/events/[event_id]/+page.svelte - Event main dashboard - src/routes/events/[event_id]/+page.svelte - Event main dashboard
- [event_id]/exhibit/[exhibit_id]/ - Exhibitor specific lead retrieval pages - [event_id]/exhibit/[exhibit_id]/ - Exhibitor specific lead retrieval pages
- src/routes/journals/ - Journals module - src/routes/journals/ - Journals module
- src/routes/idaa/ - IDAA custom modules - src/routes/idaa/ - IDAA custom modules
- (archives)/ - Archives module - (archives)/ - Archives module
- (bb)/ - Bulletin Board module - (bb)/ - Bulletin Board module
- (recovery_meetings)/ - Recovery Meetings module - (recovery_meetings)/ - Recovery Meetings module
- src/lib/ae_core/ - Core Aether logic and data models - src/lib/ae_core/ - Core Aether logic and data models
- src/lib/ae_events/ - Events module logic and data models - src/lib/ae_events/ - Events module logic and data models
- src/lib/ae_journals/ - Journals module logic and data models - src/lib/ae_journals/ - Journals module logic and data models

View File

@@ -1,12 +1,12 @@
{ {
"folders": [ "folders": [
{ {
"path": "." "path": "."
} }
], ],
"settings": { "settings": {
"cSpell.words": ["filelist"], "cSpell.words": ["filelist"],
"git.autofetch": true, "git.autofetch": true,
"editor.defaultFormatter": "svelte.svelte-vscode" "editor.defaultFormatter": "svelte.svelte-vscode"
} }
} }

View File

@@ -1,17 +1,17 @@
{ {
"$schema": "https://next.shadcn-svelte.com/schema.json", "$schema": "https://next.shadcn-svelte.com/schema.json",
"style": "default", "style": "default",
"tailwind": { "tailwind": {
"config": "tailwind.config.ts", "config": "tailwind.config.ts",
"css": "src/app.css", "css": "src/app.css",
"baseColor": "gray" "baseColor": "gray"
}, },
"aliases": { "aliases": {
"components": "$lib/components", "components": "$lib/components",
"utils": "$lib/utils", "utils": "$lib/utils",
"ui": "$lib/components/ui", "ui": "$lib/components/ui",
"hooks": "$lib/hooks" "hooks": "$lib/hooks"
}, },
"typescript": true, "typescript": true,
"registry": "https://next.shadcn-svelte.com/registry" "registry": "https://next.shadcn-svelte.com/registry"
} }

View File

@@ -7,32 +7,32 @@ import prettier from 'eslint-config-prettier';
import globals from 'globals'; import globals from 'globals';
export default tseslint.config( export default tseslint.config(
eslint.configs.recommended, eslint.configs.recommended,
...tseslint.configs.recommended, ...tseslint.configs.recommended,
svelte.configs['flat/recommended'], svelte.configs['flat/recommended'],
prettier, prettier,
{ {
languageOptions: { languageOptions: {
globals: { globals: {
...globals.browser, ...globals.browser,
...globals.node ...globals.node
} }
} }
}, },
{ {
files: ['**/*.svelte'], files: ['**/*.svelte'],
languageOptions: { languageOptions: {
parserOptions: { parserOptions: {
parser: tseslint.parser parser: tseslint.parser
} }
} }
}, },
{ {
ignores: ['build/', '.svelte-kit/', 'node_modules/'] ignores: ['build/', '.svelte-kit/', 'node_modules/']
}, },
{ {
rules: { rules: {
'@typescript-eslint/no-unused-vars': 'warn' '@typescript-eslint/no-unused-vars': 'warn'
} }
} }
); );

View File

@@ -1,7 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"paths": { "paths": {
"$lib/*": ["./src/lib/*"] "$lib/*": ["./src/lib/*"]
} }
} }
} }

View File

@@ -1,102 +1,102 @@
{ {
"name": "osit-aether-app-svelte", "name": "osit-aether-app-svelte",
"version": "3.11.18", "version": "3.11.18",
"description": "One Sky IT's Aether App created with Svelte, SvelteKit, Tailwind CSS, Lucide, Font Awesome, and Skeleton UI. -Scott Idem", "description": "One Sky IT's Aether App created with Svelte, SvelteKit, Tailwind CSS, Lucide, Font Awesome, and Skeleton UI. -Scott Idem",
"homepage": "https://oneskyit.com/", "homepage": "https://oneskyit.com/",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",
"build": "vite build", "build": "vite build",
"build:prod": "cp .env.prod .env.production && vite build", "build:prod": "cp .env.prod .env.production && vite build",
"build:staging": "cp .env.staging .env.production && vite build", "build:staging": "cp .env.staging .env.production && vite build",
"preview": "vite preview", "preview": "vite preview",
"test": "npm run test:integration && npm run test:unit", "test": "npm run test:integration && npm run test:unit",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "prettier --check . && eslint .", "lint": "prettier --check . && eslint .",
"format": "prettier --write .", "format": "prettier --write .",
"test:integration": "playwright test", "test:integration": "playwright test",
"test:unit": "vitest" "test:unit": "vitest"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.39.1", "@eslint/js": "^9.39.1",
"@playwright/test": "^1.28.1", "@playwright/test": "^1.28.1",
"@skeletonlabs/skeleton": "^3.1.3", "@skeletonlabs/skeleton": "^3.1.3",
"@skeletonlabs/skeleton-svelte": "^1.2.3", "@skeletonlabs/skeleton-svelte": "^1.2.3",
"@sveltejs/adapter-auto": "^6.0.0", "@sveltejs/adapter-auto": "^6.0.0",
"@sveltejs/adapter-node": "^5.0.0", "@sveltejs/adapter-node": "^5.0.0",
"@sveltejs/adapter-static": "^3.0.1", "@sveltejs/adapter-static": "^3.0.1",
"@sveltejs/kit": "^2.5.0", "@sveltejs/kit": "^2.5.0",
"@sveltejs/vite-plugin-svelte": "^5.0.0", "@sveltejs/vite-plugin-svelte": "^5.0.0",
"@tailwindcss/forms": "^0.5.7", "@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.10", "@tailwindcss/typography": "^0.5.10",
"@types/eslint": "^9.0.0", "@types/eslint": "^9.0.0",
"@types/node": "^24.0.0", "@types/node": "^24.0.0",
"@types/qrcode": "^1.5.5", "@types/qrcode": "^1.5.5",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"bits-ui": "^2.0.0", "bits-ui": "^2.0.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"eslint": "^9.0.0", "eslint": "^9.0.0",
"eslint-config-prettier": "^10.0.0", "eslint-config-prettier": "^10.0.0",
"eslint-plugin-svelte": "^3.0.0", "eslint-plugin-svelte": "^3.0.0",
"flowbite": "^3.0.0", "flowbite": "^3.0.0",
"globals": "^16.5.0", "globals": "^16.5.0",
"highlight.js": "^11.10.0", "highlight.js": "^11.10.0",
"lowlight": "^3.2.0", "lowlight": "^3.2.0",
"mode-watcher": "^1.0.0", "mode-watcher": "^1.0.0",
"prettier": "^3.1.1", "prettier": "^3.1.1",
"prettier-plugin-svelte": "^3.1.2", "prettier-plugin-svelte": "^3.1.2",
"sass-embedded": "^1.81.0", "sass-embedded": "^1.81.0",
"svelte": "^5.0.0", "svelte": "^5.0.0",
"svelte-awesome-color-picker": "^4.0.0", "svelte-awesome-color-picker": "^4.0.0",
"svelte-check": "^4.0.0", "svelte-check": "^4.0.0",
"svelte-highlight": "^7.8.4", "svelte-highlight": "^7.8.4",
"svelte-idle": "^3.0.1", "svelte-idle": "^3.0.1",
"tailwind-merge": "^3.0.0", "tailwind-merge": "^3.0.0",
"tailwind-variants": "^2.1.0", "tailwind-variants": "^2.1.0",
"tailwindcss": "^4.1.10", "tailwindcss": "^4.1.10",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"tslib": "^2.4.1", "tslib": "^2.4.1",
"typescript": "^5.0.0", "typescript": "^5.0.0",
"typescript-svelte-plugin": "^0.3.50", "typescript-svelte-plugin": "^0.3.50",
"vite": "^6.0.0", "vite": "^6.0.0",
"vitest": "^3.0.0" "vitest": "^3.0.0"
}, },
"vitest": { "vitest": {
"exclude": [ "exclude": [
"tests" "tests"
] ]
}, },
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@codemirror/basic-setup": "^0.20.0", "@codemirror/basic-setup": "^0.20.0",
"@codemirror/commands": "^6.8.1", "@codemirror/commands": "^6.8.1",
"@codemirror/gutter": "^0.19.9", "@codemirror/gutter": "^0.19.9",
"@codemirror/lang-css": "^6.3.1", "@codemirror/lang-css": "^6.3.1",
"@codemirror/lang-html": "^6.4.9", "@codemirror/lang-html": "^6.4.9",
"@codemirror/lang-javascript": "^6.2.3", "@codemirror/lang-javascript": "^6.2.3",
"@codemirror/lang-json": "^6.0.1", "@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-markdown": "^6.3.2", "@codemirror/lang-markdown": "^6.3.2",
"@codemirror/language": "^6.11.0", "@codemirror/language": "^6.11.0",
"@codemirror/language-data": "^6.5.1", "@codemirror/language-data": "^6.5.1",
"@codemirror/theme-one-dark": "^6.1.2", "@codemirror/theme-one-dark": "^6.1.2",
"@codemirror/view": "^6.36.8", "@codemirror/view": "^6.36.8",
"@floating-ui/dom": "^1.6.0", "@floating-ui/dom": "^1.6.0",
"@lucide/svelte": "0.*.0", "@lucide/svelte": "0.*.0",
"@popperjs/core": "^2.11.0", "@popperjs/core": "^2.11.0",
"@tailwindcss/vite": "^4.1.10", "@tailwindcss/vite": "^4.1.10",
"axios": "^1.7.0", "axios": "^1.7.0",
"dayjs": "^1.11.10", "dayjs": "^1.11.10",
"dexie": "^4.0.0", "dexie": "^4.0.0",
"flowbite-svelte": "^1.7.0", "flowbite-svelte": "^1.7.0",
"html5-qrcode": "^2.3.8", "html5-qrcode": "^2.3.8",
"lucide-svelte": "0.*.0", "lucide-svelte": "0.*.0",
"marked": "^16.0.0", "marked": "^16.0.0",
"openai": "^5.20.1", "openai": "^5.20.1",
"qrcode": "^1.5.4", "qrcode": "^1.5.4",
"shadcn-svelte": "^1.0.0", "shadcn-svelte": "^1.0.0",
"svelte-persisted-store": "^0.12.0", "svelte-persisted-store": "^0.12.0",
"typescript-eslint": "^8.47.0" "typescript-eslint": "^8.47.0"
} }
} }

View File

@@ -1,23 +1,23 @@
import type { PlaywrightTestConfig } from '@playwright/test'; import type { PlaywrightTestConfig } from '@playwright/test';
const config: PlaywrightTestConfig = { const config: PlaywrightTestConfig = {
webServer: { webServer: {
command: 'npm run build && npm run preview', command: 'npm run build && npm run preview',
port: 4173 port: 4173
// url: 'http://scott.localhost:5173', // url: 'http://scott.localhost:5173',
// reuseExistingServer: true, // reuseExistingServer: true,
// stderr: 'pipe', // stderr: 'pipe',
// stdout: 'pipe', // stdout: 'pipe',
}, },
testDir: 'tests', testDir: 'tests',
testMatch: /(.+\.)?(test|spec)\.[jt]s/, testMatch: /(.+\.)?(test|spec)\.[jt]s/,
reporter: 'list', reporter: 'list',
use: { use: {
// Collect trace when retrying the failed test. // Collect trace when retrying the failed test.
trace: 'on-first-retry' trace: 'on-first-retry'
} }
// grep: /@node_modules/, // grep: /@node_modules/,
// grepInverse: /@node_modules/, // grepInverse: /@node_modules/,
}; };
export default config; export default config;

View File

@@ -1,166 +1,166 @@
[data-theme='AE_c_IDAA_light'] { [data-theme='AE_c_IDAA_light'] {
--text-scaling: 1.067; --text-scaling: 1.067;
--base-font-color: var(--color-surface-950); --base-font-color: var(--color-surface-950);
--base-font-family: system-ui, sans-serif; --base-font-family: system-ui, sans-serif;
--base-font-size: inherit; --base-font-size: inherit;
--base-line-height: inherit; --base-line-height: inherit;
--base-font-weight: normal; --base-font-weight: normal;
--base-font-style: normal; --base-font-style: normal;
--base-letter-spacing: 0em; --base-letter-spacing: 0em;
--heading-font-color: inherit; --heading-font-color: inherit;
--heading-font-family: inherit; --heading-font-family: inherit;
--heading-font-weight: bold; --heading-font-weight: bold;
--heading-font-style: normal; --heading-font-style: normal;
--heading-letter-spacing: inherit; --heading-letter-spacing: inherit;
--anchor-font-color: var(--color-primary-600); --anchor-font-color: var(--color-primary-600);
--anchor-font-family: inherit; --anchor-font-family: inherit;
--anchor-font-size: inherit; --anchor-font-size: inherit;
--anchor-line-height: inherit; --anchor-line-height: inherit;
--anchor-font-weight: inherit; --anchor-font-weight: inherit;
--anchor-font-style: inherit; --anchor-font-style: inherit;
--anchor-letter-spacing: inherit; --anchor-letter-spacing: inherit;
--anchor-text-decoration: none; --anchor-text-decoration: none;
--anchor-text-decoration-hover: underline; --anchor-text-decoration-hover: underline;
--anchor-text-decoration-active: none; --anchor-text-decoration-active: none;
--anchor-text-decoration-focus: none; --anchor-text-decoration-focus: none;
--spacing: 0.25rem; --spacing: 0.25rem;
--radius-base: 0.375rem; --radius-base: 0.375rem;
--radius-container: 0.75rem; --radius-container: 0.75rem;
--default-border-width: 1px; --default-border-width: 1px;
--default-divide-width: 1px; --default-divide-width: 1px;
--default-ring-width: 1px; --default-ring-width: 1px;
--body-background-color: var(--color-surface-50); --body-background-color: var(--color-surface-50);
--color-primary-50: oklch(85.73% 0.07 251.8deg); --color-primary-50: oklch(85.73% 0.07 251.8deg);
--color-primary-100: oklch(78.5% 0.09 252.03deg); --color-primary-100: oklch(78.5% 0.09 252.03deg);
--color-primary-200: oklch(71.06% 0.1 253.6deg); --color-primary-200: oklch(71.06% 0.1 253.6deg);
--color-primary-300: oklch(63.76% 0.12 253.85deg); --color-primary-300: oklch(63.76% 0.12 253.85deg);
--color-primary-400: oklch(56.32% 0.14 255.25deg); --color-primary-400: oklch(56.32% 0.14 255.25deg);
--color-primary-500: oklch(49.23% 0.15 256.36deg); --color-primary-500: oklch(49.23% 0.15 256.36deg);
--color-primary-600: oklch(43.11% 0.14 258.86deg); --color-primary-600: oklch(43.11% 0.14 258.86deg);
--color-primary-700: oklch(36.85% 0.14 261.54deg); --color-primary-700: oklch(36.85% 0.14 261.54deg);
--color-primary-800: oklch(30.41% 0.13 263.99deg); --color-primary-800: oklch(30.41% 0.13 263.99deg);
--color-primary-900: oklch(23.91% 0.12 265.91deg); --color-primary-900: oklch(23.91% 0.12 265.91deg);
--color-primary-950: oklch(16.96% 0.12 264.05deg); --color-primary-950: oklch(16.96% 0.12 264.05deg);
--color-primary-contrast-light: var(--color-primary-50); --color-primary-contrast-light: var(--color-primary-50);
--color-primary-contrast-500: var(--color-primary-contrast-light); --color-primary-contrast-500: var(--color-primary-contrast-light);
--color-primary-contrast-600: var(--color-primary-contrast-light); --color-primary-contrast-600: var(--color-primary-contrast-light);
--color-primary-contrast-700: var(--color-primary-contrast-light); --color-primary-contrast-700: var(--color-primary-contrast-light);
--color-primary-contrast-800: var(--color-primary-contrast-light); --color-primary-contrast-800: var(--color-primary-contrast-light);
--color-primary-contrast-900: var(--color-primary-contrast-light); --color-primary-contrast-900: var(--color-primary-contrast-light);
--color-primary-contrast-950: var(--color-primary-contrast-light); --color-primary-contrast-950: var(--color-primary-contrast-light);
--color-secondary-50: oklch(96.26% 0.06 196.24deg); --color-secondary-50: oklch(96.26% 0.06 196.24deg);
--color-secondary-100: oklch(89.14% 0.07 220.79deg); --color-secondary-100: oklch(89.14% 0.07 220.79deg);
--color-secondary-200: oklch(82.13% 0.08 234.87deg); --color-secondary-200: oklch(82.13% 0.08 234.87deg);
--color-secondary-300: oklch(75.03% 0.11 245.33deg); --color-secondary-300: oklch(75.03% 0.11 245.33deg);
--color-secondary-400: oklch(68.15% 0.14 250.72deg); --color-secondary-400: oklch(68.15% 0.14 250.72deg);
--color-secondary-500: oklch(61.37% 0.16 255.34deg); --color-secondary-500: oklch(61.37% 0.16 255.34deg);
--color-secondary-600: oklch(55.1% 0.16 256.81deg); --color-secondary-600: oklch(55.1% 0.16 256.81deg);
--color-secondary-700: oklch(48.64% 0.15 258.4deg); --color-secondary-700: oklch(48.64% 0.15 258.4deg);
--color-secondary-800: oklch(41.84% 0.15 260.39deg); --color-secondary-800: oklch(41.84% 0.15 260.39deg);
--color-secondary-900: oklch(35.05% 0.14 262.03deg); --color-secondary-900: oklch(35.05% 0.14 262.03deg);
--color-secondary-950: oklch(28.12% 0.14 262.47deg); --color-secondary-950: oklch(28.12% 0.14 262.47deg);
--color-secondary-contrast-light: var(--color-secondary-50); --color-secondary-contrast-light: var(--color-secondary-50);
--color-secondary-contrast-600: var(--color-secondary-contrast-light); --color-secondary-contrast-600: var(--color-secondary-contrast-light);
--color-secondary-contrast-700: var(--color-secondary-contrast-light); --color-secondary-contrast-700: var(--color-secondary-contrast-light);
--color-secondary-contrast-800: var(--color-secondary-contrast-light); --color-secondary-contrast-800: var(--color-secondary-contrast-light);
--color-secondary-contrast-900: var(--color-secondary-contrast-light); --color-secondary-contrast-900: var(--color-secondary-contrast-light);
--color-secondary-contrast-950: var(--color-secondary-contrast-light); --color-secondary-contrast-950: var(--color-secondary-contrast-light);
--color-tertiary-50: oklch(100% 0 none); --color-tertiary-50: oklch(100% 0 none);
--color-tertiary-100: oklch(96.07% 0.01 251.15deg); --color-tertiary-100: oklch(96.07% 0.01 251.15deg);
--color-tertiary-200: oklch(91.88% 0.03 252.69deg); --color-tertiary-200: oklch(91.88% 0.03 252.69deg);
--color-tertiary-300: oklch(87.99% 0.05 253.24deg); --color-tertiary-300: oklch(87.99% 0.05 253.24deg);
--color-tertiary-400: oklch(83.81% 0.06 253.57deg); --color-tertiary-400: oklch(83.81% 0.06 253.57deg);
--color-tertiary-500: oklch(79.93% 0.08 253.32deg); --color-tertiary-500: oklch(79.93% 0.08 253.32deg);
--color-tertiary-600: oklch(72.53% 0.08 251.75deg); --color-tertiary-600: oklch(72.53% 0.08 251.75deg);
--color-tertiary-700: oklch(64.93% 0.08 249.75deg); --color-tertiary-700: oklch(64.93% 0.08 249.75deg);
--color-tertiary-800: oklch(57.14% 0.09 247.99deg); --color-tertiary-800: oklch(57.14% 0.09 247.99deg);
--color-tertiary-900: oklch(49.18% 0.09 246.55deg); --color-tertiary-900: oklch(49.18% 0.09 246.55deg);
--color-tertiary-950: oklch(41.1% 0.09 246.54deg); --color-tertiary-950: oklch(41.1% 0.09 246.54deg);
--color-tertiary-contrast-light: var(--color-tertiary-50); --color-tertiary-contrast-light: var(--color-tertiary-50);
--color-tertiary-contrast-800: var(--color-tertiary-contrast-light); --color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-900: var(--color-tertiary-contrast-light); --color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-950: var(--color-tertiary-contrast-light); --color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
--color-success-50: oklch(95.82% 0.06 184.52deg); --color-success-50: oklch(95.82% 0.06 184.52deg);
--color-success-100: oklch(91.55% 0.08 172.29deg); --color-success-100: oklch(91.55% 0.08 172.29deg);
--color-success-200: oklch(87.44% 0.11 165.22deg); --color-success-200: oklch(87.44% 0.11 165.22deg);
--color-success-300: oklch(83.26% 0.13 161.2deg); --color-success-300: oklch(83.26% 0.13 161.2deg);
--color-success-400: oklch(79.56% 0.16 157.13deg); --color-success-400: oklch(79.56% 0.16 157.13deg);
--color-success-500: oklch(76.12% 0.18 153.61deg); --color-success-500: oklch(76.12% 0.18 153.61deg);
--color-success-600: oklch(69.31% 0.17 151.81deg); --color-success-600: oklch(69.31% 0.17 151.81deg);
--color-success-700: oklch(62.07% 0.16 149.95deg); --color-success-700: oklch(62.07% 0.16 149.95deg);
--color-success-800: oklch(54.9% 0.15 147.65deg); --color-success-800: oklch(54.9% 0.15 147.65deg);
--color-success-900: oklch(47.26% 0.14 145.54deg); --color-success-900: oklch(47.26% 0.14 145.54deg);
--color-success-950: oklch(39.64% 0.13 143.79deg); --color-success-950: oklch(39.64% 0.13 143.79deg);
--color-success-contrast-light: var(--color-success-50); --color-success-contrast-light: var(--color-success-50);
--color-success-contrast-800: var(--color-success-contrast-light); --color-success-contrast-800: var(--color-success-contrast-light);
--color-success-contrast-900: var(--color-success-contrast-light); --color-success-contrast-900: var(--color-success-contrast-light);
--color-success-contrast-950: var(--color-success-contrast-light); --color-success-contrast-950: var(--color-success-contrast-light);
--color-warning-50: oklch(98.26% 0.1 108.02deg); --color-warning-50: oklch(98.26% 0.1 108.02deg);
--color-warning-100: oklch(95.84% 0.12 104.66deg); --color-warning-100: oklch(95.84% 0.12 104.66deg);
--color-warning-200: oklch(93.48% 0.13 102.21deg); --color-warning-200: oklch(93.48% 0.13 102.21deg);
--color-warning-300: oklch(91.49% 0.15 100.17deg); --color-warning-300: oklch(91.49% 0.15 100.17deg);
--color-warning-400: oklch(89.28% 0.16 98.19deg); --color-warning-400: oklch(89.28% 0.16 98.19deg);
--color-warning-500: oklch(87.14% 0.17 96.01deg); --color-warning-500: oklch(87.14% 0.17 96.01deg);
--color-warning-600: oklch(79.88% 0.16 96.31deg); --color-warning-600: oklch(79.88% 0.16 96.31deg);
--color-warning-700: oklch(72.35% 0.14 95.62deg); --color-warning-700: oklch(72.35% 0.14 95.62deg);
--color-warning-800: oklch(64.73% 0.13 95.92deg); --color-warning-800: oklch(64.73% 0.13 95.92deg);
--color-warning-900: oklch(56.77% 0.11 94.87deg); --color-warning-900: oklch(56.77% 0.11 94.87deg);
--color-warning-950: oklch(48.63% 0.1 95.22deg); --color-warning-950: oklch(48.63% 0.1 95.22deg);
--color-warning-contrast-light: var(--color-warning-50); --color-warning-contrast-light: var(--color-warning-50);
--color-warning-contrast-800: var(--color-warning-contrast-light); --color-warning-contrast-800: var(--color-warning-contrast-light);
--color-warning-contrast-900: var(--color-warning-contrast-light); --color-warning-contrast-900: var(--color-warning-contrast-light);
--color-warning-contrast-950: var(--color-warning-contrast-light); --color-warning-contrast-950: var(--color-warning-contrast-light);
--color-error-50: oklch(81.88% 0.1 38.14deg); --color-error-50: oklch(81.88% 0.1 38.14deg);
--color-error-100: oklch(75.88% 0.13 31.15deg); --color-error-100: oklch(75.88% 0.13 31.15deg);
--color-error-200: oklch(70.29% 0.16 27.32deg); --color-error-200: oklch(70.29% 0.16 27.32deg);
--color-error-300: oklch(65.15% 0.19 25.65deg); --color-error-300: oklch(65.15% 0.19 25.65deg);
--color-error-400: oklch(60.98% 0.21 25.56deg); --color-error-400: oklch(60.98% 0.21 25.56deg);
--color-error-500: oklch(57.86% 0.22 26.62deg); --color-error-500: oklch(57.86% 0.22 26.62deg);
--color-error-600: oklch(52.52% 0.2 26.86deg); --color-error-600: oklch(52.52% 0.2 26.86deg);
--color-error-700: oklch(46.81% 0.18 27.02deg); --color-error-700: oklch(46.81% 0.18 27.02deg);
--color-error-800: oklch(41.15% 0.16 27.63deg); --color-error-800: oklch(41.15% 0.16 27.63deg);
--color-error-900: oklch(35.01% 0.14 27.9deg); --color-error-900: oklch(35.01% 0.14 27.9deg);
--color-error-950: oklch(28.69% 0.12 29.23deg); --color-error-950: oklch(28.69% 0.12 29.23deg);
--color-error-contrast-light: var(--color-error-50); --color-error-contrast-light: var(--color-error-50);
--color-error-contrast-400: var(--color-error-contrast-light); --color-error-contrast-400: var(--color-error-contrast-light);
--color-error-contrast-500: var(--color-error-contrast-light); --color-error-contrast-500: var(--color-error-contrast-light);
--color-error-contrast-600: var(--color-error-contrast-light); --color-error-contrast-600: var(--color-error-contrast-light);
--color-error-contrast-700: var(--color-error-contrast-light); --color-error-contrast-700: var(--color-error-contrast-light);
--color-error-contrast-800: var(--color-error-contrast-light); --color-error-contrast-800: var(--color-error-contrast-light);
--color-error-contrast-900: var(--color-error-contrast-light); --color-error-contrast-900: var(--color-error-contrast-light);
--color-error-contrast-950: var(--color-error-contrast-light); --color-error-contrast-950: var(--color-error-contrast-light);
--color-surface-50: oklch(100% 0 none); --color-surface-50: oklch(100% 0 none);
--color-surface-100: oklch(93.98% 0 105.57deg); --color-surface-100: oklch(93.98% 0 105.57deg);
--color-surface-200: oklch(87.66% 0 67.88deg); --color-surface-200: oklch(87.66% 0 67.88deg);
--color-surface-300: oklch(81.35% 0 106.1deg); --color-surface-300: oklch(81.35% 0 106.1deg);
--color-surface-400: oklch(74.79% 0 84.45deg); --color-surface-400: oklch(74.79% 0 84.45deg);
--color-surface-500: oklch(68.29% 0 91.36deg); --color-surface-500: oklch(68.29% 0 91.36deg);
--color-surface-600: oklch(60.99% 0 91.38deg); --color-surface-600: oklch(60.99% 0 91.38deg);
--color-surface-700: oklch(53.5% 0 84.49deg); --color-surface-700: oklch(53.5% 0 84.49deg);
--color-surface-800: oklch(46.03% 0 91.43deg); --color-surface-800: oklch(46.03% 0 91.43deg);
--color-surface-900: oklch(37.94% 0 84.52deg); --color-surface-900: oklch(37.94% 0 84.52deg);
--color-surface-950: oklch(29.34% 0 84.54deg); --color-surface-950: oklch(29.34% 0 84.54deg);
--color-surface-contrast-light: var(--color-surface-50); --color-surface-contrast-light: var(--color-surface-50);
--color-surface-contrast-700: var(--color-surface-contrast-light); --color-surface-contrast-700: var(--color-surface-contrast-light);
--color-surface-contrast-800: var(--color-surface-contrast-light); --color-surface-contrast-800: var(--color-surface-contrast-light);
--color-surface-contrast-900: var(--color-surface-contrast-light); --color-surface-contrast-900: var(--color-surface-contrast-light);
--color-surface-contrast-950: var(--color-surface-contrast-light); --color-surface-contrast-950: var(--color-surface-contrast-light);
} }

View File

@@ -1,205 +1,205 @@
[data-theme='AE_c_LCI'] { [data-theme='AE_c_LCI'] {
--text-scaling: 1.067; --text-scaling: 1.067;
--base-font-color: var(--color-surface-950); --base-font-color: var(--color-surface-950);
--base-font-color-dark: var(--color-surface-50); --base-font-color-dark: var(--color-surface-50);
--base-font-family: system-ui, sans-serif; --base-font-family: system-ui, sans-serif;
--base-font-size: inherit; --base-font-size: inherit;
--base-line-height: inherit; --base-line-height: inherit;
--base-font-weight: normal; --base-font-weight: normal;
--base-font-style: normal; --base-font-style: normal;
--base-letter-spacing: 0em; --base-letter-spacing: 0em;
--heading-font-color: inherit; --heading-font-color: inherit;
--heading-font-color-dark: inherit; --heading-font-color-dark: inherit;
--heading-font-family: inherit; --heading-font-family: inherit;
--heading-font-weight: bold; --heading-font-weight: bold;
--heading-font-style: normal; --heading-font-style: normal;
--heading-letter-spacing: inherit; --heading-letter-spacing: inherit;
--anchor-font-color: var(--color-primary-500); --anchor-font-color: var(--color-primary-500);
--anchor-font-color-dark: var(--color-primary-500); --anchor-font-color-dark: var(--color-primary-500);
--anchor-font-family: inherit; --anchor-font-family: inherit;
--anchor-font-size: inherit; --anchor-font-size: inherit;
--anchor-line-height: inherit; --anchor-line-height: inherit;
--anchor-font-weight: inherit; --anchor-font-weight: inherit;
--anchor-font-style: inherit; --anchor-font-style: inherit;
--anchor-letter-spacing: inherit; --anchor-letter-spacing: inherit;
--anchor-text-decoration: none; --anchor-text-decoration: none;
--anchor-text-decoration-hover: underline; --anchor-text-decoration-hover: underline;
--anchor-text-decoration-active: none; --anchor-text-decoration-active: none;
--anchor-text-decoration-focus: none; --anchor-text-decoration-focus: none;
--spacing: 0.25rem; --spacing: 0.25rem;
--radius-base: 0.375rem; --radius-base: 0.375rem;
--radius-container: 0.75rem; --radius-container: 0.75rem;
--default-border-width: 1px; --default-border-width: 1px;
--default-divide-width: 1px; --default-divide-width: 1px;
--default-ring-width: 1px; --default-ring-width: 1px;
--body-background-color: var(--color-surface-50); --body-background-color: var(--color-surface-50);
--body-background-color-dark: var(--color-surface-950); --body-background-color-dark: var(--color-surface-950);
--color-primary-50: oklch(85.1% 0.07 265.19deg); --color-primary-50: oklch(85.1% 0.07 265.19deg);
--color-primary-100: oklch(77.89% 0.08 264.31deg); --color-primary-100: oklch(77.89% 0.08 264.31deg);
--color-primary-200: oklch(70.32% 0.08 264.44deg); --color-primary-200: oklch(70.32% 0.08 264.44deg);
--color-primary-300: oklch(62.86% 0.09 263.87deg); --color-primary-300: oklch(62.86% 0.09 263.87deg);
--color-primary-400: oklch(54.96% 0.1 263.8deg); --color-primary-400: oklch(54.96% 0.1 263.8deg);
--color-primary-500: oklch(47.12% 0.11 262.88deg); --color-primary-500: oklch(47.12% 0.11 262.88deg);
--color-primary-600: oklch(40.9% 0.1 264.73deg); --color-primary-600: oklch(40.9% 0.1 264.73deg);
--color-primary-700: oklch(34.53% 0.1 267.34deg); --color-primary-700: oklch(34.53% 0.1 267.34deg);
--color-primary-800: oklch(28.16% 0.09 268.81deg); --color-primary-800: oklch(28.16% 0.09 268.81deg);
--color-primary-900: oklch(21.29% 0.09 271.12deg); --color-primary-900: oklch(21.29% 0.09 271.12deg);
--color-primary-950: oklch(12.88% 0.09 264.05deg); --color-primary-950: oklch(12.88% 0.09 264.05deg);
--color-primary-contrast-dark: var(--color-primary-950); --color-primary-contrast-dark: var(--color-primary-950);
--color-primary-contrast-light: var(--color-primary-50); --color-primary-contrast-light: var(--color-primary-50);
--color-primary-contrast-50: var(--color-primary-contrast-dark); --color-primary-contrast-50: var(--color-primary-contrast-dark);
--color-primary-contrast-100: var(--color-primary-contrast-dark); --color-primary-contrast-100: var(--color-primary-contrast-dark);
--color-primary-contrast-200: var(--color-primary-contrast-dark); --color-primary-contrast-200: var(--color-primary-contrast-dark);
--color-primary-contrast-300: var(--color-primary-contrast-dark); --color-primary-contrast-300: var(--color-primary-contrast-dark);
--color-primary-contrast-400: var(--color-primary-contrast-dark); --color-primary-contrast-400: var(--color-primary-contrast-dark);
--color-primary-contrast-500: var(--color-primary-contrast-light); --color-primary-contrast-500: var(--color-primary-contrast-light);
--color-primary-contrast-600: var(--color-primary-contrast-light); --color-primary-contrast-600: var(--color-primary-contrast-light);
--color-primary-contrast-700: var(--color-primary-contrast-light); --color-primary-contrast-700: var(--color-primary-contrast-light);
--color-primary-contrast-800: var(--color-primary-contrast-light); --color-primary-contrast-800: var(--color-primary-contrast-light);
--color-primary-contrast-900: var(--color-primary-contrast-light); --color-primary-contrast-900: var(--color-primary-contrast-light);
--color-primary-contrast-950: var(--color-primary-contrast-light); --color-primary-contrast-950: var(--color-primary-contrast-light);
--color-secondary-50: oklch(96.14% 0.06 196.21deg); --color-secondary-50: oklch(96.14% 0.06 196.21deg);
--color-secondary-100: oklch(89.81% 0.07 212.45deg); --color-secondary-100: oklch(89.81% 0.07 212.45deg);
--color-secondary-200: oklch(83.71% 0.08 223.06deg); --color-secondary-200: oklch(83.71% 0.08 223.06deg);
--color-secondary-300: oklch(77.42% 0.1 231.73deg); --color-secondary-300: oklch(77.42% 0.1 231.73deg);
--color-secondary-400: oklch(71.44% 0.12 237.59deg); --color-secondary-400: oklch(71.44% 0.12 237.59deg);
--color-secondary-500: oklch(65.39% 0.14 243.22deg); --color-secondary-500: oklch(65.39% 0.14 243.22deg);
--color-secondary-600: oklch(58.93% 0.13 245.07deg); --color-secondary-600: oklch(58.93% 0.13 245.07deg);
--color-secondary-700: oklch(52.09% 0.12 248.03deg); --color-secondary-700: oklch(52.09% 0.12 248.03deg);
--color-secondary-800: oklch(45.27% 0.12 250.54deg); --color-secondary-800: oklch(45.27% 0.12 250.54deg);
--color-secondary-900: oklch(38.01% 0.11 254.24deg); --color-secondary-900: oklch(38.01% 0.11 254.24deg);
--color-secondary-950: oklch(30.67% 0.11 256.73deg); --color-secondary-950: oklch(30.67% 0.11 256.73deg);
--color-secondary-contrast-dark: var(--color-secondary-950); --color-secondary-contrast-dark: var(--color-secondary-950);
--color-secondary-contrast-light: var(--color-secondary-50); --color-secondary-contrast-light: var(--color-secondary-50);
--color-secondary-contrast-50: var(--color-secondary-contrast-dark); --color-secondary-contrast-50: var(--color-secondary-contrast-dark);
--color-secondary-contrast-100: var(--color-secondary-contrast-dark); --color-secondary-contrast-100: var(--color-secondary-contrast-dark);
--color-secondary-contrast-200: var(--color-secondary-contrast-dark); --color-secondary-contrast-200: var(--color-secondary-contrast-dark);
--color-secondary-contrast-300: var(--color-secondary-contrast-dark); --color-secondary-contrast-300: var(--color-secondary-contrast-dark);
--color-secondary-contrast-400: var(--color-secondary-contrast-dark); --color-secondary-contrast-400: var(--color-secondary-contrast-dark);
--color-secondary-contrast-500: var(--color-secondary-contrast-dark); --color-secondary-contrast-500: var(--color-secondary-contrast-dark);
--color-secondary-contrast-600: var(--color-secondary-contrast-dark); --color-secondary-contrast-600: var(--color-secondary-contrast-dark);
--color-secondary-contrast-700: var(--color-secondary-contrast-light); --color-secondary-contrast-700: var(--color-secondary-contrast-light);
--color-secondary-contrast-800: var(--color-secondary-contrast-light); --color-secondary-contrast-800: var(--color-secondary-contrast-light);
--color-secondary-contrast-900: var(--color-secondary-contrast-light); --color-secondary-contrast-900: var(--color-secondary-contrast-light);
--color-secondary-contrast-950: var(--color-secondary-contrast-light); --color-secondary-contrast-950: var(--color-secondary-contrast-light);
--color-tertiary-50: oklch(87.75% 0.12 326.52deg); --color-tertiary-50: oklch(87.75% 0.12 326.52deg);
--color-tertiary-100: oklch(80.92% 0.13 323.93deg); --color-tertiary-100: oklch(80.92% 0.13 323.93deg);
--color-tertiary-200: oklch(73.87% 0.14 321.55deg); --color-tertiary-200: oklch(73.87% 0.14 321.55deg);
--color-tertiary-300: oklch(66.9% 0.15 319.41deg); --color-tertiary-300: oklch(66.9% 0.15 319.41deg);
--color-tertiary-400: oklch(59.72% 0.16 317.25deg); --color-tertiary-400: oklch(59.72% 0.16 317.25deg);
--color-tertiary-500: oklch(52.73% 0.17 315.13deg); --color-tertiary-500: oklch(52.73% 0.17 315.13deg);
--color-tertiary-600: oklch(46.6% 0.16 314.18deg); --color-tertiary-600: oklch(46.6% 0.16 314.18deg);
--color-tertiary-700: oklch(40.43% 0.14 312.8deg); --color-tertiary-700: oklch(40.43% 0.14 312.8deg);
--color-tertiary-800: oklch(33.85% 0.13 309.88deg); --color-tertiary-800: oklch(33.85% 0.13 309.88deg);
--color-tertiary-900: oklch(27.23% 0.12 306.83deg); --color-tertiary-900: oklch(27.23% 0.12 306.83deg);
--color-tertiary-950: oklch(19.83% 0.1 302.7deg); --color-tertiary-950: oklch(19.83% 0.1 302.7deg);
--color-tertiary-contrast-dark: var(--color-tertiary-950); --color-tertiary-contrast-dark: var(--color-tertiary-950);
--color-tertiary-contrast-light: var(--color-tertiary-50); --color-tertiary-contrast-light: var(--color-tertiary-50);
--color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-400: var(--color-tertiary-contrast-light); --color-tertiary-contrast-400: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-500: var(--color-tertiary-contrast-light); --color-tertiary-contrast-500: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-600: var(--color-tertiary-contrast-light); --color-tertiary-contrast-600: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-700: var(--color-tertiary-contrast-light); --color-tertiary-contrast-700: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-800: var(--color-tertiary-contrast-light); --color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-900: var(--color-tertiary-contrast-light); --color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-950: var(--color-tertiary-contrast-light); --color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
--color-success-50: oklch(95.23% 0.07 195.99deg); --color-success-50: oklch(95.23% 0.07 195.99deg);
--color-success-100: oklch(90.22% 0.09 189.46deg); --color-success-100: oklch(90.22% 0.09 189.46deg);
--color-success-200: oklch(85.11% 0.1 186.03deg); --color-success-200: oklch(85.11% 0.1 186.03deg);
--color-success-300: oklch(80.35% 0.12 181.75deg); --color-success-300: oklch(80.35% 0.12 181.75deg);
--color-success-400: oklch(75.55% 0.12 178.92deg); --color-success-400: oklch(75.55% 0.12 178.92deg);
--color-success-500: oklch(71.19% 0.13 174.73deg); --color-success-500: oklch(71.19% 0.13 174.73deg);
--color-success-600: oklch(64.29% 0.12 173.65deg); --color-success-600: oklch(64.29% 0.12 173.65deg);
--color-success-700: oklch(57.46% 0.11 171.75deg); --color-success-700: oklch(57.46% 0.11 171.75deg);
--color-success-800: oklch(50.18% 0.1 170.68deg); --color-success-800: oklch(50.18% 0.1 170.68deg);
--color-success-900: oklch(42.87% 0.09 167.65deg); --color-success-900: oklch(42.87% 0.09 167.65deg);
--color-success-950: oklch(34.91% 0.07 164.42deg); --color-success-950: oklch(34.91% 0.07 164.42deg);
--color-success-contrast-dark: var(--color-success-950); --color-success-contrast-dark: var(--color-success-950);
--color-success-contrast-light: var(--color-success-50); --color-success-contrast-light: var(--color-success-50);
--color-success-contrast-50: var(--color-success-contrast-dark); --color-success-contrast-50: var(--color-success-contrast-dark);
--color-success-contrast-100: var(--color-success-contrast-dark); --color-success-contrast-100: var(--color-success-contrast-dark);
--color-success-contrast-200: var(--color-success-contrast-dark); --color-success-contrast-200: var(--color-success-contrast-dark);
--color-success-contrast-300: var(--color-success-contrast-dark); --color-success-contrast-300: var(--color-success-contrast-dark);
--color-success-contrast-400: var(--color-success-contrast-dark); --color-success-contrast-400: var(--color-success-contrast-dark);
--color-success-contrast-500: var(--color-success-contrast-dark); --color-success-contrast-500: var(--color-success-contrast-dark);
--color-success-contrast-600: var(--color-success-contrast-dark); --color-success-contrast-600: var(--color-success-contrast-dark);
--color-success-contrast-700: var(--color-success-contrast-light); --color-success-contrast-700: var(--color-success-contrast-light);
--color-success-contrast-800: var(--color-success-contrast-light); --color-success-contrast-800: var(--color-success-contrast-light);
--color-success-contrast-900: var(--color-success-contrast-light); --color-success-contrast-900: var(--color-success-contrast-light);
--color-success-contrast-950: var(--color-success-contrast-light); --color-success-contrast-950: var(--color-success-contrast-light);
--color-warning-50: oklch(95.67% 0.05 84.56deg); --color-warning-50: oklch(95.67% 0.05 84.56deg);
--color-warning-100: oklch(92.83% 0.06 82.16deg); --color-warning-100: oklch(92.83% 0.06 82.16deg);
--color-warning-200: oklch(90.12% 0.08 80.33deg); --color-warning-200: oklch(90.12% 0.08 80.33deg);
--color-warning-300: oklch(87.59% 0.1 80.01deg); --color-warning-300: oklch(87.59% 0.1 80.01deg);
--color-warning-400: oklch(85.03% 0.12 78.35deg); --color-warning-400: oklch(85.03% 0.12 78.35deg);
--color-warning-500: oklch(82.46% 0.14 76.71deg); --color-warning-500: oklch(82.46% 0.14 76.71deg);
--color-warning-600: oklch(76.34% 0.13 72.25deg); --color-warning-600: oklch(76.34% 0.13 72.25deg);
--color-warning-700: oklch(70.34% 0.13 68.09deg); --color-warning-700: oklch(70.34% 0.13 68.09deg);
--color-warning-800: oklch(63.99% 0.13 63.18deg); --color-warning-800: oklch(63.99% 0.13 63.18deg);
--color-warning-900: oklch(57.91% 0.13 57.97deg); --color-warning-900: oklch(57.91% 0.13 57.97deg);
--color-warning-950: oklch(51.69% 0.13 51.44deg); --color-warning-950: oklch(51.69% 0.13 51.44deg);
--color-warning-contrast-dark: var(--color-warning-950); --color-warning-contrast-dark: var(--color-warning-950);
--color-warning-contrast-light: var(--color-warning-50); --color-warning-contrast-light: var(--color-warning-50);
--color-warning-contrast-50: var(--color-warning-contrast-dark); --color-warning-contrast-50: var(--color-warning-contrast-dark);
--color-warning-contrast-100: var(--color-warning-contrast-dark); --color-warning-contrast-100: var(--color-warning-contrast-dark);
--color-warning-contrast-200: var(--color-warning-contrast-dark); --color-warning-contrast-200: var(--color-warning-contrast-dark);
--color-warning-contrast-300: var(--color-warning-contrast-dark); --color-warning-contrast-300: var(--color-warning-contrast-dark);
--color-warning-contrast-400: var(--color-warning-contrast-dark); --color-warning-contrast-400: var(--color-warning-contrast-dark);
--color-warning-contrast-500: var(--color-warning-contrast-dark); --color-warning-contrast-500: var(--color-warning-contrast-dark);
--color-warning-contrast-600: var(--color-warning-contrast-light); --color-warning-contrast-600: var(--color-warning-contrast-light);
--color-warning-contrast-700: var(--color-warning-contrast-light); --color-warning-contrast-700: var(--color-warning-contrast-light);
--color-warning-contrast-800: var(--color-warning-contrast-light); --color-warning-contrast-800: var(--color-warning-contrast-light);
--color-warning-contrast-900: var(--color-warning-contrast-light); --color-warning-contrast-900: var(--color-warning-contrast-light);
--color-warning-contrast-950: var(--color-warning-contrast-light); --color-warning-contrast-950: var(--color-warning-contrast-light);
--color-error-50: oklch(84.29% 0.09 46.91deg); --color-error-50: oklch(84.29% 0.09 46.91deg);
--color-error-100: oklch(78.63% 0.12 39.19deg); --color-error-100: oklch(78.63% 0.12 39.19deg);
--color-error-200: oklch(72.92% 0.14 34.35deg); --color-error-200: oklch(72.92% 0.14 34.35deg);
--color-error-300: oklch(67.88% 0.17 31.48deg); --color-error-300: oklch(67.88% 0.17 31.48deg);
--color-error-400: oklch(63.09% 0.19 30.02deg); --color-error-400: oklch(63.09% 0.19 30.02deg);
--color-error-500: oklch(59.32% 0.21 29.47deg); --color-error-500: oklch(59.32% 0.21 29.47deg);
--color-error-600: oklch(53.56% 0.19 29.25deg); --color-error-600: oklch(53.56% 0.19 29.25deg);
--color-error-700: oklch(47.75% 0.17 29.2deg); --color-error-700: oklch(47.75% 0.17 29.2deg);
--color-error-800: oklch(41.51% 0.15 28.7deg); --color-error-800: oklch(41.51% 0.15 28.7deg);
--color-error-900: oklch(35.35% 0.14 28.7deg); --color-error-900: oklch(35.35% 0.14 28.7deg);
--color-error-950: oklch(28.69% 0.12 29.23deg); --color-error-950: oklch(28.69% 0.12 29.23deg);
--color-error-contrast-dark: var(--color-error-950); --color-error-contrast-dark: var(--color-error-950);
--color-error-contrast-light: var(--color-error-50); --color-error-contrast-light: var(--color-error-50);
--color-error-contrast-50: var(--color-error-contrast-dark); --color-error-contrast-50: var(--color-error-contrast-dark);
--color-error-contrast-100: var(--color-error-contrast-dark); --color-error-contrast-100: var(--color-error-contrast-dark);
--color-error-contrast-200: var(--color-error-contrast-dark); --color-error-contrast-200: var(--color-error-contrast-dark);
--color-error-contrast-300: var(--color-error-contrast-dark); --color-error-contrast-300: var(--color-error-contrast-dark);
--color-error-contrast-400: var(--color-error-contrast-dark); --color-error-contrast-400: var(--color-error-contrast-dark);
--color-error-contrast-500: var(--color-error-contrast-light); --color-error-contrast-500: var(--color-error-contrast-light);
--color-error-contrast-600: var(--color-error-contrast-light); --color-error-contrast-600: var(--color-error-contrast-light);
--color-error-contrast-700: var(--color-error-contrast-light); --color-error-contrast-700: var(--color-error-contrast-light);
--color-error-contrast-800: var(--color-error-contrast-light); --color-error-contrast-800: var(--color-error-contrast-light);
--color-error-contrast-900: var(--color-error-contrast-light); --color-error-contrast-900: var(--color-error-contrast-light);
--color-error-contrast-950: var(--color-error-contrast-light); --color-error-contrast-950: var(--color-error-contrast-light);
--color-surface-50: oklch(100% 0 none); --color-surface-50: oklch(100% 0 none);
--color-surface-100: oklch(97.02% 0 none); --color-surface-100: oklch(97.02% 0 none);
--color-surface-200: oklch(94.01% 0 none); --color-surface-200: oklch(94.01% 0 none);
--color-surface-300: oklch(91.12% 0 196.34deg); --color-surface-300: oklch(91.12% 0 196.34deg);
--color-surface-400: oklch(88.07% 0 196.37deg); --color-surface-400: oklch(88.07% 0 196.37deg);
--color-surface-500: oklch(84.99% 0 196.4deg); --color-surface-500: oklch(84.99% 0 196.4deg);
--color-surface-600: oklch(77.78% 0 196.47deg); --color-surface-600: oklch(77.78% 0 196.47deg);
--color-surface-700: oklch(70.09% 0 196.54deg); --color-surface-700: oklch(70.09% 0 196.54deg);
--color-surface-800: oklch(62.51% 0 196.61deg); --color-surface-800: oklch(62.51% 0 196.61deg);
--color-surface-900: oklch(54.34% 0 196.68deg); --color-surface-900: oklch(54.34% 0 196.68deg);
--color-surface-950: oklch(46.22% 0 196.73deg); --color-surface-950: oklch(46.22% 0 196.73deg);
--color-surface-contrast-dark: var(--color-surface-950); --color-surface-contrast-dark: var(--color-surface-950);
--color-surface-contrast-light: var(--color-surface-50); --color-surface-contrast-light: var(--color-surface-50);
--color-surface-contrast-50: var(--color-surface-contrast-dark); --color-surface-contrast-50: var(--color-surface-contrast-dark);
--color-surface-contrast-100: var(--color-surface-contrast-dark); --color-surface-contrast-100: var(--color-surface-contrast-dark);
--color-surface-contrast-200: var(--color-surface-contrast-dark); --color-surface-contrast-200: var(--color-surface-contrast-dark);
--color-surface-contrast-300: var(--color-surface-contrast-dark); --color-surface-contrast-300: var(--color-surface-contrast-dark);
--color-surface-contrast-400: var(--color-surface-contrast-dark); --color-surface-contrast-400: var(--color-surface-contrast-dark);
--color-surface-contrast-500: var(--color-surface-contrast-dark); --color-surface-contrast-500: var(--color-surface-contrast-dark);
--color-surface-contrast-600: var(--color-surface-contrast-dark); --color-surface-contrast-600: var(--color-surface-contrast-dark);
--color-surface-contrast-700: var(--color-surface-contrast-dark); --color-surface-contrast-700: var(--color-surface-contrast-dark);
--color-surface-contrast-800: var(--color-surface-contrast-dark); --color-surface-contrast-800: var(--color-surface-contrast-dark);
--color-surface-contrast-900: var(--color-surface-contrast-light); --color-surface-contrast-900: var(--color-surface-contrast-light);
--color-surface-contrast-950: var(--color-surface-contrast-light); --color-surface-contrast-950: var(--color-surface-contrast-light);
} }

View File

@@ -1,205 +1,205 @@
[data-theme='AE_OSIT_default'] { [data-theme='AE_OSIT_default'] {
--text-scaling: 1.067; --text-scaling: 1.067;
--base-font-color: var(--color-surface-950); --base-font-color: var(--color-surface-950);
--base-font-color-dark: var(--color-surface-50); --base-font-color-dark: var(--color-surface-50);
--base-font-family: system-ui, sans-serif; --base-font-family: system-ui, sans-serif;
--base-font-size: inherit; --base-font-size: inherit;
--base-line-height: inherit; --base-line-height: inherit;
--base-font-weight: normal; --base-font-weight: normal;
--base-font-style: normal; --base-font-style: normal;
--base-letter-spacing: 0em; --base-letter-spacing: 0em;
--heading-font-color: inherit; --heading-font-color: inherit;
--heading-font-color-dark: inherit; --heading-font-color-dark: inherit;
--heading-font-family: inherit; --heading-font-family: inherit;
--heading-font-weight: bold; --heading-font-weight: bold;
--heading-font-style: normal; --heading-font-style: normal;
--heading-letter-spacing: inherit; --heading-letter-spacing: inherit;
--anchor-font-color: var(--color-primary-600); --anchor-font-color: var(--color-primary-600);
--anchor-font-color-dark: var(--color-primary-400); --anchor-font-color-dark: var(--color-primary-400);
--anchor-font-family: inherit; --anchor-font-family: inherit;
--anchor-font-size: inherit; --anchor-font-size: inherit;
--anchor-line-height: inherit; --anchor-line-height: inherit;
--anchor-font-weight: inherit; --anchor-font-weight: inherit;
--anchor-font-style: inherit; --anchor-font-style: inherit;
--anchor-letter-spacing: inherit; --anchor-letter-spacing: inherit;
--anchor-text-decoration: none; --anchor-text-decoration: none;
--anchor-text-decoration-hover: underline; --anchor-text-decoration-hover: underline;
--anchor-text-decoration-active: none; --anchor-text-decoration-active: none;
--anchor-text-decoration-focus: none; --anchor-text-decoration-focus: none;
--spacing: 0.25rem; --spacing: 0.25rem;
--radius-base: 0.375rem; --radius-base: 0.375rem;
--radius-container: 0.75rem; --radius-container: 0.75rem;
--default-border-width: 1px; --default-border-width: 1px;
--default-divide-width: 1px; --default-divide-width: 1px;
--default-ring-width: 1px; --default-ring-width: 1px;
--body-background-color: var(--color-surface-50); --body-background-color: var(--color-surface-50);
--body-background-color-dark: var(--color-surface-950); --body-background-color-dark: var(--color-surface-950);
--color-primary-50: oklch(85.73% 0.07 251.8deg); --color-primary-50: oklch(85.73% 0.07 251.8deg);
--color-primary-100: oklch(78.5% 0.09 252.03deg); --color-primary-100: oklch(78.5% 0.09 252.03deg);
--color-primary-200: oklch(71.06% 0.1 253.6deg); --color-primary-200: oklch(71.06% 0.1 253.6deg);
--color-primary-300: oklch(63.76% 0.12 253.85deg); --color-primary-300: oklch(63.76% 0.12 253.85deg);
--color-primary-400: oklch(56.32% 0.14 255.25deg); --color-primary-400: oklch(56.32% 0.14 255.25deg);
--color-primary-500: oklch(49.23% 0.15 256.36deg); --color-primary-500: oklch(49.23% 0.15 256.36deg);
--color-primary-600: oklch(43.11% 0.14 258.86deg); --color-primary-600: oklch(43.11% 0.14 258.86deg);
--color-primary-700: oklch(36.85% 0.14 261.54deg); --color-primary-700: oklch(36.85% 0.14 261.54deg);
--color-primary-800: oklch(30.41% 0.13 263.99deg); --color-primary-800: oklch(30.41% 0.13 263.99deg);
--color-primary-900: oklch(23.91% 0.12 265.91deg); --color-primary-900: oklch(23.91% 0.12 265.91deg);
--color-primary-950: oklch(16.96% 0.12 264.05deg); --color-primary-950: oklch(16.96% 0.12 264.05deg);
--color-primary-contrast-dark: var(--color-primary-950); --color-primary-contrast-dark: var(--color-primary-950);
--color-primary-contrast-light: var(--color-primary-50); --color-primary-contrast-light: var(--color-primary-50);
--color-primary-contrast-50: var(--color-primary-contrast-dark); --color-primary-contrast-50: var(--color-primary-contrast-dark);
--color-primary-contrast-100: var(--color-primary-contrast-dark); --color-primary-contrast-100: var(--color-primary-contrast-dark);
--color-primary-contrast-200: var(--color-primary-contrast-dark); --color-primary-contrast-200: var(--color-primary-contrast-dark);
--color-primary-contrast-300: var(--color-primary-contrast-dark); --color-primary-contrast-300: var(--color-primary-contrast-dark);
--color-primary-contrast-400: var(--color-primary-contrast-dark); --color-primary-contrast-400: var(--color-primary-contrast-dark);
--color-primary-contrast-500: var(--color-primary-contrast-light); --color-primary-contrast-500: var(--color-primary-contrast-light);
--color-primary-contrast-600: var(--color-primary-contrast-light); --color-primary-contrast-600: var(--color-primary-contrast-light);
--color-primary-contrast-700: var(--color-primary-contrast-light); --color-primary-contrast-700: var(--color-primary-contrast-light);
--color-primary-contrast-800: var(--color-primary-contrast-light); --color-primary-contrast-800: var(--color-primary-contrast-light);
--color-primary-contrast-900: var(--color-primary-contrast-light); --color-primary-contrast-900: var(--color-primary-contrast-light);
--color-primary-contrast-950: var(--color-primary-contrast-light); --color-primary-contrast-950: var(--color-primary-contrast-light);
--color-secondary-50: oklch(96.26% 0.06 196.24deg); --color-secondary-50: oklch(96.26% 0.06 196.24deg);
--color-secondary-100: oklch(89.14% 0.07 220.79deg); --color-secondary-100: oklch(89.14% 0.07 220.79deg);
--color-secondary-200: oklch(82.13% 0.08 234.87deg); --color-secondary-200: oklch(82.13% 0.08 234.87deg);
--color-secondary-300: oklch(75.03% 0.11 245.33deg); --color-secondary-300: oklch(75.03% 0.11 245.33deg);
--color-secondary-400: oklch(68.15% 0.14 250.72deg); --color-secondary-400: oklch(68.15% 0.14 250.72deg);
--color-secondary-500: oklch(61.37% 0.16 255.34deg); --color-secondary-500: oklch(61.37% 0.16 255.34deg);
--color-secondary-600: oklch(55.1% 0.16 256.81deg); --color-secondary-600: oklch(55.1% 0.16 256.81deg);
--color-secondary-700: oklch(48.64% 0.15 258.4deg); --color-secondary-700: oklch(48.64% 0.15 258.4deg);
--color-secondary-800: oklch(41.84% 0.15 260.39deg); --color-secondary-800: oklch(41.84% 0.15 260.39deg);
--color-secondary-900: oklch(35.05% 0.14 262.03deg); --color-secondary-900: oklch(35.05% 0.14 262.03deg);
--color-secondary-950: oklch(28.12% 0.14 262.47deg); --color-secondary-950: oklch(28.12% 0.14 262.47deg);
--color-secondary-contrast-dark: var(--color-secondary-950); --color-secondary-contrast-dark: var(--color-secondary-950);
--color-secondary-contrast-light: var(--color-secondary-50); --color-secondary-contrast-light: var(--color-secondary-50);
--color-secondary-contrast-50: var(--color-secondary-contrast-dark); --color-secondary-contrast-50: var(--color-secondary-contrast-dark);
--color-secondary-contrast-100: var(--color-secondary-contrast-dark); --color-secondary-contrast-100: var(--color-secondary-contrast-dark);
--color-secondary-contrast-200: var(--color-secondary-contrast-dark); --color-secondary-contrast-200: var(--color-secondary-contrast-dark);
--color-secondary-contrast-300: var(--color-secondary-contrast-dark); --color-secondary-contrast-300: var(--color-secondary-contrast-dark);
--color-secondary-contrast-400: var(--color-secondary-contrast-dark); --color-secondary-contrast-400: var(--color-secondary-contrast-dark);
--color-secondary-contrast-500: var(--color-secondary-contrast-dark); --color-secondary-contrast-500: var(--color-secondary-contrast-dark);
--color-secondary-contrast-600: var(--color-secondary-contrast-light); --color-secondary-contrast-600: var(--color-secondary-contrast-light);
--color-secondary-contrast-700: var(--color-secondary-contrast-light); --color-secondary-contrast-700: var(--color-secondary-contrast-light);
--color-secondary-contrast-800: var(--color-secondary-contrast-light); --color-secondary-contrast-800: var(--color-secondary-contrast-light);
--color-secondary-contrast-900: var(--color-secondary-contrast-light); --color-secondary-contrast-900: var(--color-secondary-contrast-light);
--color-secondary-contrast-950: var(--color-secondary-contrast-light); --color-secondary-contrast-950: var(--color-secondary-contrast-light);
--color-tertiary-50: oklch(100% 0 none); --color-tertiary-50: oklch(100% 0 none);
--color-tertiary-100: oklch(96.07% 0.01 251.15deg); --color-tertiary-100: oklch(96.07% 0.01 251.15deg);
--color-tertiary-200: oklch(91.88% 0.03 252.69deg); --color-tertiary-200: oklch(91.88% 0.03 252.69deg);
--color-tertiary-300: oklch(87.99% 0.05 253.24deg); --color-tertiary-300: oklch(87.99% 0.05 253.24deg);
--color-tertiary-400: oklch(83.81% 0.06 253.57deg); --color-tertiary-400: oklch(83.81% 0.06 253.57deg);
--color-tertiary-500: oklch(79.93% 0.08 253.32deg); --color-tertiary-500: oklch(79.93% 0.08 253.32deg);
--color-tertiary-600: oklch(72.53% 0.08 251.75deg); --color-tertiary-600: oklch(72.53% 0.08 251.75deg);
--color-tertiary-700: oklch(64.93% 0.08 249.75deg); --color-tertiary-700: oklch(64.93% 0.08 249.75deg);
--color-tertiary-800: oklch(57.14% 0.09 247.99deg); --color-tertiary-800: oklch(57.14% 0.09 247.99deg);
--color-tertiary-900: oklch(49.18% 0.09 246.55deg); --color-tertiary-900: oklch(49.18% 0.09 246.55deg);
--color-tertiary-950: oklch(41.1% 0.09 246.54deg); --color-tertiary-950: oklch(41.1% 0.09 246.54deg);
--color-tertiary-contrast-dark: var(--color-tertiary-950); --color-tertiary-contrast-dark: var(--color-tertiary-950);
--color-tertiary-contrast-light: var(--color-tertiary-50); --color-tertiary-contrast-light: var(--color-tertiary-50);
--color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-700: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-700: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-800: var(--color-tertiary-contrast-light); --color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-900: var(--color-tertiary-contrast-light); --color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-950: var(--color-tertiary-contrast-light); --color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
--color-success-50: oklch(95.82% 0.06 184.52deg); --color-success-50: oklch(95.82% 0.06 184.52deg);
--color-success-100: oklch(91.55% 0.08 172.29deg); --color-success-100: oklch(91.55% 0.08 172.29deg);
--color-success-200: oklch(87.44% 0.11 165.22deg); --color-success-200: oklch(87.44% 0.11 165.22deg);
--color-success-300: oklch(83.26% 0.13 161.2deg); --color-success-300: oklch(83.26% 0.13 161.2deg);
--color-success-400: oklch(79.56% 0.16 157.13deg); --color-success-400: oklch(79.56% 0.16 157.13deg);
--color-success-500: oklch(76.12% 0.18 153.61deg); --color-success-500: oklch(76.12% 0.18 153.61deg);
--color-success-600: oklch(69.31% 0.17 151.81deg); --color-success-600: oklch(69.31% 0.17 151.81deg);
--color-success-700: oklch(62.07% 0.16 149.95deg); --color-success-700: oklch(62.07% 0.16 149.95deg);
--color-success-800: oklch(54.9% 0.15 147.65deg); --color-success-800: oklch(54.9% 0.15 147.65deg);
--color-success-900: oklch(47.26% 0.14 145.54deg); --color-success-900: oklch(47.26% 0.14 145.54deg);
--color-success-950: oklch(39.64% 0.13 143.79deg); --color-success-950: oklch(39.64% 0.13 143.79deg);
--color-success-contrast-dark: var(--color-success-950); --color-success-contrast-dark: var(--color-success-950);
--color-success-contrast-light: var(--color-success-50); --color-success-contrast-light: var(--color-success-50);
--color-success-contrast-50: var(--color-success-contrast-dark); --color-success-contrast-50: var(--color-success-contrast-dark);
--color-success-contrast-100: var(--color-success-contrast-dark); --color-success-contrast-100: var(--color-success-contrast-dark);
--color-success-contrast-200: var(--color-success-contrast-dark); --color-success-contrast-200: var(--color-success-contrast-dark);
--color-success-contrast-300: var(--color-success-contrast-dark); --color-success-contrast-300: var(--color-success-contrast-dark);
--color-success-contrast-400: var(--color-success-contrast-dark); --color-success-contrast-400: var(--color-success-contrast-dark);
--color-success-contrast-500: var(--color-success-contrast-dark); --color-success-contrast-500: var(--color-success-contrast-dark);
--color-success-contrast-600: var(--color-success-contrast-dark); --color-success-contrast-600: var(--color-success-contrast-dark);
--color-success-contrast-700: var(--color-success-contrast-dark); --color-success-contrast-700: var(--color-success-contrast-dark);
--color-success-contrast-800: var(--color-success-contrast-light); --color-success-contrast-800: var(--color-success-contrast-light);
--color-success-contrast-900: var(--color-success-contrast-light); --color-success-contrast-900: var(--color-success-contrast-light);
--color-success-contrast-950: var(--color-success-contrast-light); --color-success-contrast-950: var(--color-success-contrast-light);
--color-warning-50: oklch(98.26% 0.1 108.02deg); --color-warning-50: oklch(98.26% 0.1 108.02deg);
--color-warning-100: oklch(95.84% 0.12 104.66deg); --color-warning-100: oklch(95.84% 0.12 104.66deg);
--color-warning-200: oklch(93.48% 0.13 102.21deg); --color-warning-200: oklch(93.48% 0.13 102.21deg);
--color-warning-300: oklch(91.49% 0.15 100.17deg); --color-warning-300: oklch(91.49% 0.15 100.17deg);
--color-warning-400: oklch(89.28% 0.16 98.19deg); --color-warning-400: oklch(89.28% 0.16 98.19deg);
--color-warning-500: oklch(87.14% 0.17 96.01deg); --color-warning-500: oklch(87.14% 0.17 96.01deg);
--color-warning-600: oklch(79.88% 0.16 96.31deg); --color-warning-600: oklch(79.88% 0.16 96.31deg);
--color-warning-700: oklch(72.35% 0.14 95.62deg); --color-warning-700: oklch(72.35% 0.14 95.62deg);
--color-warning-800: oklch(64.73% 0.13 95.92deg); --color-warning-800: oklch(64.73% 0.13 95.92deg);
--color-warning-900: oklch(56.77% 0.11 94.87deg); --color-warning-900: oklch(56.77% 0.11 94.87deg);
--color-warning-950: oklch(48.63% 0.1 95.22deg); --color-warning-950: oklch(48.63% 0.1 95.22deg);
--color-warning-contrast-dark: var(--color-warning-950); --color-warning-contrast-dark: var(--color-warning-950);
--color-warning-contrast-light: var(--color-warning-50); --color-warning-contrast-light: var(--color-warning-50);
--color-warning-contrast-50: var(--color-warning-contrast-dark); --color-warning-contrast-50: var(--color-warning-contrast-dark);
--color-warning-contrast-100: var(--color-warning-contrast-dark); --color-warning-contrast-100: var(--color-warning-contrast-dark);
--color-warning-contrast-200: var(--color-warning-contrast-dark); --color-warning-contrast-200: var(--color-warning-contrast-dark);
--color-warning-contrast-300: var(--color-warning-contrast-dark); --color-warning-contrast-300: var(--color-warning-contrast-dark);
--color-warning-contrast-400: var(--color-warning-contrast-dark); --color-warning-contrast-400: var(--color-warning-contrast-dark);
--color-warning-contrast-500: var(--color-warning-contrast-dark); --color-warning-contrast-500: var(--color-warning-contrast-dark);
--color-warning-contrast-600: var(--color-warning-contrast-dark); --color-warning-contrast-600: var(--color-warning-contrast-dark);
--color-warning-contrast-700: var(--color-warning-contrast-dark); --color-warning-contrast-700: var(--color-warning-contrast-dark);
--color-warning-contrast-800: var(--color-warning-contrast-light); --color-warning-contrast-800: var(--color-warning-contrast-light);
--color-warning-contrast-900: var(--color-warning-contrast-light); --color-warning-contrast-900: var(--color-warning-contrast-light);
--color-warning-contrast-950: var(--color-warning-contrast-light); --color-warning-contrast-950: var(--color-warning-contrast-light);
--color-error-50: oklch(81.88% 0.1 38.14deg); --color-error-50: oklch(81.88% 0.1 38.14deg);
--color-error-100: oklch(75.88% 0.13 31.15deg); --color-error-100: oklch(75.88% 0.13 31.15deg);
--color-error-200: oklch(70.29% 0.16 27.32deg); --color-error-200: oklch(70.29% 0.16 27.32deg);
--color-error-300: oklch(65.15% 0.19 25.65deg); --color-error-300: oklch(65.15% 0.19 25.65deg);
--color-error-400: oklch(60.98% 0.21 25.56deg); --color-error-400: oklch(60.98% 0.21 25.56deg);
--color-error-500: oklch(57.86% 0.22 26.62deg); --color-error-500: oklch(57.86% 0.22 26.62deg);
--color-error-600: oklch(52.52% 0.2 26.86deg); --color-error-600: oklch(52.52% 0.2 26.86deg);
--color-error-700: oklch(46.81% 0.18 27.02deg); --color-error-700: oklch(46.81% 0.18 27.02deg);
--color-error-800: oklch(41.15% 0.16 27.63deg); --color-error-800: oklch(41.15% 0.16 27.63deg);
--color-error-900: oklch(35.01% 0.14 27.9deg); --color-error-900: oklch(35.01% 0.14 27.9deg);
--color-error-950: oklch(28.69% 0.12 29.23deg); --color-error-950: oklch(28.69% 0.12 29.23deg);
--color-error-contrast-dark: var(--color-error-950); --color-error-contrast-dark: var(--color-error-950);
--color-error-contrast-light: var(--color-error-50); --color-error-contrast-light: var(--color-error-50);
--color-error-contrast-50: var(--color-error-contrast-dark); --color-error-contrast-50: var(--color-error-contrast-dark);
--color-error-contrast-100: var(--color-error-contrast-dark); --color-error-contrast-100: var(--color-error-contrast-dark);
--color-error-contrast-200: var(--color-error-contrast-dark); --color-error-contrast-200: var(--color-error-contrast-dark);
--color-error-contrast-300: var(--color-error-contrast-dark); --color-error-contrast-300: var(--color-error-contrast-dark);
--color-error-contrast-400: var(--color-error-contrast-light); --color-error-contrast-400: var(--color-error-contrast-light);
--color-error-contrast-500: var(--color-error-contrast-light); --color-error-contrast-500: var(--color-error-contrast-light);
--color-error-contrast-600: var(--color-error-contrast-light); --color-error-contrast-600: var(--color-error-contrast-light);
--color-error-contrast-700: var(--color-error-contrast-light); --color-error-contrast-700: var(--color-error-contrast-light);
--color-error-contrast-800: var(--color-error-contrast-light); --color-error-contrast-800: var(--color-error-contrast-light);
--color-error-contrast-900: var(--color-error-contrast-light); --color-error-contrast-900: var(--color-error-contrast-light);
--color-error-contrast-950: var(--color-error-contrast-light); --color-error-contrast-950: var(--color-error-contrast-light);
--color-surface-50: oklch(100% 0 none); --color-surface-50: oklch(100% 0 none);
--color-surface-100: oklch(93.98% 0 105.57deg); --color-surface-100: oklch(93.98% 0 105.57deg);
--color-surface-200: oklch(87.66% 0 67.88deg); --color-surface-200: oklch(87.66% 0 67.88deg);
--color-surface-300: oklch(81.35% 0 106.1deg); --color-surface-300: oklch(81.35% 0 106.1deg);
--color-surface-400: oklch(74.79% 0 84.45deg); --color-surface-400: oklch(74.79% 0 84.45deg);
--color-surface-500: oklch(68.29% 0 91.36deg); --color-surface-500: oklch(68.29% 0 91.36deg);
--color-surface-600: oklch(60.99% 0 91.38deg); --color-surface-600: oklch(60.99% 0 91.38deg);
--color-surface-700: oklch(53.5% 0 84.49deg); --color-surface-700: oklch(53.5% 0 84.49deg);
--color-surface-800: oklch(46.03% 0 91.43deg); --color-surface-800: oklch(46.03% 0 91.43deg);
--color-surface-900: oklch(37.94% 0 84.52deg); --color-surface-900: oklch(37.94% 0 84.52deg);
--color-surface-950: oklch(29.34% 0 84.54deg); --color-surface-950: oklch(29.34% 0 84.54deg);
--color-surface-contrast-dark: var(--color-surface-950); --color-surface-contrast-dark: var(--color-surface-950);
--color-surface-contrast-light: var(--color-surface-50); --color-surface-contrast-light: var(--color-surface-50);
--color-surface-contrast-50: var(--color-surface-contrast-dark); --color-surface-contrast-50: var(--color-surface-contrast-dark);
--color-surface-contrast-100: var(--color-surface-contrast-dark); --color-surface-contrast-100: var(--color-surface-contrast-dark);
--color-surface-contrast-200: var(--color-surface-contrast-dark); --color-surface-contrast-200: var(--color-surface-contrast-dark);
--color-surface-contrast-300: var(--color-surface-contrast-dark); --color-surface-contrast-300: var(--color-surface-contrast-dark);
--color-surface-contrast-400: var(--color-surface-contrast-dark); --color-surface-contrast-400: var(--color-surface-contrast-dark);
--color-surface-contrast-500: var(--color-surface-contrast-dark); --color-surface-contrast-500: var(--color-surface-contrast-dark);
--color-surface-contrast-600: var(--color-surface-contrast-dark); --color-surface-contrast-600: var(--color-surface-contrast-dark);
--color-surface-contrast-700: var(--color-surface-contrast-light); --color-surface-contrast-700: var(--color-surface-contrast-light);
--color-surface-contrast-800: var(--color-surface-contrast-light); --color-surface-contrast-800: var(--color-surface-contrast-light);
--color-surface-contrast-900: var(--color-surface-contrast-light); --color-surface-contrast-900: var(--color-surface-contrast-light);
--color-surface-contrast-950: var(--color-surface-contrast-light); --color-surface-contrast-950: var(--color-surface-contrast-light);
} }

View File

@@ -1,205 +1,205 @@
[data-theme='aeclci'] { [data-theme='aeclci'] {
--text-scaling: 1.067; --text-scaling: 1.067;
--base-font-color: var(--color-surface-950); --base-font-color: var(--color-surface-950);
--base-font-color-dark: var(--color-surface-50); --base-font-color-dark: var(--color-surface-50);
--base-font-family: system-ui, sans-serif; --base-font-family: system-ui, sans-serif;
--base-font-size: inherit; --base-font-size: inherit;
--base-line-height: inherit; --base-line-height: inherit;
--base-font-weight: normal; --base-font-weight: normal;
--base-font-style: normal; --base-font-style: normal;
--base-letter-spacing: 0em; --base-letter-spacing: 0em;
--heading-font-color: inherit; --heading-font-color: inherit;
--heading-font-color-dark: inherit; --heading-font-color-dark: inherit;
--heading-font-family: inherit; --heading-font-family: inherit;
--heading-font-weight: bold; --heading-font-weight: bold;
--heading-font-style: normal; --heading-font-style: normal;
--heading-letter-spacing: inherit; --heading-letter-spacing: inherit;
--anchor-font-color: var(--color-primary-500); --anchor-font-color: var(--color-primary-500);
--anchor-font-color-dark: var(--color-primary-500); --anchor-font-color-dark: var(--color-primary-500);
--anchor-font-family: inherit; --anchor-font-family: inherit;
--anchor-font-size: inherit; --anchor-font-size: inherit;
--anchor-line-height: inherit; --anchor-line-height: inherit;
--anchor-font-weight: inherit; --anchor-font-weight: inherit;
--anchor-font-style: inherit; --anchor-font-style: inherit;
--anchor-letter-spacing: inherit; --anchor-letter-spacing: inherit;
--anchor-text-decoration: none; --anchor-text-decoration: none;
--anchor-text-decoration-hover: underline; --anchor-text-decoration-hover: underline;
--anchor-text-decoration-active: none; --anchor-text-decoration-active: none;
--anchor-text-decoration-focus: none; --anchor-text-decoration-focus: none;
--spacing: 0.25rem; --spacing: 0.25rem;
--radius-base: 0.375rem; --radius-base: 0.375rem;
--radius-container: 0.75rem; --radius-container: 0.75rem;
--default-border-width: 1px; --default-border-width: 1px;
--default-divide-width: 1px; --default-divide-width: 1px;
--default-ring-width: 1px; --default-ring-width: 1px;
--body-background-color: var(--color-surface-50); --body-background-color: var(--color-surface-50);
--body-background-color-dark: var(--color-surface-950); --body-background-color-dark: var(--color-surface-950);
--color-primary-50: oklch(85.1% 0.07 265.19deg); --color-primary-50: oklch(85.1% 0.07 265.19deg);
--color-primary-100: oklch(77.89% 0.08 264.31deg); --color-primary-100: oklch(77.89% 0.08 264.31deg);
--color-primary-200: oklch(70.32% 0.08 264.44deg); --color-primary-200: oklch(70.32% 0.08 264.44deg);
--color-primary-300: oklch(62.86% 0.09 263.87deg); --color-primary-300: oklch(62.86% 0.09 263.87deg);
--color-primary-400: oklch(54.96% 0.1 263.8deg); --color-primary-400: oklch(54.96% 0.1 263.8deg);
--color-primary-500: oklch(47.12% 0.11 262.88deg); --color-primary-500: oklch(47.12% 0.11 262.88deg);
--color-primary-600: oklch(40.9% 0.1 264.73deg); --color-primary-600: oklch(40.9% 0.1 264.73deg);
--color-primary-700: oklch(34.53% 0.1 267.34deg); --color-primary-700: oklch(34.53% 0.1 267.34deg);
--color-primary-800: oklch(28.16% 0.09 268.81deg); --color-primary-800: oklch(28.16% 0.09 268.81deg);
--color-primary-900: oklch(21.29% 0.09 271.12deg); --color-primary-900: oklch(21.29% 0.09 271.12deg);
--color-primary-950: oklch(12.88% 0.09 264.05deg); --color-primary-950: oklch(12.88% 0.09 264.05deg);
--color-primary-contrast-dark: var(--color-primary-950); --color-primary-contrast-dark: var(--color-primary-950);
--color-primary-contrast-light: var(--color-primary-50); --color-primary-contrast-light: var(--color-primary-50);
--color-primary-contrast-50: var(--color-primary-contrast-dark); --color-primary-contrast-50: var(--color-primary-contrast-dark);
--color-primary-contrast-100: var(--color-primary-contrast-dark); --color-primary-contrast-100: var(--color-primary-contrast-dark);
--color-primary-contrast-200: var(--color-primary-contrast-dark); --color-primary-contrast-200: var(--color-primary-contrast-dark);
--color-primary-contrast-300: var(--color-primary-contrast-dark); --color-primary-contrast-300: var(--color-primary-contrast-dark);
--color-primary-contrast-400: var(--color-primary-contrast-dark); --color-primary-contrast-400: var(--color-primary-contrast-dark);
--color-primary-contrast-500: var(--color-primary-contrast-light); --color-primary-contrast-500: var(--color-primary-contrast-light);
--color-primary-contrast-600: var(--color-primary-contrast-light); --color-primary-contrast-600: var(--color-primary-contrast-light);
--color-primary-contrast-700: var(--color-primary-contrast-light); --color-primary-contrast-700: var(--color-primary-contrast-light);
--color-primary-contrast-800: var(--color-primary-contrast-light); --color-primary-contrast-800: var(--color-primary-contrast-light);
--color-primary-contrast-900: var(--color-primary-contrast-light); --color-primary-contrast-900: var(--color-primary-contrast-light);
--color-primary-contrast-950: var(--color-primary-contrast-light); --color-primary-contrast-950: var(--color-primary-contrast-light);
--color-secondary-50: oklch(73.24% 0.12 278.78deg); --color-secondary-50: oklch(73.24% 0.12 278.78deg);
--color-secondary-100: oklch(65.76% 0.12 276.12deg); --color-secondary-100: oklch(65.76% 0.12 276.12deg);
--color-secondary-200: oklch(58.15% 0.12 273.33deg); --color-secondary-200: oklch(58.15% 0.12 273.33deg);
--color-secondary-300: oklch(50.59% 0.12 270.28deg); --color-secondary-300: oklch(50.59% 0.12 270.28deg);
--color-secondary-400: oklch(42.65% 0.12 267.23deg); --color-secondary-400: oklch(42.65% 0.12 267.23deg);
--color-secondary-500: oklch(34.53% 0.12 264.22deg); --color-secondary-500: oklch(34.53% 0.12 264.22deg);
--color-secondary-600: oklch(30.3% 0.11 264.59deg); --color-secondary-600: oklch(30.3% 0.11 264.59deg);
--color-secondary-700: oklch(25.96% 0.09 265.69deg); --color-secondary-700: oklch(25.96% 0.09 265.69deg);
--color-secondary-800: oklch(21.25% 0.08 267.5deg); --color-secondary-800: oklch(21.25% 0.08 267.5deg);
--color-secondary-900: oklch(16.42% 0.06 269.55deg); --color-secondary-900: oklch(16.42% 0.06 269.55deg);
--color-secondary-950: oklch(8.85% 0.06 264.05deg); --color-secondary-950: oklch(8.85% 0.06 264.05deg);
--color-secondary-contrast-dark: var(--color-secondary-950); --color-secondary-contrast-dark: var(--color-secondary-950);
--color-secondary-contrast-light: var(--color-secondary-50); --color-secondary-contrast-light: var(--color-secondary-50);
--color-secondary-contrast-50: var(--color-secondary-contrast-dark); --color-secondary-contrast-50: var(--color-secondary-contrast-dark);
--color-secondary-contrast-100: var(--color-secondary-contrast-dark); --color-secondary-contrast-100: var(--color-secondary-contrast-dark);
--color-secondary-contrast-200: var(--color-secondary-contrast-dark); --color-secondary-contrast-200: var(--color-secondary-contrast-dark);
--color-secondary-contrast-300: var(--color-secondary-contrast-light); --color-secondary-contrast-300: var(--color-secondary-contrast-light);
--color-secondary-contrast-400: var(--color-secondary-contrast-light); --color-secondary-contrast-400: var(--color-secondary-contrast-light);
--color-secondary-contrast-500: var(--color-secondary-contrast-light); --color-secondary-contrast-500: var(--color-secondary-contrast-light);
--color-secondary-contrast-600: var(--color-secondary-contrast-light); --color-secondary-contrast-600: var(--color-secondary-contrast-light);
--color-secondary-contrast-700: var(--color-secondary-contrast-light); --color-secondary-contrast-700: var(--color-secondary-contrast-light);
--color-secondary-contrast-800: var(--color-secondary-contrast-light); --color-secondary-contrast-800: var(--color-secondary-contrast-light);
--color-secondary-contrast-900: var(--color-secondary-contrast-light); --color-secondary-contrast-900: var(--color-secondary-contrast-light);
--color-secondary-contrast-950: var(--color-secondary-contrast-light); --color-secondary-contrast-950: var(--color-secondary-contrast-light);
--color-tertiary-50: oklch(87.75% 0.12 326.52deg); --color-tertiary-50: oklch(87.75% 0.12 326.52deg);
--color-tertiary-100: oklch(80.92% 0.13 323.93deg); --color-tertiary-100: oklch(80.92% 0.13 323.93deg);
--color-tertiary-200: oklch(73.87% 0.14 321.55deg); --color-tertiary-200: oklch(73.87% 0.14 321.55deg);
--color-tertiary-300: oklch(66.9% 0.15 319.41deg); --color-tertiary-300: oklch(66.9% 0.15 319.41deg);
--color-tertiary-400: oklch(59.72% 0.16 317.25deg); --color-tertiary-400: oklch(59.72% 0.16 317.25deg);
--color-tertiary-500: oklch(52.73% 0.17 315.13deg); --color-tertiary-500: oklch(52.73% 0.17 315.13deg);
--color-tertiary-600: oklch(46.6% 0.16 314.18deg); --color-tertiary-600: oklch(46.6% 0.16 314.18deg);
--color-tertiary-700: oklch(40.43% 0.14 312.8deg); --color-tertiary-700: oklch(40.43% 0.14 312.8deg);
--color-tertiary-800: oklch(33.85% 0.13 309.88deg); --color-tertiary-800: oklch(33.85% 0.13 309.88deg);
--color-tertiary-900: oklch(27.23% 0.12 306.83deg); --color-tertiary-900: oklch(27.23% 0.12 306.83deg);
--color-tertiary-950: oklch(19.83% 0.1 302.7deg); --color-tertiary-950: oklch(19.83% 0.1 302.7deg);
--color-tertiary-contrast-dark: var(--color-tertiary-950); --color-tertiary-contrast-dark: var(--color-tertiary-950);
--color-tertiary-contrast-light: var(--color-tertiary-50); --color-tertiary-contrast-light: var(--color-tertiary-50);
--color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-400: var(--color-tertiary-contrast-light); --color-tertiary-contrast-400: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-500: var(--color-tertiary-contrast-light); --color-tertiary-contrast-500: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-600: var(--color-tertiary-contrast-light); --color-tertiary-contrast-600: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-700: var(--color-tertiary-contrast-light); --color-tertiary-contrast-700: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-800: var(--color-tertiary-contrast-light); --color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-900: var(--color-tertiary-contrast-light); --color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-950: var(--color-tertiary-contrast-light); --color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
--color-success-50: oklch(95.23% 0.07 195.99deg); --color-success-50: oklch(95.23% 0.07 195.99deg);
--color-success-100: oklch(90.22% 0.09 189.46deg); --color-success-100: oklch(90.22% 0.09 189.46deg);
--color-success-200: oklch(85.11% 0.1 186.03deg); --color-success-200: oklch(85.11% 0.1 186.03deg);
--color-success-300: oklch(80.35% 0.12 181.75deg); --color-success-300: oklch(80.35% 0.12 181.75deg);
--color-success-400: oklch(75.55% 0.12 178.92deg); --color-success-400: oklch(75.55% 0.12 178.92deg);
--color-success-500: oklch(71.19% 0.13 174.73deg); --color-success-500: oklch(71.19% 0.13 174.73deg);
--color-success-600: oklch(64.29% 0.12 173.65deg); --color-success-600: oklch(64.29% 0.12 173.65deg);
--color-success-700: oklch(57.46% 0.11 171.75deg); --color-success-700: oklch(57.46% 0.11 171.75deg);
--color-success-800: oklch(50.18% 0.1 170.68deg); --color-success-800: oklch(50.18% 0.1 170.68deg);
--color-success-900: oklch(42.87% 0.09 167.65deg); --color-success-900: oklch(42.87% 0.09 167.65deg);
--color-success-950: oklch(34.91% 0.07 164.42deg); --color-success-950: oklch(34.91% 0.07 164.42deg);
--color-success-contrast-dark: var(--color-success-950); --color-success-contrast-dark: var(--color-success-950);
--color-success-contrast-light: var(--color-success-50); --color-success-contrast-light: var(--color-success-50);
--color-success-contrast-50: var(--color-success-contrast-dark); --color-success-contrast-50: var(--color-success-contrast-dark);
--color-success-contrast-100: var(--color-success-contrast-dark); --color-success-contrast-100: var(--color-success-contrast-dark);
--color-success-contrast-200: var(--color-success-contrast-dark); --color-success-contrast-200: var(--color-success-contrast-dark);
--color-success-contrast-300: var(--color-success-contrast-dark); --color-success-contrast-300: var(--color-success-contrast-dark);
--color-success-contrast-400: var(--color-success-contrast-dark); --color-success-contrast-400: var(--color-success-contrast-dark);
--color-success-contrast-500: var(--color-success-contrast-dark); --color-success-contrast-500: var(--color-success-contrast-dark);
--color-success-contrast-600: var(--color-success-contrast-dark); --color-success-contrast-600: var(--color-success-contrast-dark);
--color-success-contrast-700: var(--color-success-contrast-light); --color-success-contrast-700: var(--color-success-contrast-light);
--color-success-contrast-800: var(--color-success-contrast-light); --color-success-contrast-800: var(--color-success-contrast-light);
--color-success-contrast-900: var(--color-success-contrast-light); --color-success-contrast-900: var(--color-success-contrast-light);
--color-success-contrast-950: var(--color-success-contrast-light); --color-success-contrast-950: var(--color-success-contrast-light);
--color-warning-50: oklch(95.67% 0.05 84.56deg); --color-warning-50: oklch(95.67% 0.05 84.56deg);
--color-warning-100: oklch(92.83% 0.06 82.16deg); --color-warning-100: oklch(92.83% 0.06 82.16deg);
--color-warning-200: oklch(90.12% 0.08 80.33deg); --color-warning-200: oklch(90.12% 0.08 80.33deg);
--color-warning-300: oklch(87.59% 0.1 80.01deg); --color-warning-300: oklch(87.59% 0.1 80.01deg);
--color-warning-400: oklch(85.03% 0.12 78.35deg); --color-warning-400: oklch(85.03% 0.12 78.35deg);
--color-warning-500: oklch(82.46% 0.14 76.71deg); --color-warning-500: oklch(82.46% 0.14 76.71deg);
--color-warning-600: oklch(76.34% 0.13 72.25deg); --color-warning-600: oklch(76.34% 0.13 72.25deg);
--color-warning-700: oklch(70.34% 0.13 68.09deg); --color-warning-700: oklch(70.34% 0.13 68.09deg);
--color-warning-800: oklch(63.99% 0.13 63.18deg); --color-warning-800: oklch(63.99% 0.13 63.18deg);
--color-warning-900: oklch(57.91% 0.13 57.97deg); --color-warning-900: oklch(57.91% 0.13 57.97deg);
--color-warning-950: oklch(51.69% 0.13 51.44deg); --color-warning-950: oklch(51.69% 0.13 51.44deg);
--color-warning-contrast-dark: var(--color-warning-950); --color-warning-contrast-dark: var(--color-warning-950);
--color-warning-contrast-light: var(--color-warning-50); --color-warning-contrast-light: var(--color-warning-50);
--color-warning-contrast-50: var(--color-warning-contrast-dark); --color-warning-contrast-50: var(--color-warning-contrast-dark);
--color-warning-contrast-100: var(--color-warning-contrast-dark); --color-warning-contrast-100: var(--color-warning-contrast-dark);
--color-warning-contrast-200: var(--color-warning-contrast-dark); --color-warning-contrast-200: var(--color-warning-contrast-dark);
--color-warning-contrast-300: var(--color-warning-contrast-dark); --color-warning-contrast-300: var(--color-warning-contrast-dark);
--color-warning-contrast-400: var(--color-warning-contrast-dark); --color-warning-contrast-400: var(--color-warning-contrast-dark);
--color-warning-contrast-500: var(--color-warning-contrast-dark); --color-warning-contrast-500: var(--color-warning-contrast-dark);
--color-warning-contrast-600: var(--color-warning-contrast-light); --color-warning-contrast-600: var(--color-warning-contrast-light);
--color-warning-contrast-700: var(--color-warning-contrast-light); --color-warning-contrast-700: var(--color-warning-contrast-light);
--color-warning-contrast-800: var(--color-warning-contrast-light); --color-warning-contrast-800: var(--color-warning-contrast-light);
--color-warning-contrast-900: var(--color-warning-contrast-light); --color-warning-contrast-900: var(--color-warning-contrast-light);
--color-warning-contrast-950: var(--color-warning-contrast-light); --color-warning-contrast-950: var(--color-warning-contrast-light);
--color-error-50: oklch(84.29% 0.09 46.91deg); --color-error-50: oklch(84.29% 0.09 46.91deg);
--color-error-100: oklch(78.63% 0.12 39.19deg); --color-error-100: oklch(78.63% 0.12 39.19deg);
--color-error-200: oklch(72.92% 0.14 34.35deg); --color-error-200: oklch(72.92% 0.14 34.35deg);
--color-error-300: oklch(67.88% 0.17 31.48deg); --color-error-300: oklch(67.88% 0.17 31.48deg);
--color-error-400: oklch(63.09% 0.19 30.02deg); --color-error-400: oklch(63.09% 0.19 30.02deg);
--color-error-500: oklch(59.32% 0.21 29.47deg); --color-error-500: oklch(59.32% 0.21 29.47deg);
--color-error-600: oklch(53.56% 0.19 29.25deg); --color-error-600: oklch(53.56% 0.19 29.25deg);
--color-error-700: oklch(47.75% 0.17 29.2deg); --color-error-700: oklch(47.75% 0.17 29.2deg);
--color-error-800: oklch(41.51% 0.15 28.7deg); --color-error-800: oklch(41.51% 0.15 28.7deg);
--color-error-900: oklch(35.35% 0.14 28.7deg); --color-error-900: oklch(35.35% 0.14 28.7deg);
--color-error-950: oklch(28.69% 0.12 29.23deg); --color-error-950: oklch(28.69% 0.12 29.23deg);
--color-error-contrast-dark: var(--color-error-950); --color-error-contrast-dark: var(--color-error-950);
--color-error-contrast-light: var(--color-error-50); --color-error-contrast-light: var(--color-error-50);
--color-error-contrast-50: var(--color-error-contrast-dark); --color-error-contrast-50: var(--color-error-contrast-dark);
--color-error-contrast-100: var(--color-error-contrast-dark); --color-error-contrast-100: var(--color-error-contrast-dark);
--color-error-contrast-200: var(--color-error-contrast-dark); --color-error-contrast-200: var(--color-error-contrast-dark);
--color-error-contrast-300: var(--color-error-contrast-dark); --color-error-contrast-300: var(--color-error-contrast-dark);
--color-error-contrast-400: var(--color-error-contrast-dark); --color-error-contrast-400: var(--color-error-contrast-dark);
--color-error-contrast-500: var(--color-error-contrast-light); --color-error-contrast-500: var(--color-error-contrast-light);
--color-error-contrast-600: var(--color-error-contrast-light); --color-error-contrast-600: var(--color-error-contrast-light);
--color-error-contrast-700: var(--color-error-contrast-light); --color-error-contrast-700: var(--color-error-contrast-light);
--color-error-contrast-800: var(--color-error-contrast-light); --color-error-contrast-800: var(--color-error-contrast-light);
--color-error-contrast-900: var(--color-error-contrast-light); --color-error-contrast-900: var(--color-error-contrast-light);
--color-error-contrast-950: var(--color-error-contrast-light); --color-error-contrast-950: var(--color-error-contrast-light);
--color-surface-50: oklch(100% 0 none); --color-surface-50: oklch(100% 0 none);
--color-surface-100: oklch(97.02% 0 none); --color-surface-100: oklch(97.02% 0 none);
--color-surface-200: oklch(94.01% 0 none); --color-surface-200: oklch(94.01% 0 none);
--color-surface-300: oklch(91.12% 0 196.34deg); --color-surface-300: oklch(91.12% 0 196.34deg);
--color-surface-400: oklch(88.07% 0 196.37deg); --color-surface-400: oklch(88.07% 0 196.37deg);
--color-surface-500: oklch(84.99% 0 196.4deg); --color-surface-500: oklch(84.99% 0 196.4deg);
--color-surface-600: oklch(77.78% 0 196.47deg); --color-surface-600: oklch(77.78% 0 196.47deg);
--color-surface-700: oklch(70.09% 0 196.54deg); --color-surface-700: oklch(70.09% 0 196.54deg);
--color-surface-800: oklch(62.51% 0 196.61deg); --color-surface-800: oklch(62.51% 0 196.61deg);
--color-surface-900: oklch(54.34% 0 196.68deg); --color-surface-900: oklch(54.34% 0 196.68deg);
--color-surface-950: oklch(46.22% 0 196.73deg); --color-surface-950: oklch(46.22% 0 196.73deg);
--color-surface-contrast-dark: var(--color-surface-950); --color-surface-contrast-dark: var(--color-surface-950);
--color-surface-contrast-light: var(--color-surface-50); --color-surface-contrast-light: var(--color-surface-50);
--color-surface-contrast-50: var(--color-surface-contrast-dark); --color-surface-contrast-50: var(--color-surface-contrast-dark);
--color-surface-contrast-100: var(--color-surface-contrast-dark); --color-surface-contrast-100: var(--color-surface-contrast-dark);
--color-surface-contrast-200: var(--color-surface-contrast-dark); --color-surface-contrast-200: var(--color-surface-contrast-dark);
--color-surface-contrast-300: var(--color-surface-contrast-dark); --color-surface-contrast-300: var(--color-surface-contrast-dark);
--color-surface-contrast-400: var(--color-surface-contrast-dark); --color-surface-contrast-400: var(--color-surface-contrast-dark);
--color-surface-contrast-500: var(--color-surface-contrast-dark); --color-surface-contrast-500: var(--color-surface-contrast-dark);
--color-surface-contrast-600: var(--color-surface-contrast-dark); --color-surface-contrast-600: var(--color-surface-contrast-dark);
--color-surface-contrast-700: var(--color-surface-contrast-dark); --color-surface-contrast-700: var(--color-surface-contrast-dark);
--color-surface-contrast-800: var(--color-surface-contrast-dark); --color-surface-contrast-800: var(--color-surface-contrast-dark);
--color-surface-contrast-900: var(--color-surface-contrast-light); --color-surface-contrast-900: var(--color-surface-contrast-light);
--color-surface-contrast-950: var(--color-surface-contrast-light); --color-surface-contrast-950: var(--color-surface-contrast-light);
} }

View File

@@ -43,38 +43,38 @@
/* @custom-variant dark (&:where([data-mode="dark"], [data-mode="dark"] *)); */ /* @custom-variant dark (&:where([data-mode="dark"], [data-mode="dark"] *)); */
@layer base { @layer base {
:root { :root {
--background: 0 0% 100%; --background: 0 0% 100%;
--foreground: 224 71.4% 4.1%; --foreground: 224 71.4% 4.1%;
--muted: 220 14.3% 95.9%; --muted: 220 14.3% 95.9%;
--muted-foreground: 220 8.9% 46.1%; --muted-foreground: 220 8.9% 46.1%;
--popover: 0 0% 100%; --popover: 0 0% 100%;
--popover-foreground: 224 71.4% 4.1%; --popover-foreground: 224 71.4% 4.1%;
--card: 0 0% 100%; --card: 0 0% 100%;
--card-foreground: 224 71.4% 4.1%; --card-foreground: 224 71.4% 4.1%;
--border: 220 13% 91%; --border: 220 13% 91%;
--input: 220 13% 91%; --input: 220 13% 91%;
--primary: 220.9 39.3% 11%; --primary: 220.9 39.3% 11%;
--primary-foreground: 210 20% 98%; --primary-foreground: 210 20% 98%;
--secondary: 220 14.3% 95.9%; --secondary: 220 14.3% 95.9%;
--secondary-foreground: 220.9 39.3% 11%; --secondary-foreground: 220.9 39.3% 11%;
--accent: 220 14.3% 95.9%; --accent: 220 14.3% 95.9%;
--accent-foreground: 220.9 39.3% 11%; --accent-foreground: 220.9 39.3% 11%;
--destructive: 0 72.2% 50.6%; --destructive: 0 72.2% 50.6%;
--destructive-foreground: 210 20% 98%; --destructive-foreground: 210 20% 98%;
--ring: 224 71.4% 4.1%; --ring: 224 71.4% 4.1%;
--radius: 0.5rem; --radius: 0.5rem;
--sidebar-background: 0 0% 98%; --sidebar-background: 0 0% 98%;
--sidebar-foreground: 240 5.3% 26.1%; --sidebar-foreground: 240 5.3% 26.1%;
--sidebar-primary: 240 5.9% 10%; --sidebar-primary: 240 5.9% 10%;
--sidebar-primary-foreground: 0 0% 98%; --sidebar-primary-foreground: 0 0% 98%;
--sidebar-accent: 240 4.8% 95.9%; --sidebar-accent: 240 4.8% 95.9%;
--sidebar-accent-foreground: 240 5.9% 10%; --sidebar-accent-foreground: 240 5.9% 10%;
--sidebar-border: 220 13% 91%; --sidebar-border: 220 13% 91%;
--sidebar-ring: 217.2 91.2% 59.8%; --sidebar-ring: 217.2 91.2% 59.8%;
} }
/* .dark { /* .dark {
--background: 224 71.4% 4.1%; --background: 224 71.4% 4.1%;
--foreground: 210 20% 98%; --foreground: 210 20% 98%;
--muted: 215 27.9% 16.9%; --muted: 215 27.9% 16.9%;
@@ -106,37 +106,37 @@
} }
@layer base { @layer base {
* { * {
border-color: hsl(var(--border)); border-color: hsl(var(--border));
} }
body { body {
background-color: hsl(var(--background)); background-color: hsl(var(--background));
color: hsl(var(--foreground)); color: hsl(var(--foreground));
} }
} }
/* There are no more Tailwind layers. */ /* There are no more Tailwind layers. */
html, html,
body { body {
@apply h-full overflow-hidden; @apply h-full overflow-hidden;
/* font-family: 'Liberation Sans', sans-serif; */ /* font-family: 'Liberation Sans', sans-serif; */
/* font-family: 'Noto Sans', sans-serif; */ /* font-family: 'Noto Sans', sans-serif; */
} }
html.super_access #appShell { html.super_access #appShell {
background-color: hsla(0, 100%, 50%, 0.5); background-color: hsla(0, 100%, 50%, 0.5);
} }
html.manager_access #appShell { html.manager_access #appShell {
background-color: hsla(0, 50%, 75%, 0.5); background-color: hsla(0, 50%, 75%, 0.5);
} }
html.administrator_access #appShell { html.administrator_access #appShell {
background-color: hsla(40, 50%, 85%, 0.25); background-color: hsla(40, 50%, 85%, 0.25);
} }
html.trusted_access #appShell { html.trusted_access #appShell {
background-color: hsla(20, 50%, 85%, 0.25); background-color: hsla(20, 50%, 85%, 0.25);
} }
/* default theme */ /* default theme */
@@ -150,9 +150,9 @@ html.trusted_access #appShell {
/* modern theme */ /* modern theme */
@font-face { @font-face {
font-family: 'Quicksand'; font-family: 'Quicksand';
src: url('/fonts/Quicksand.ttf'); src: url('/fonts/Quicksand.ttf');
font-display: swap; font-display: swap;
} }
/* :root [data-theme='modern'] { */ /* :root [data-theme='modern'] { */
@@ -274,114 +274,114 @@ html.trusted_access #appShell {
/* Buttons default to the tonal presets */ /* Buttons default to the tonal presets */
/* Buttons based on Skeleton Tailwind preset classes */ /* Buttons based on Skeleton Tailwind preset classes */
.ae_btn_neutral { .ae_btn_neutral {
@apply preset-tonal hover:preset-outlined border transition-all; @apply preset-tonal hover:preset-outlined border transition-all;
} }
.ae_btn_primary { .ae_btn_primary {
@apply preset-tonal-primary border border-primary-500 transition-all; @apply preset-tonal-primary border border-primary-500 transition-all;
} }
.ae_btn_secondary { .ae_btn_secondary {
@apply preset-tonal-secondary border border-secondary-500 transition-all; @apply preset-tonal-secondary border border-secondary-500 transition-all;
/* hover:preset-filled-secondary-500 */ /* hover:preset-filled-secondary-500 */
} }
.ae_btn_tertiary { .ae_btn_tertiary {
@apply preset-tonal-tertiary border border-tertiary-500 transition-all; @apply preset-tonal-tertiary border border-tertiary-500 transition-all;
} }
.ae_btn_success { .ae_btn_success {
@apply preset-tonal-success border border-success-500 transition-all; @apply preset-tonal-success border border-success-500 transition-all;
} }
.ae_btn_warning { .ae_btn_warning {
@apply preset-tonal-warning border border-warning-500 text-warning-950-50 transition-all; @apply preset-tonal-warning border border-warning-500 text-warning-950-50 transition-all;
} }
.ae_btn_error { .ae_btn_error {
@apply preset-tonal-error border border-error-500 transition-all; @apply preset-tonal-error border border-error-500 transition-all;
} }
.ae_btn_surface { .ae_btn_surface {
@apply preset-tonal-surface border border-surface-500 transition-all; @apply preset-tonal-surface border border-surface-500 transition-all;
} }
/* Buttons customized for Aether using Skeleton Tailwind preset classes */ /* Buttons customized for Aether using Skeleton Tailwind preset classes */
.ae_btn_info { .ae_btn_info {
@apply border text-cyan-950 dark:text-cyan-50 bg-cyan-50 dark:bg-cyan-950 border-cyan-100 dark:border-cyan-900 hover:bg-cyan-200 hover:dark:bg-cyan-800 transition-all; @apply border text-cyan-950 dark:text-cyan-50 bg-cyan-50 dark:bg-cyan-950 border-cyan-100 dark:border-cyan-900 hover:bg-cyan-200 hover:dark:bg-cyan-800 transition-all;
} }
/* Buttons are for filled and outlined presets */ /* Buttons are for filled and outlined presets */
.ae_btn_secondary_filled { .ae_btn_secondary_filled {
@apply preset-filled-secondary-200-800 border border-secondary-500 transition-all; @apply preset-filled-secondary-200-800 border border-secondary-500 transition-all;
/* hover:preset-filled-secondary-500 */ /* hover:preset-filled-secondary-500 */
} }
.ae_btn_secondary_outlined { .ae_btn_secondary_outlined {
@apply preset-outlined-secondary-200-800 hover:preset-filled-secondary-400-600 text-secondary-950-50 transition-all; @apply preset-outlined-secondary-200-800 hover:preset-filled-secondary-400-600 text-secondary-950-50 transition-all;
} }
.ae_btn_success_filled { .ae_btn_success_filled {
@apply preset-filled-success-200-800 border border-success-500 transition-all; @apply preset-filled-success-200-800 border border-success-500 transition-all;
} }
.ae_btn_success_outlined { .ae_btn_success_outlined {
@apply preset-outlined-success-200-800 hover:preset-filled-success-400-600 text-success-950-50 transition-all; @apply preset-outlined-success-200-800 hover:preset-filled-success-400-600 text-success-950-50 transition-all;
} }
.ae_btn_warning_filled { .ae_btn_warning_filled {
@apply preset-filled-warning-200-800 border border-warning-500 transition-all; @apply preset-filled-warning-200-800 border border-warning-500 transition-all;
} }
.ae_btn_warning_outlined { .ae_btn_warning_outlined {
@apply preset-outlined-warning-200-800 hover:preset-filled-warning-400-600 text-warning-950-50 transition-all; @apply preset-outlined-warning-200-800 hover:preset-filled-warning-400-600 text-warning-950-50 transition-all;
} }
.ae_btn_surface_filled { .ae_btn_surface_filled {
@apply preset-filled-surface-200-800 border border-surface-500 transition-all; @apply preset-filled-surface-200-800 border border-surface-500 transition-all;
} }
.ae_btn_surface_outlined { .ae_btn_surface_outlined {
@apply preset-outlined-surface-200-800 hover:preset-filled-surface-400-600 text-surface-950-50 transition-all; @apply preset-outlined-surface-200-800 hover:preset-filled-surface-400-600 text-surface-950-50 transition-all;
} }
.ae_btn_error_outlined { .ae_btn_error_outlined {
@apply preset-outlined-error-200-800 hover:preset-filled-error-400-600 text-error-950-50 transition-all; @apply preset-outlined-error-200-800 hover:preset-filled-error-400-600 text-error-950-50 transition-all;
} }
.ae_btn_info_filled { .ae_btn_info_filled {
@apply border text-cyan-950 dark:text-cyan-50 bg-cyan-200 dark:bg-cyan-800 border-cyan-200 dark:border-cyan-800 transition-all; @apply border text-cyan-950 dark:text-cyan-50 bg-cyan-200 dark:bg-cyan-800 border-cyan-200 dark:border-cyan-800 transition-all;
} }
.ae_btn_info_outlined { .ae_btn_info_outlined {
@apply border text-cyan-950 dark:text-cyan-50 bg-cyan-50 dark:bg-cyan-950 border-cyan-200 dark:border-cyan-800 transition-all; @apply border text-cyan-950 dark:text-cyan-50 bg-cyan-50 dark:bg-cyan-950 border-cyan-200 dark:border-cyan-800 transition-all;
} }
/* Containers customized for Aether using Skeleton Tailwind preset classes */ /* Containers customized for Aether using Skeleton Tailwind preset classes */
.ae_container_system_menu { .ae_container_system_menu {
@apply container; @apply container;
} }
.ae_container_system_options { .ae_container_system_options {
@apply container; @apply container;
} }
.ae_container_system_help { .ae_container_system_help {
@apply container; @apply container;
} }
.ae_container_module { .ae_container_module {
@apply container; @apply container;
/* @apply container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8; */ /* @apply container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8; */
} }
/* .ae_container_module_main { /* .ae_container_module_main {
@apply container; @apply container;
} */ } */
.ae_module_header { .ae_module_header {
/* LCI request 3a5997 */ /* LCI request 3a5997 */
/* bg-gray-300 */ /* bg-gray-300 */
@apply preset-tonal-surface rounded-md flex flex-col md:flex-row flex-wrap gap-0.25 items-center justify-between w-full max-w-7xl p-1 px-2; @apply preset-tonal-surface rounded-md flex flex-col md:flex-row flex-wrap gap-0.25 items-center justify-between w-full max-w-7xl p-1 px-2;
} }
[data-theme='AE_c_LCI'] .ae_module_header { [data-theme='AE_c_LCI'] .ae_module_header {
/* LCI request 3a5997 */ /* LCI request 3a5997 */
/* bg-gray-300 */ /* bg-gray-300 */
@apply preset-tonal-primary; @apply preset-tonal-primary;
} }
[data-theme='AE_c_LCI'] .ae_obj__event_presenter { [data-theme='AE_c_LCI'] .ae_obj__event_presenter {
@apply preset-filled-success-500; @apply preset-filled-success-500;
/* --color-success-500; */ /* --color-success-500; */
} }
.ae_container_module_content { .ae_container_module_content {
@apply container; @apply container;
} }
.ae_container_module_menu { .ae_container_module_menu {
@apply w-full max-w-7xl flex flex-col items-center justify-center gap-1 p-1 @apply w-full max-w-7xl flex flex-col items-center justify-center gap-1 p-1
border rounded-md border-gray-200 dark:border-gray-800 hover:bg-gray-100 dark:hover:bg-gray-900 transition-all duration-700 hover:duration-300; border rounded-md border-gray-200 dark:border-gray-800 hover:bg-gray-100 dark:hover:bg-gray-900 transition-all duration-700 hover:duration-300;
} }
.ae_container_module_options { .ae_container_module_options {
@apply text-cyan-950 dark:text-cyan-50 @apply text-cyan-950 dark:text-cyan-50
bg-cyan-50 dark:bg-cyan-950 hover:bg-cyan-100 dark:hover:bg-cyan-900 bg-cyan-50 dark:bg-cyan-950 hover:bg-cyan-100 dark:hover:bg-cyan-900
border border-cyan-200 dark:border-cyan-800 hover:border-cyan-400 dark:hover:border-cyan-600 border border-cyan-200 dark:border-cyan-800 hover:border-cyan-400 dark:hover:border-cyan-600
rounded-md rounded-md
@@ -391,50 +391,50 @@ html.trusted_access #appShell {
transition-all; transition-all;
} }
.ae_container_module_help { .ae_container_module_help {
@apply text-yellow-950 dark:text-yellow-50 @apply text-yellow-950 dark:text-yellow-50
bg-yellow-50 dark:bg-yellow-950 hover:bg-yellow-100 dark:hover:bg-yellow-900 bg-yellow-50 dark:bg-yellow-950 hover:bg-yellow-100 dark:hover:bg-yellow-900
border border-yellow-200 dark:border-yellow-800 hover:border-yellow-400 dark:hover:border-yellow-600 border border-yellow-200 dark:border-yellow-800 hover:border-yellow-400 dark:hover:border-yellow-600
rounded-md rounded-md
w-lg max-w-full w-lg max-w-full
p-2 p-2
transition-all; transition-all;
/* bg-yellow-100 border border-yellow-400 p-2 rounded-md max-w-xl */ /* bg-yellow-100 border border-yellow-400 p-2 rounded-md max-w-xl */
} }
.ae_container_actions { .ae_container_actions {
@apply container preset-tonal-success border border-success-500 rounded-md flex flex-row items-center my-2 p-2; @apply container preset-tonal-success border border-success-500 rounded-md flex flex-row items-center my-2 p-2;
} }
.ae_container_results { .ae_container_results {
@apply container; @apply container;
} }
.ae_container_content { .ae_container_content {
@apply container; @apply container;
} }
.ae_container_content_header { .ae_container_content_header {
@apply container; @apply container;
} }
.ae_container_content_content { .ae_container_content_content {
@apply container; @apply container;
} }
.ae_container_content_footer { .ae_container_content_footer {
@apply container; @apply container;
} }
.ae_container_alert { .ae_container_alert {
@apply container; @apply container;
} }
.ae_container_help { .ae_container_help {
@apply text-yellow-950 dark:text-yellow-50 @apply text-yellow-950 dark:text-yellow-50
bg-yellow-50 dark:bg-yellow-950 hover:bg-yellow-100 dark:hover:bg-yellow-900 bg-yellow-50 dark:bg-yellow-950 hover:bg-yellow-100 dark:hover:bg-yellow-900
border border-yellow-200 dark:border-yellow-800 hover:border-yellow-400 dark:hover:border-yellow-600 border border-yellow-200 dark:border-yellow-800 hover:border-yellow-400 dark:hover:border-yellow-600
rounded-md rounded-md
max-w-full max-w-full
p-2 p-2
transition-all; transition-all;
/* bg-yellow-100 border border-yellow-400 p-2 rounded-md max-w-xl */ /* bg-yellow-100 border border-yellow-400 p-2 rounded-md max-w-xl */
} }
.ae_container_info { .ae_container_info {
@apply text-cyan-950 dark:text-cyan-50 @apply text-cyan-950 dark:text-cyan-50
bg-cyan-50 dark:bg-cyan-950 hover:bg-cyan-100 dark:hover:bg-cyan-900 bg-cyan-50 dark:bg-cyan-950 hover:bg-cyan-100 dark:hover:bg-cyan-900
border border-cyan-200 dark:border-cyan-800 hover:border-cyan-400 dark:hover:border-cyan-600 border border-cyan-200 dark:border-cyan-800 hover:border-cyan-400 dark:hover:border-cyan-600
rounded-md rounded-md
@@ -443,26 +443,26 @@ html.trusted_access #appShell {
transition-all; transition-all;
} }
.ae_container_msg { .ae_container_msg {
@apply container; @apply container;
} }
.ae_container_warning { .ae_container_warning {
@apply container; @apply container;
} }
.ae_container_tag { .ae_container_tag {
@apply container; @apply container;
} }
.ae_container_modal { .ae_container_modal {
@apply container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8; @apply container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8;
} }
.ae_container_modal_header { .ae_container_modal_header {
@apply container; @apply container;
} }
.ae_container_modal_content { .ae_container_modal_content {
@apply container; @apply container;
} }
.ae_container_modal_footer { .ae_container_modal_footer {
@apply container; @apply container;
} }
/* Standard Aether object properties: /* Standard Aether object properties:
@@ -477,63 +477,63 @@ html.trusted_access #appShell {
*/ */
.card-footer { .card-footer {
border-top: 1px solid hsla(0, 0%, 0%, 0.5); border-top: 1px solid hsla(0, 0%, 0%, 0.5);
margin-top: 1em; margin-top: 1em;
padding-top: 1em; padding-top: 1em;
opacity: 0.5; opacity: 0.5;
} }
/* Tailwind: This "fixes" Tailwind's default group button styles that do not seem to allow hiding buttons. */ /* Tailwind: This "fixes" Tailwind's default group button styles that do not seem to allow hiding buttons. */
.btn-group a.hidden, .btn-group a.hidden,
.btn-group button.hidden { .btn-group button.hidden {
display: none; display: none;
} }
.ae_d_none { .ae_d_none {
display: none; display: none;
} }
/* Allow content to scroll horizontal if too wide */ /* Allow content to scroll horizontal if too wide */
.ae_h_scrollfix { .ae_h_scrollfix {
max-width: 100%; max-width: 100%;
overflow-x: auto; overflow-x: auto;
} }
/* These helps with the Skeleton Tailwind modal utility. */ /* These helps with the Skeleton Tailwind modal utility. */
.ae_modal_scrollfix { .ae_modal_scrollfix {
/* Allow modal content to scroll if it's too long */ /* Allow modal content to scroll if it's too long */
overflow-y: auto; overflow-y: auto;
max-height: 96vh; max-height: 96vh;
/* max-height: 99%; */ /* max-height: 99%; */
} }
.ae_debug { .ae_debug {
/* A darker pink outline */ /* A darker pink outline */
outline: thin dashed; outline: thin dashed;
outline-color: hsla(0, 100%, 50%, 0.15); outline-color: hsla(0, 100%, 50%, 0.15);
/* A light pink background color */ /* A light pink background color */
background-color: hsla(0, 100%, 50%, 0.15); background-color: hsla(0, 100%, 50%, 0.15);
} }
.ae_debug:hover { .ae_debug:hover {
/* A darker pink outline */ /* A darker pink outline */
outline-color: hsla(0, 100%, 50%, 0.5); outline-color: hsla(0, 100%, 50%, 0.5);
/* A light pink background color */ /* A light pink background color */
background-color: hsla(0, 100%, 50%, 0.4); background-color: hsla(0, 100%, 50%, 0.4);
} }
/* Deal with being in an iframe */ /* Deal with being in an iframe */
#appShell #shell-header.iframe { #appShell #shell-header.iframe {
display: none; display: none;
} }
#appShell #shell-footer.iframe { #appShell #shell-footer.iframe {
display: none; display: none;
} }
.iframe .module_header, .iframe .module_header,
.iframe .module_footer { .iframe .module_footer {
display: none; display: none;
} }
/* Remove the background from the body in all cases */ /* Remove the background from the body in all cases */
@@ -551,14 +551,14 @@ html.trusted_access #appShell {
/* } */ /* } */
main { main {
/* background: none; /* background: none;
background-color: hsla(0, 0%, 100%, 0.92); */ background-color: hsla(0, 0%, 100%, 0.92); */
} }
main > section { main > section {
background: none; background: none;
background-color: hsla(0, 0%, 100%, 0.92); background-color: hsla(0, 0%, 100%, 0.92);
padding: 0.5em; padding: 0.5em;
} }
/* @media (min-width: 640px) { /* @media (min-width: 640px) {
@@ -576,36 +576,36 @@ main > section {
} */ } */
.ae_sponsorships { .ae_sponsorships {
/* background: none; */ /* background: none; */
/* background-color: hsla(0, 0%, 100%, 0.92); */ /* background-color: hsla(0, 0%, 100%, 0.92); */
/* background-image: url('https://static.oneskyit.com/c/CHOW/images/CHOW_2024_yellow_background.png'); */ /* background-image: url('https://static.oneskyit.com/c/CHOW/images/CHOW_2024_yellow_background.png'); */
/* background-size: cover; */ /* background-size: cover; */
} }
pre.pre_wrap { pre.pre_wrap {
white-space: pre-wrap; white-space: pre-wrap;
word-break: normal; word-break: normal;
word-wrap: normal; word-wrap: normal;
border: none; border: none;
max-width: 100%; max-width: 100%;
overflow-x: auto; overflow-x: auto;
} }
input.required { input.required {
/* border-right: solid medium var(--color-warning-500); */ /* border-right: solid medium var(--color-warning-500); */
/* color: var(--color-warning-500); */ /* color: var(--color-warning-500); */
} }
input:required { input:required {
/* background-color: var(--alert-color-lightest); */ /* background-color: var(--alert-color-lightest); */
/* border: solid 2px red; */ /* border: solid 2px red; */
/* outline: dashed thin var(--alert-color-lighter); */ /* outline: dashed thin var(--alert-color-lighter); */
/* border-right: solid medium var(--alert-color-mid); */ /* border-right: solid medium var(--alert-color-mid); */
/* border-right: solid medium var(--warning-color-mid); */ /* border-right: solid medium var(--warning-color-mid); */
/* border-right: solid medium var(--error-color-mid); */ /* border-right: solid medium var(--error-color-mid); */
} }
/* input:required:hover { /* input:required:hover {
background-color: var(--alert-color-lighter); background-color: var(--alert-color-lighter);
@@ -623,12 +623,12 @@ input:required {
} */ } */
.input_required::after { .input_required::after {
content: '*'; content: '*';
color: rgb(var(--color-error-500) / 0.9); color: rgb(var(--color-error-500) / 0.9);
position: relative; position: relative;
/* top: 0em; */ /* top: 0em; */
left: 0.25em; left: 0.25em;
} }
/* Make the group a flex row by default */ /* Make the group a flex row by default */
@@ -646,8 +646,8 @@ input:required {
/* Make all button elements except for the fhe last button element not rounded on the right. */ /* Make all button elements except for the fhe last button element not rounded on the right. */
/* These helps with the Skeleton (Tailwind?) button group element. */ /* These helps with the Skeleton (Tailwind?) button group element. */
.btn-group button { .btn-group button {
border-radius: 0; border-radius: 0;
border: none; border: none;
} }
/* .md:btn-group button, /* .md:btn-group button,
@@ -669,167 +669,167 @@ div.btn-group button:last-child {
} }
.ae_obj_prop .value { .ae_obj_prop .value {
font-weight: bold; font-weight: bold;
} }
.ae_md_hide { .ae_md_hide {
/* outline: medium dashed green; */ /* outline: medium dashed green; */
/* display: none; */ /* display: none; */
} }
@media (max-width: 767px) { @media (max-width: 767px) {
.ae_md_hide { .ae_md_hide {
/* outline: medium dashed red; */ /* outline: medium dashed red; */
display: none; display: none;
} }
} }
@media (min-width: 768px) { @media (min-width: 768px) {
.ae_lg_hide { .ae_lg_hide {
/* outline: medium dashed blue; */ /* outline: medium dashed blue; */
display: none; display: none;
} }
} }
/* Use the div.ae_quick_modal_container to block background clicks when using the section.ae_quick_popover. */ /* Use the div.ae_quick_modal_container to block background clicks when using the section.ae_quick_popover. */
div.ae_quick_modal_container { div.ae_quick_modal_container {
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
z-index: 100; z-index: 100;
background-color: hsla(0, 0%, 0%, 0.5); background-color: hsla(0, 0%, 0%, 0.5);
} }
/* The section.ae_quick_popover should be above the rest of the content and centered on the page. */ /* The section.ae_quick_popover should be above the rest of the content and centered on the page. */
section.ae_quick_popover { section.ae_quick_popover {
position: fixed; position: fixed;
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
z-index: 100; z-index: 100;
background-color: hsla(0, 0%, 100%, 0.95); background-color: hsla(0, 0%, 100%, 0.95);
padding: 1rem; padding: 1rem;
border-radius: 0.5rem; border-radius: 0.5rem;
box-shadow: 0 0 1rem hsla(0, 0%, 0%, 0.5); box-shadow: 0 0 1rem hsla(0, 0%, 0%, 0.5);
min-height: 98%; min-height: 98%;
min-width: 98%; min-width: 98%;
} }
section.ae_quick_popover_small { section.ae_quick_popover_small {
position: fixed; position: fixed;
top: 1em; top: 1em;
left: 50%; left: 50%;
transform: translate(-50%, 0%); transform: translate(-50%, 0%);
z-index: 100; z-index: 100;
background-color: hsla(0, 0%, 100%, 0.95); background-color: hsla(0, 0%, 100%, 0.95);
padding: 1rem; padding: 1rem;
border-radius: 0.5rem; border-radius: 0.5rem;
box-shadow: 0 0 1rem hsla(0, 0%, 0%, 0.5); box-shadow: 0 0 1rem hsla(0, 0%, 0%, 0.5);
min-height: 24rem; min-height: 24rem;
max-height: 95%; max-height: 95%;
min-width: 50%; min-width: 50%;
max-width: 95%; max-width: 95%;
} }
.fade_50 { .fade_50 {
opacity: 0.5; opacity: 0.5;
} }
.fade_50:hover { .fade_50:hover {
opacity: 1; opacity: 1;
} }
.auth_view_only { .auth_view_only {
display: none; display: none;
} }
.ae_root--auth_access .auth_view_only { .ae_root--auth_access .auth_view_only {
display: initial; display: initial;
} }
img.qr_code { img.qr_code {
/* outline: solid thin hsla(30, 100%, 50%, .1); */ /* outline: solid thin hsla(30, 100%, 50%, .1); */
/* width: 1.50in; */ /* width: 1.50in; */
} }
img.qr_code:hover { img.qr_code:hover {
/* outline: solid thin green; */ /* outline: solid thin green; */
/* width: 2.50in; */ /* width: 2.50in; */
} }
img.qr_code:focus { img.qr_code:focus {
/* outline: solid thin red; */ /* outline: solid thin red; */
/* width: 2.50in; */ /* width: 2.50in; */
} }
.dim { .dim {
opacity: 0.5; opacity: 0.5;
color: hsla(0, 0%, 50%, 0.95); color: hsla(0, 0%, 50%, 0.95);
} }
.dim_warning { .dim_warning {
opacity: 0.5; opacity: 0.5;
/* color: hsla(0, 100%, 50%, .95); */ /* color: hsla(0, 100%, 50%, .95); */
/* background should be hash marks */ /* background should be hash marks */
background-image: repeating-linear-gradient( background-image: repeating-linear-gradient(
-45deg, -45deg,
hsla(0, 100%, 50%, 0.25), hsla(0, 100%, 50%, 0.25),
hsla(0, 100%, 50%, 0.25) 10px, hsla(0, 100%, 50%, 0.25) 10px,
transparent 10px, transparent 10px,
transparent 20px transparent 20px
); );
} }
.alert { .alert {
/* background-color: hsla(0, 100%, 50%, .1); */ /* background-color: hsla(0, 100%, 50%, .1); */
outline: dashed thin hsla(0, 100%, 50%, 0.5); outline: dashed thin hsla(0, 100%, 50%, 0.5);
} }
@media (max-width: 767px) { @media (max-width: 767px) {
.sk_header.hide_sm { .sk_header.hide_sm {
display: none; display: none;
} }
.sk_header.show_sm { .sk_header.show_sm {
display: initial; display: initial;
} }
.sk_header.show_md { .sk_header.show_md {
display: none; display: none;
} }
} }
@media (min-width: 768px) { @media (min-width: 768px) {
.sk_header.hide_md { .sk_header.hide_md {
display: none; display: none;
} }
.sk_header.show_md { .sk_header.show_md {
display: initial; display: initial;
} }
.sk_header.show_sm { .sk_header.show_sm {
display: none; display: none;
} }
} }
/* We need to reset many of the styles for the reset_css class. */ /* We need to reset many of the styles for the reset_css class. */
.reset_css p { .reset_css p {
margin: 0.75em 0; margin: 0.75em 0;
} }
.reset_css ol { .reset_css ol {
list-style-type: decimal; list-style-type: decimal;
} }
.reset_css ul { .reset_css ul {
list-style-type: disc; list-style-type: disc;
} }
.reset_css li { .reset_css li {
margin-left: 1.5em; margin-left: 1.5em;
} }
/* Reset anchor tags to the default color and underline. */ /* Reset anchor tags to the default color and underline. */
.reset_css a { .reset_css a {
color: hsla(210, 100%, 50%, 1); color: hsla(210, 100%, 50%, 1);
text-decoration: underline; text-decoration: underline;
} }
.reset_css a:hover { .reset_css a:hover {
color: hsla(210, 100%, 50%, 0.75); color: hsla(210, 100%, 50%, 0.75);
text-decoration: none; text-decoration: none;
} }
/* .ae_btn.btn-danger, /* .ae_btn.btn-danger,
@@ -856,86 +856,86 @@ img.qr_code:focus {
/* BEGIN: Overrides and fixes specific to Novi and IDAA */ /* BEGIN: Overrides and fixes specific to Novi and IDAA */
.iframe .novi_btn { .iframe .novi_btn {
border-radius: 60px; border-radius: 60px;
/* border-color: hsla(0, 0%, 50%, .5); */ /* border-color: hsla(0, 0%, 50%, .5); */
/* border-color: hsla(0, 0%, 0%, .15); */ /* border-color: hsla(0, 0%, 0%, .15); */
} }
.iframe .novi_m0 { .iframe .novi_m0 {
margin: 0; margin: 0;
} }
.iframe .novi_p0 { .iframe .novi_p0 {
padding: 0; padding: 0;
} }
.iframe .dark .novi_label { .iframe .dark .novi_label {
color: white; color: white;
} }
.iframe .dark .novi_black { .iframe .dark .novi_black {
color: black; color: black;
} }
.iframe .dark .novi_white { .iframe .dark .novi_white {
color: white; color: white;
} }
.iframe .dark .novi_bg_black { .iframe .dark .novi_bg_black {
background-color: black; background-color: black;
} }
.iframe .dark .novi_bg_white { .iframe .dark .novi_bg_white {
background-color: white; background-color: white;
} }
.iframe .dark .novi_bg_gray { .iframe .dark .novi_bg_gray {
background-color: hsla(0, 0%, 50%, 1); background-color: hsla(0, 0%, 50%, 1);
} }
.iframe .dark .novi_bg_light_gray { .iframe .dark .novi_bg_light_gray {
background-color: hsla(0, 0%, 95%, 1); background-color: hsla(0, 0%, 95%, 1);
} }
.iframe .dark .novi_bg_dark_gray { .iframe .dark .novi_bg_dark_gray {
background-color: hsla(0, 0%, 20%, 1); background-color: hsla(0, 0%, 20%, 1);
} }
.iframe .novi_bg_light { .iframe .novi_bg_light {
background-color: hsla(0, 0%, 0%, 0.15); background-color: hsla(0, 0%, 0%, 0.15);
color: hsla(0, 0%, 20%, 1); color: hsla(0, 0%, 20%, 1);
} }
.iframe .novi_bg_dark { .iframe .novi_bg_dark {
background-color: hsla(0, 0%, 0%, 0.25); background-color: hsla(0, 0%, 0%, 0.25);
color: hsla(0, 0%, 95%, 1); color: hsla(0, 0%, 95%, 1);
} }
.iframe .novi_margin_sm { .iframe .novi_margin_sm {
/* margin: 0.5em; */ /* margin: 0.5em; */
} }
.iframe .novi_text_wrap { .iframe .novi_text_wrap {
/* white-space: normal; */ /* white-space: normal; */
white-space: pre-wrap; white-space: pre-wrap;
word-break: break-word; word-break: break-word;
} }
/* END: Overrides and fixes specific to Novi and IDAA */ /* END: Overrides and fixes specific to Novi and IDAA */
.iframe button.ae_normal, .iframe button.ae_normal,
.iframe .btn.ae_normal { .iframe .btn.ae_normal {
/* font: normal 1em sans-serif; */ /* font: normal 1em sans-serif; */
font-size: 1rem; font-size: 1rem;
} }
.iframe button.ae_smaller, .iframe button.ae_smaller,
.iframe .btn.ae_smaller, .iframe .btn.ae_smaller,
.iframe button.novi_smaller, .iframe button.novi_smaller,
.iframe .btn.novi_smaller { .iframe .btn.novi_smaller {
font-size: 0.8rem; font-size: 0.8rem;
} }
.iframe button.ae_smallest, .iframe button.ae_smallest,
.iframe .btn.ae_smallest, .iframe .btn.ae_smallest,
.iframe button.novi_smallest, .iframe button.novi_smallest,
.iframe .btn.novi_smallest { .iframe .btn.novi_smallest {
font-size: 0.65rem; font-size: 0.65rem;
} }

8
src/app.d.ts vendored
View File

@@ -2,8 +2,8 @@
// for information about these interfaces // for information about these interfaces
// and what to do when importing types // and what to do when importing types
declare namespace App { declare namespace App {
// interface Locals {} // interface Locals {}
// interface PageData {} // interface PageData {}
// interface Error {} // interface Error {}
// interface Platform {} // interface Platform {}
} }

View File

@@ -1,43 +1,43 @@
<!doctype html> <!doctype html>
<html lang="en" class="light" data-theme=""> <html lang="en" class="light" data-theme="">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" />
<link rel="manifest" href="%sveltekit.assets%/manifest.json" /> <link rel="manifest" href="%sveltekit.assets%/manifest.json" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.gstatic.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" />
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link <link
href="https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap" href="https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap"
rel="stylesheet" rel="stylesheet"
/> />
<link <link
href="https://fonts.googleapis.com/css2?family=Noto+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap" href="https://fonts.googleapis.com/css2?family=Noto+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap"
rel="stylesheet" rel="stylesheet"
/> />
<link <link
href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap" href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap"
rel="stylesheet" rel="stylesheet"
/> />
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"
integrity="sha512-1ycn6IcaQQ40/MKBW2W4Rhis/DbILU74C1vSrLJxCq57o941Ym01SwNsOMqvEBFlcgUa6xLiPY/NS5R+E6ztJQ==" integrity="sha512-1ycn6IcaQQ40/MKBW2W4Rhis/DbILU74C1vSrLJxCq57o941Ym01SwNsOMqvEBFlcgUa6xLiPY/NS5R+E6ztJQ=="
crossorigin="anonymous" crossorigin="anonymous"
referrerpolicy="no-referrer" referrerpolicy="no-referrer"
/> />
<!-- <link href="app.css" rel="stylesheet"> --> <!-- <link href="app.css" rel="stylesheet"> -->
%sveltekit.head% %sveltekit.head%
</head> </head>
<!-- h-full w-full overflow-auto --> <!-- h-full w-full overflow-auto -->
<!-- overflow-x-scroll --> <!-- overflow-x-scroll -->
<body data-sveltekit-preload-data="hover" class="h-full w-full"> <body data-sveltekit-preload-data="hover" class="h-full w-full">
<div style="display: contents" class="">%sveltekit.body%</div> <div style="display: contents" class="">%sveltekit.body%</div>
</body> </body>
</html> </html>

View File

@@ -1,7 +1,7 @@
import { describe, it, expect } from 'vitest'; import { describe, it, expect } from 'vitest';
describe('sum test', () => { describe('sum test', () => {
it('adds 1 + 2 to equal 3', () => { it('adds 1 + 2 to equal 3', () => {
expect(1 + 2).toBe(3); expect(1 + 2).toBe(3);
}); });
}); });

View File

@@ -2,129 +2,129 @@
// Updated 2024-05-23 // Updated 2024-05-23
export const delete_object = async function delete_object({ export const delete_object = async function delete_object({
api_cfg = null, api_cfg = null,
endpoint = '', endpoint = '',
params = {}, params = {},
data = {}, data = {},
return_meta = false, return_meta = false,
log_lvl = 0, log_lvl = 0,
retry_count = 5 // Number of retry attempts retry_count = 5 // Number of retry attempts
}: { }: {
api_cfg: any; api_cfg: any;
endpoint: string; endpoint: string;
params?: any; params?: any;
data?: any; data?: any;
return_meta?: boolean; return_meta?: boolean;
log_lvl?: number; log_lvl?: number;
retry_count?: number; retry_count?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** delete_object() *** Endpoint: ${endpoint}`); console.log(`*** delete_object() *** Endpoint: ${endpoint}`);
console.log('Params:', params); console.log('Params:', params);
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Data:', data); console.log('Data:', data);
} }
} }
if (!api_cfg) { if (!api_cfg) {
console.error('No API Config was provided. Returning false.'); console.error('No API Config was provided. Returning false.');
return false; return false;
} }
// Construct the URL with query parameters // Construct the URL with query parameters
const url = new URL(endpoint, api_cfg['base_url']); const url = new URL(endpoint, api_cfg['base_url']);
Object.keys(params).forEach((key) => url.searchParams.append(key, params[key])); Object.keys(params).forEach((key) => url.searchParams.append(key, params[key]));
// Clean the headers // Clean the headers
const headers_cleaned: Record<string, string> = {}; const headers_cleaned: Record<string, string> = {};
for (const prop in api_cfg['headers']) { for (const prop in api_cfg['headers']) {
const prop_cleaned = prop.replaceAll('_', '-'); const prop_cleaned = prop.replaceAll('_', '-');
headers_cleaned[prop_cleaned] = api_cfg['headers'][prop]; headers_cleaned[prop_cleaned] = api_cfg['headers'][prop];
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Cleaned Headers:', headers_cleaned); console.log('Cleaned Headers:', headers_cleaned);
} }
const fetchOptions: RequestInit = { const fetchOptions: RequestInit = {
method: 'DELETE', method: 'DELETE',
headers: { headers: {
...headers_cleaned, ...headers_cleaned,
'Content-Type': 'application/json' 'Content-Type': 'application/json'
}, },
body: JSON.stringify(data) body: JSON.stringify(data)
}; };
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Fetch Options:', fetchOptions); console.log('Fetch Options:', fetchOptions);
} }
for (let attempt = 1; attempt <= retry_count; attempt++) { for (let attempt = 1; attempt <= retry_count; attempt++) {
try { try {
const response = await fetch(url.toString(), fetchOptions); const response = await fetch(url.toString(), fetchOptions);
if (log_lvl) { if (log_lvl) {
console.log(`Response: status=${response.status} attempt=${attempt}`); console.log(`Response: status=${response.status} attempt=${attempt}`);
} }
if (!response.ok) { if (!response.ok) {
if (response.status === 404) { if (response.status === 404) {
console.warn('404 Not Found. Returning null.'); console.warn('404 Not Found. Returning null.');
return null; // Returning null since there were no results return null; // Returning null since there were no results
} }
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);
} }
const json = await response.json(); const json = await response.json();
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Response JSON:', json); console.log('Response JSON:', json);
} }
// Return the response data or metadata // Return the response data or metadata
return return_meta ? json : json.data; return return_meta ? json : json.data;
} catch (error) { } catch (error) {
console.error(`API DELETE error on attempt ${attempt}:`, error); console.error(`API DELETE error on attempt ${attempt}:`, error);
// If this is the last attempt, return false // If this is the last attempt, return false
if (attempt === retry_count) { if (attempt === retry_count) {
console.error('Max retry attempts reached. Returning false.'); console.error('Max retry attempts reached. Returning false.');
return false; return false;
} }
// Log retry information // Log retry information
if (log_lvl) { if (log_lvl) {
console.log(`Retrying... (${attempt}/${retry_count})`); console.log(`Retrying... (${attempt}/${retry_count})`);
} }
} }
} }
// https://stackoverflow.com/questions/51069552/axios-delete-request-with-body-and-headers // https://stackoverflow.com/questions/51069552/axios-delete-request-with-body-and-headers
// let axios_api = axios.create({ // let axios_api = axios.create({
// baseURL: api_cfg['base_url'], // baseURL: api_cfg['base_url'],
// // timeout: 2000, // // timeout: 2000,
// /* other custom settings */ // /* other custom settings */
// }); // });
// axios_api.defaults.headers = api_cfg['headers']; // axios_api.defaults.headers = api_cfg['headers'];
// //OLD: axios_api.delete(endpoint, { 'data': data }) // //OLD: axios_api.delete(endpoint, { 'data': data })
// let response_data = await axios_api.delete(endpoint, { params: params, 'data': data }) // let response_data = await axios_api.delete(endpoint, { params: params, 'data': data })
// .then(function (response) { // .then(function (response) {
// console.log(response.data); // console.log(response.data);
// return response.data; // return response.data;
// }) // })
// .catch(function (error: any) { // .catch(function (error: any) {
// if (error.response && error.response.status === 404) { // if (error.response && error.response.status === 404) {
// return null; // Returning null since there were no results // return null; // Returning null since there were no results
// } // }
// console.log(error); // console.log(error);
// return false; // Returning false since something may have gone wrong. Also more in line with what the API returns. // return false; // Returning false since something may have gone wrong. Also more in line with what the API returns.
// // return error; // // return error;
// }); // });
// if (log_lvl > 1) { // if (log_lvl > 1) {
// console.log(response_data); // console.log(response_data);
// } // }
// return response_data; // return response_data;
}; };

View File

@@ -3,170 +3,170 @@ import { get_object } from './api_get_object';
// Updated 2023-12-01 // Updated 2023-12-01
export async function get_ae_obj_id_crud({ export async function get_ae_obj_id_crud({
api_cfg, api_cfg,
no_account_id = false, no_account_id = false,
obj_type, obj_type,
obj_id, obj_id,
use_alt_table = false, use_alt_table = false,
use_alt_base = false, use_alt_base = false,
inc = {}, inc = {},
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 999999, limit = 999999,
offset = 0, offset = 0,
data = {}, data = {},
// key, // key,
// jwt = null, // jwt = null,
headers = {}, headers = {},
params = {}, params = {},
timeout = 25000, timeout = 25000,
return_meta = false, return_meta = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
no_account_id?: boolean; no_account_id?: boolean;
obj_type: string; obj_type: string;
obj_id: string; obj_id: string;
use_alt_table?: boolean; use_alt_table?: boolean;
use_alt_base?: boolean; use_alt_base?: boolean;
inc?: any; inc?: any;
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
data?: any; data?: any;
// key: string, // key: string,
// jwt?: string, // jwt?: string,
headers?: any; headers?: any;
params?: key_val; params?: key_val;
timeout?: number; timeout?: number;
return_meta?: boolean; return_meta?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log('*** get_ae_obj_id_crud() ***'); console.log('*** get_ae_obj_id_crud() ***');
} }
// data = {}; // data = {};
// data['super_key'] = key; // data['super_key'] = key;
// data['jwt'] = jwt; // data['jwt'] = jwt;
// NOTE: The key and or JWT should be in the header of the DELETE, GET, PATCH, POST // NOTE: The key and or JWT should be in the header of the DELETE, GET, PATCH, POST
let endpoint = ''; let endpoint = '';
if (obj_type == 'account') { if (obj_type == 'account') {
endpoint = `/crud/account/${obj_id}`; endpoint = `/crud/account/${obj_id}`;
} else if (obj_type == 'address') { } else if (obj_type == 'address') {
endpoint = `/crud/address/${obj_id}`; endpoint = `/crud/address/${obj_id}`;
} else if (obj_type == 'archive') { } else if (obj_type == 'archive') {
endpoint = `/crud/archive/${obj_id}`; endpoint = `/crud/archive/${obj_id}`;
} else if (obj_type == 'archive_content') { } else if (obj_type == 'archive_content') {
endpoint = `/crud/archive/content/${obj_id}`; endpoint = `/crud/archive/content/${obj_id}`;
} else if (obj_type == 'contact') { } else if (obj_type == 'contact') {
endpoint = `/crud/contact/${obj_id}`; endpoint = `/crud/contact/${obj_id}`;
} else if (obj_type == 'data_store') { } else if (obj_type == 'data_store') {
endpoint = `/crud/data_store/${obj_id}`; endpoint = `/crud/data_store/${obj_id}`;
} else if (obj_type == 'event') { } else if (obj_type == 'event') {
endpoint = `/crud/event/${obj_id}`; endpoint = `/crud/event/${obj_id}`;
} else if (obj_type == 'event_abstract') { } else if (obj_type == 'event_abstract') {
endpoint = `/crud/event/abstract/${obj_id}`; endpoint = `/crud/event/abstract/${obj_id}`;
} else if (obj_type == 'event_badge') { } else if (obj_type == 'event_badge') {
endpoint = `/crud/event/badge/${obj_id}`; endpoint = `/crud/event/badge/${obj_id}`;
} else if (obj_type == 'event_device') { } else if (obj_type == 'event_device') {
endpoint = `/crud/event/device/${obj_id}`; endpoint = `/crud/event/device/${obj_id}`;
} else if (obj_type == 'event_exhibit') { } else if (obj_type == 'event_exhibit') {
endpoint = `/crud/event/exhibit/${obj_id}`; endpoint = `/crud/event/exhibit/${obj_id}`;
} else if (obj_type == 'event_exhibit_tracking') { } else if (obj_type == 'event_exhibit_tracking') {
endpoint = `/crud/event/exhibit/tracking/${obj_id}`; endpoint = `/crud/event/exhibit/tracking/${obj_id}`;
} else if (obj_type == 'event_file') { } else if (obj_type == 'event_file') {
endpoint = `/crud/event/file/${obj_id}`; endpoint = `/crud/event/file/${obj_id}`;
} else if (obj_type == 'event_location') { } else if (obj_type == 'event_location') {
endpoint = `/crud/event/location/${obj_id}`; endpoint = `/crud/event/location/${obj_id}`;
} else if (obj_type == 'event_person') { } else if (obj_type == 'event_person') {
endpoint = `/crud/event/person/${obj_id}`; endpoint = `/crud/event/person/${obj_id}`;
} else if (obj_type == 'event_presentation') { } else if (obj_type == 'event_presentation') {
endpoint = `/crud/event/presentation/${obj_id}`; endpoint = `/crud/event/presentation/${obj_id}`;
} else if (obj_type == 'event_presenter') { } else if (obj_type == 'event_presenter') {
endpoint = `/crud/event/presenter/${obj_id}`; endpoint = `/crud/event/presenter/${obj_id}`;
} else if (obj_type == 'event_session') { } else if (obj_type == 'event_session') {
endpoint = `/crud/event/session/${obj_id}`; endpoint = `/crud/event/session/${obj_id}`;
} else if (obj_type == 'event_track') { } else if (obj_type == 'event_track') {
endpoint = `/crud/event/track/${obj_id}`; endpoint = `/crud/event/track/${obj_id}`;
} else if (obj_type == 'grant') { } else if (obj_type == 'grant') {
endpoint = `/crud/grant/${obj_id}`; endpoint = `/crud/grant/${obj_id}`;
} else if (obj_type == 'hosted_file') { } else if (obj_type == 'hosted_file') {
endpoint = `/crud/hosted_file/${obj_id}`; endpoint = `/crud/hosted_file/${obj_id}`;
} else if (obj_type == 'journal') { } else if (obj_type == 'journal') {
endpoint = `/crud/journal/${obj_id}`; endpoint = `/crud/journal/${obj_id}`;
} else if (obj_type == 'journal_entry') { } else if (obj_type == 'journal_entry') {
endpoint = `/crud/journal/entry/${obj_id}`; endpoint = `/crud/journal/entry/${obj_id}`;
} else if (obj_type == 'order') { } else if (obj_type == 'order') {
endpoint = `/crud/order/${obj_id}`; endpoint = `/crud/order/${obj_id}`;
} else if (obj_type == 'order_line') { } else if (obj_type == 'order_line') {
endpoint = `/crud/order/line/${obj_id}`; endpoint = `/crud/order/line/${obj_id}`;
} else if (obj_type == 'page') { } else if (obj_type == 'page') {
endpoint = `/crud/page/${obj_id}`; endpoint = `/crud/page/${obj_id}`;
} else if (obj_type == 'person') { } else if (obj_type == 'person') {
endpoint = `/crud/person/${obj_id}`; endpoint = `/crud/person/${obj_id}`;
} else if (obj_type == 'post') { } else if (obj_type == 'post') {
endpoint = `/crud/post/${obj_id}`; endpoint = `/crud/post/${obj_id}`;
} else if (obj_type == 'post_comment') { } else if (obj_type == 'post_comment') {
endpoint = `/crud/post/comment/${obj_id}`; endpoint = `/crud/post/comment/${obj_id}`;
} else if (obj_type == 'site') { } else if (obj_type == 'site') {
endpoint = `/crud/site/${obj_id}`; endpoint = `/crud/site/${obj_id}`;
} else if (obj_type == 'site_domain') { } else if (obj_type == 'site_domain') {
endpoint = `/crud/site/domain/${obj_id}`; endpoint = `/crud/site/domain/${obj_id}`;
} else if (obj_type == 'sponsorship_cfg') { } else if (obj_type == 'sponsorship_cfg') {
endpoint = `/crud/sponsorship/cfg/${obj_id}`; endpoint = `/crud/sponsorship/cfg/${obj_id}`;
} else if (obj_type == 'sponsorship') { } else if (obj_type == 'sponsorship') {
endpoint = `/crud/sponsorship/${obj_id}`; endpoint = `/crud/sponsorship/${obj_id}`;
// } else if (obj_type == 'user') { // } else if (obj_type == 'user') {
// endpoint = `/crud/user/${obj_id}`; // endpoint = `/crud/user/${obj_id}`;
} else { } else {
console.log(`Unknown object type: ${obj_type}`); console.log(`Unknown object type: ${obj_type}`);
return false; return false;
} }
if (log_lvl) { if (log_lvl) {
console.log('Endpoint:', endpoint); console.log('Endpoint:', endpoint);
} }
params['use_alt_table'] = use_alt_table; params['use_alt_table'] = use_alt_table;
params['use_alt_base'] = use_alt_base; params['use_alt_base'] = use_alt_base;
if (log_lvl) { if (log_lvl) {
console.log('Params:', params); console.log('Params:', params);
} }
if (no_account_id) { if (no_account_id) {
headers['x-no-account-id'] = 'Nothing to See Here'; headers['x-no-account-id'] = 'Nothing to See Here';
delete headers['x-account-id']; delete headers['x-account-id'];
delete api_cfg['headers']['x-account-id']; delete api_cfg['headers']['x-account-id'];
// headers['x-account-id'] = null; // headers['x-account-id'] = null;
// headers['x-account-id'] = '_XY7DXtc9Mxx'; // headers['x-account-id'] = '_XY7DXtc9Mxx';
// params['x_no_account_id_token'] = 'Nothing to See Here'; // params['x_no_account_id_token'] = 'Nothing to See Here';
// Remove the x-account-id header // Remove the x-account-id header
// if (headers['x-account-id']) { // if (headers['x-account-id']) {
// delete headers['x-account-id']; // delete headers['x-account-id'];
// } // }
// headers['x-account-id'] = null; // headers['x-account-id'] = null;
// headers['x-no-account-id-token'] = 'Nothing to See Here'; // get_object() will fix the underscores to dashes // headers['x-no-account-id-token'] = 'Nothing to See Here'; // get_object() will fix the underscores to dashes
} }
const object_obj_get_promise = await get_object({ const object_obj_get_promise = await get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
headers: headers, headers: headers,
params: params, params: params,
timeout: timeout, timeout: timeout,
log_lvl: log_lvl log_lvl: log_lvl
}).catch(function (error: any) { }).catch(function (error: any) {
console.log('API GET CRUD object ID request failed.', error); console.log('API GET CRUD object ID request failed.', error);
}); });
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('GET Object result =', object_obj_get_promise); console.log('GET Object result =', object_obj_get_promise);
} }
return object_obj_get_promise; return object_obj_get_promise;
} }

View File

@@ -4,226 +4,226 @@ import { get_object } from './api_get_object';
// The lookup "obj_type" should broken out into a separate function. - 2024-08-07 // The lookup "obj_type" should broken out into a separate function. - 2024-08-07
// Updated 2023-11-15 // Updated 2023-11-15
export async function get_ae_obj_li_for_obj_id_crud({ export async function get_ae_obj_li_for_obj_id_crud({
api_cfg, api_cfg,
obj_type, obj_type,
for_obj_type, for_obj_type,
for_obj_id, // NOTE: Changed 2023-12-06 to no longer required for_obj_id, // NOTE: Changed 2023-12-06 to no longer required
use_alt_table = false, use_alt_table = false,
use_alt_base = false, use_alt_base = false,
// inc = {}, // inc = {},
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
order_by_li = null, order_by_li = null,
limit = 999999, limit = 999999,
offset = 0, offset = 0,
// key, // key,
// jwt = null, // jwt = null,
headers = {}, headers = {},
params_json = null, // NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the API endpoint. Example: { "fulltext_search": { "default_qry_str": "Search string for default", "address_default_qry_str": "Search string for address", "contact_1_default_qry_str": "Search string for contact_1" } } params_json = null, // NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the API endpoint. Example: { "fulltext_search": { "default_qry_str": "Search string for default", "address_default_qry_str": "Search string for address", "contact_1_default_qry_str": "Search string for contact_1" } }
// json_obj = null, // NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the search endpoint. // json_obj = null, // NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the search endpoint.
params = {}, params = {},
return_meta = false, return_meta = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
obj_type: string; obj_type: string;
for_obj_type: null | string; for_obj_type: null | string;
for_obj_id?: string; for_obj_id?: string;
use_alt_table?: boolean; use_alt_table?: boolean;
use_alt_base?: boolean; use_alt_base?: boolean;
// inc?: key_val // inc?: key_val
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
order_by_li?: any; order_by_li?: any;
limit?: number; limit?: number;
offset?: number; offset?: number;
// key: string, // key: string,
// jwt?: string, // jwt?: string,
headers?: any; headers?: any;
params_json?: any; params_json?: any;
// json_obj?: any, // json_obj?: any,
params?: key_val; params?: key_val;
return_meta?: boolean; return_meta?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** get_ae_obj_li_for_obj_id_crud() *** [${obj_type}]`); console.log(`*** get_ae_obj_li_for_obj_id_crud() *** [${obj_type}]`);
} }
// data = {}; // data = {};
// data['super_key'] = key; // data['super_key'] = key;
// data['jwt'] = jwt; // data['jwt'] = jwt;
// NOTE: The key and or JWT should be in the header of the DELETE, GET, PATCH, POST // NOTE: The key and or JWT should be in the header of the DELETE, GET, PATCH, POST
// const endpoint = `/crud/${obj_type}/list`; // const endpoint = `/crud/${obj_type}/list`;
let endpoint = ''; let endpoint = '';
if (obj_type == 'account') { if (obj_type == 'account') {
endpoint = `/crud/account/list`; endpoint = `/crud/account/list`;
} else if (obj_type == 'address') { } else if (obj_type == 'address') {
endpoint = `/crud/address/list`; endpoint = `/crud/address/list`;
} else if (obj_type == 'archive') { } else if (obj_type == 'archive') {
endpoint = `/crud/archive/list`; endpoint = `/crud/archive/list`;
} else if (obj_type == 'archive_content') { } else if (obj_type == 'archive_content') {
endpoint = `/crud/archive/content/list`; endpoint = `/crud/archive/content/list`;
} else if (obj_type == 'contact') { } else if (obj_type == 'contact') {
endpoint = `/crud/contact/list`; endpoint = `/crud/contact/list`;
} else if (obj_type == 'data_store') { } else if (obj_type == 'data_store') {
endpoint = `/crud/data_store/list`; endpoint = `/crud/data_store/list`;
} else if (obj_type == 'event') { } else if (obj_type == 'event') {
endpoint = `/crud/event/list`; endpoint = `/crud/event/list`;
} else if (obj_type == 'event_abstract') { } else if (obj_type == 'event_abstract') {
endpoint = `/crud/event/abstract/list`; endpoint = `/crud/event/abstract/list`;
} else if (obj_type == 'event_badge') { } else if (obj_type == 'event_badge') {
endpoint = `/crud/event/badge/list`; endpoint = `/crud/event/badge/list`;
} else if (obj_type == 'event_device') { } else if (obj_type == 'event_device') {
endpoint = `/crud/event/device/list`; endpoint = `/crud/event/device/list`;
} else if (obj_type == 'event_exhibit') { } else if (obj_type == 'event_exhibit') {
endpoint = `/crud/event/exhibit/list`; endpoint = `/crud/event/exhibit/list`;
} else if (obj_type == 'event_exhibit_tracking') { } else if (obj_type == 'event_exhibit_tracking') {
endpoint = `/crud/event/exhibit/tracking/list`; endpoint = `/crud/event/exhibit/tracking/list`;
} else if (obj_type == 'event_file') { } else if (obj_type == 'event_file') {
endpoint = `/crud/event/file/list`; endpoint = `/crud/event/file/list`;
} else if (obj_type == 'event_location') { } else if (obj_type == 'event_location') {
endpoint = `/crud/event/location/list`; endpoint = `/crud/event/location/list`;
} else if (obj_type == 'event_person') { } else if (obj_type == 'event_person') {
endpoint = `/crud/event/person/list`; endpoint = `/crud/event/person/list`;
} else if (obj_type == 'event_presentation') { } else if (obj_type == 'event_presentation') {
endpoint = `/crud/event/presentation/list`; endpoint = `/crud/event/presentation/list`;
} else if (obj_type == 'event_presenter') { } else if (obj_type == 'event_presenter') {
endpoint = `/crud/event/presenter/list`; endpoint = `/crud/event/presenter/list`;
} else if (obj_type == 'event_session') { } else if (obj_type == 'event_session') {
endpoint = `/crud/event/session/list`; endpoint = `/crud/event/session/list`;
} else if (obj_type == 'event_track') { } else if (obj_type == 'event_track') {
endpoint = `/crud/event/track/list`; endpoint = `/crud/event/track/list`;
} else if (obj_type == 'grant') { } else if (obj_type == 'grant') {
endpoint = `/crud/grant/list`; endpoint = `/crud/grant/list`;
} else if (obj_type == 'hosted_file') { } else if (obj_type == 'hosted_file') {
endpoint = `/crud/hosted_file/list`; endpoint = `/crud/hosted_file/list`;
} else if (obj_type == 'journal') { } else if (obj_type == 'journal') {
endpoint = `/crud/journal/list`; endpoint = `/crud/journal/list`;
} else if (obj_type == 'journal_entry') { } else if (obj_type == 'journal_entry') {
endpoint = `/crud/journal/entry/list`; endpoint = `/crud/journal/entry/list`;
} else if (obj_type == 'order') { } else if (obj_type == 'order') {
endpoint = `/crud/order/list`; endpoint = `/crud/order/list`;
} else if (obj_type == 'order_line') { } else if (obj_type == 'order_line') {
endpoint = `/crud/order/line/list`; endpoint = `/crud/order/line/list`;
} else if (obj_type == 'page') { } else if (obj_type == 'page') {
endpoint = `/crud/page/list`; endpoint = `/crud/page/list`;
} else if (obj_type == 'person') { } else if (obj_type == 'person') {
endpoint = `/crud/person/list`; endpoint = `/crud/person/list`;
} else if (obj_type == 'post') { } else if (obj_type == 'post') {
endpoint = `/crud/post/list`; endpoint = `/crud/post/list`;
} else if (obj_type == 'post_comment') { } else if (obj_type == 'post_comment') {
endpoint = `/crud/post/comment/list`; endpoint = `/crud/post/comment/list`;
} else if (obj_type == 'site') { } else if (obj_type == 'site') {
endpoint = `/crud/site/list`; endpoint = `/crud/site/list`;
} else if (obj_type == 'sponsorship_cfg') { } else if (obj_type == 'sponsorship_cfg') {
endpoint = `/crud/sponsorship/cfg/list`; endpoint = `/crud/sponsorship/cfg/list`;
} else if (obj_type == 'sponsorship') { } else if (obj_type == 'sponsorship') {
endpoint = `/crud/sponsorship/list`; endpoint = `/crud/sponsorship/list`;
// } else if (obj_type == 'user') { // } else if (obj_type == 'user') {
// endpoint = `/crud/user/list`; // endpoint = `/crud/user/list`;
} else if (obj_type == 'lu' && for_obj_type == 'country_subdivision') { } else if (obj_type == 'lu' && for_obj_type == 'country_subdivision') {
endpoint = `/crud/lu/country_subdivision/list`; endpoint = `/crud/lu/country_subdivision/list`;
for_obj_type = null; for_obj_type = null;
} else if (obj_type == 'lu' && for_obj_type == 'country') { } else if (obj_type == 'lu' && for_obj_type == 'country') {
endpoint = `/crud/lu/country/list`; endpoint = `/crud/lu/country/list`;
for_obj_type = null; for_obj_type = null;
} else if (obj_type == 'lu' && for_obj_type == 'time_zone') { } else if (obj_type == 'lu' && for_obj_type == 'time_zone') {
endpoint = `/crud/lu/time_zone/list`; endpoint = `/crud/lu/time_zone/list`;
for_obj_type = null; for_obj_type = null;
} else { } else {
console.log(`Unknown object type: ${obj_type}`); console.log(`Unknown object type: ${obj_type}`);
return false; return false;
} }
if (log_lvl) { if (log_lvl) {
console.log('Endpoint:', endpoint); console.log('Endpoint:', endpoint);
} }
if (for_obj_type) { if (for_obj_type) {
params['for_obj_type'] = for_obj_type; params['for_obj_type'] = for_obj_type;
} }
if (for_obj_id) { if (for_obj_id) {
params['for_obj_id'] = for_obj_id; params['for_obj_id'] = for_obj_id;
} }
params['use_alt_table'] = use_alt_table; params['use_alt_table'] = use_alt_table;
params['use_alt_base'] = use_alt_base; params['use_alt_base'] = use_alt_base;
/* Need to deal with inc params here */ /* Need to deal with inc params here */
const allowed_enabled_list = ['all', 'enabled', 'not_enabled']; const allowed_enabled_list = ['all', 'enabled', 'not_enabled'];
if (allowed_enabled_list.includes(enabled)) { if (allowed_enabled_list.includes(enabled)) {
params['enabled'] = enabled; params['enabled'] = enabled;
} }
const allowed_hidden_list = ['all', 'hidden', 'not_hidden']; const allowed_hidden_list = ['all', 'hidden', 'not_hidden'];
if (allowed_hidden_list.includes(hidden)) { if (allowed_hidden_list.includes(hidden)) {
params['hidden'] = hidden; params['hidden'] = hidden;
} }
// NOTE: The order_by_li variable is in the "headers" because if is a the URL GET params do not handle multiple values very well. Maybe base64 encore in the future or something? Reminder that GET requests should not have a body (no JSON). // NOTE: The order_by_li variable is in the "headers" because if is a the URL GET params do not handle multiple values very well. Maybe base64 encore in the future or something? Reminder that GET requests should not have a body (no JSON).
// NOTE: The order_by_li should be a key value pair of the property/DB field to sort and how to sort (ASC or DESC) // NOTE: The order_by_li should be a key value pair of the property/DB field to sort and how to sort (ASC or DESC)
if (order_by_li) { if (order_by_li) {
if (log_lvl) { if (log_lvl) {
console.log('Order By:', order_by_li); console.log('Order By:', order_by_li);
} }
headers['order_by_li'] = order_by_li; headers['order_by_li'] = order_by_li;
} }
if (limit >= 0) { if (limit >= 0) {
params['limit'] = limit; params['limit'] = limit;
} }
if (offset >= 0) { if (offset >= 0) {
params['offset'] = offset; params['offset'] = offset;
} }
if (params_json) { if (params_json) {
// NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the search endpoint. // NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the search endpoint.
// Max characters for a GET request is 2083. This is a limitation of the browser (Microsoft IE and Edge). // Max characters for a GET request is 2083. This is a limitation of the browser (Microsoft IE and Edge).
if (log_lvl) { if (log_lvl) {
console.log('JSON Object:', params_json); console.log('JSON Object:', params_json);
console.log(JSON.stringify(params_json)); console.log(JSON.stringify(params_json));
} }
// NOTE: "jp" stands for "JSON Params" // NOTE: "jp" stands for "JSON Params"
params['jp'] = encodeURIComponent(JSON.stringify(params_json)); params['jp'] = encodeURIComponent(JSON.stringify(params_json));
if (params['jp'].length > 2083) { if (params['jp'].length > 2083) {
console.log( console.log(
`The JSON object is too large to be used as a GET parameter. The overall max URL length is 2083 characters. Please use the POST endpoint instead. Length = ${params['jp'].length} [THIS DOES NOT EXIST YET]` `The JSON object is too large to be used as a GET parameter. The overall max URL length is 2083 characters. Please use the POST endpoint instead. Length = ${params['jp'].length} [THIS DOES NOT EXIST YET]`
); );
return false; return false;
} }
} }
// if (json_obj) { // if (json_obj) {
// // NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the search endpoint. // // NOTE: This is a JSON object that needs to be safely converted to a string for the params. This is used for the search endpoint.
// // Max characters for a GET request is 2083. This is a limitation of the browser (Microsoft IE and Edge). // // Max characters for a GET request is 2083. This is a limitation of the browser (Microsoft IE and Edge).
// console.log('JSON Object:', json_obj); // console.log('JSON Object:', json_obj);
// params['json_str'] = encodeURIComponent(JSON.stringify(json_obj)); // params['json_str'] = encodeURIComponent(JSON.stringify(json_obj));
// if (params['json_str'].length > 2083) { // if (params['json_str'].length > 2083) {
// console.log(`The JSON object is too large to be used as a GET parameter. The overall max URL length is 2083 characters. Please use the POST endpoint instead. Length = ${params['json_str'].length} [THIS DOES NOT EXIST YET]`); // console.log(`The JSON object is too large to be used as a GET parameter. The overall max URL length is 2083 characters. Please use the POST endpoint instead. Length = ${params['json_str'].length} [THIS DOES NOT EXIST YET]`);
// return false; // return false;
// } // }
// } // }
if (log_lvl) { if (log_lvl) {
console.log('Params:', params); console.log('Params:', params);
} }
const object_li_get_promise = await get_object({ const object_li_get_promise = await get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
headers: headers, headers: headers,
params: params, params: params,
return_meta: return_meta, return_meta: return_meta,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(object_li_get_promise); console.log(object_li_get_promise);
} }
return object_li_get_promise; return object_li_get_promise;
} }

View File

@@ -3,172 +3,172 @@ import { get_object } from './api_get_object';
// Refactored 2025-11-13 to use a lookup map for endpoints. // Refactored 2025-11-13 to use a lookup map for endpoints.
const objTypeToEndpointMap: Record<string, string> = { const objTypeToEndpointMap: Record<string, string> = {
account: '/crud/account/list', account: '/crud/account/list',
address: '/crud/address/list', address: '/crud/address/list',
archive: '/crud/archive/list', archive: '/crud/archive/list',
archive_content: '/crud/archive/content/list', archive_content: '/crud/archive/content/list',
contact: '/crud/contact/list', contact: '/crud/contact/list',
data_store: '/crud/data_store/list', data_store: '/crud/data_store/list',
event: '/crud/event/list', event: '/crud/event/list',
event_abstract: '/crud/event/abstract/list', event_abstract: '/crud/event/abstract/list',
event_badge: '/crud/event/badge/list', event_badge: '/crud/event/badge/list',
event_badge_template: '/crud/event/badge/template/list', event_badge_template: '/crud/event/badge/template/list',
event_device: '/crud/event/device/list', event_device: '/crud/event/device/list',
event_exhibit: '/crud/event/exhibit/list', event_exhibit: '/crud/event/exhibit/list',
event_exhibit_tracking: '/crud/event/exhibit/tracking/list', event_exhibit_tracking: '/crud/event/exhibit/tracking/list',
event_file: '/crud/event/file/list', event_file: '/crud/event/file/list',
event_location: '/crud/event/location/list', event_location: '/crud/event/location/list',
event_person: '/crud/event/person/list', event_person: '/crud/event/person/list',
event_presentation: '/crud/event/presentation/list', event_presentation: '/crud/event/presentation/list',
event_presenter: '/crud/event/presenter/list', event_presenter: '/crud/event/presenter/list',
event_session: '/crud/event/session/list', event_session: '/crud/event/session/list',
event_track: '/crud/event/track/list', event_track: '/crud/event/track/list',
grant: '/crud/grant/list', grant: '/crud/grant/list',
hosted_file: '/crud/hosted_file/list', hosted_file: '/crud/hosted_file/list',
journal: '/crud/journal/list', journal: '/crud/journal/list',
journal_entry: '/crud/journal/entry/list', journal_entry: '/crud/journal/entry/list',
order: '/crud/order/list', order: '/crud/order/list',
order_line: '/crud/order/line/list', order_line: '/crud/order/line/list',
page: '/crud/page/list', page: '/crud/page/list',
person: '/crud/person/list', person: '/crud/person/list',
post: '/crud/post/list', post: '/crud/post/list',
post_comment: '/crud/post/comment/list', post_comment: '/crud/post/comment/list',
site: '/crud/site/list', site: '/crud/site/list',
sponsorship_cfg: '/crud/sponsorship/cfg/list', sponsorship_cfg: '/crud/sponsorship/cfg/list',
sponsorship: '/crud/sponsorship/list', sponsorship: '/crud/sponsorship/list',
// user: '/crud/user/list', // user: '/crud/user/list',
'lu-country_subdivision': '/crud/lu/country_subdivision/list', 'lu-country_subdivision': '/crud/lu/country_subdivision/list',
'lu-country': '/crud/lu/country/list', 'lu-country': '/crud/lu/country/list',
'lu-time_zone': '/crud/lu/time_zone/list' 'lu-time_zone': '/crud/lu/time_zone/list'
}; };
function getEndpointForObjType(obj_type: string, for_obj_type?: string): string { function getEndpointForObjType(obj_type: string, for_obj_type?: string): string {
if (obj_type === 'lu' && for_obj_type) { if (obj_type === 'lu' && for_obj_type) {
const key = `lu-${for_obj_type}`; const key = `lu-${for_obj_type}`;
const endpoint = objTypeToEndpointMap[key]; const endpoint = objTypeToEndpointMap[key];
if (endpoint) return endpoint; if (endpoint) return endpoint;
} }
const endpoint = objTypeToEndpointMap[obj_type]; const endpoint = objTypeToEndpointMap[obj_type];
if (endpoint) return endpoint; if (endpoint) return endpoint;
throw new Error(`Unknown object type: ${obj_type}`); throw new Error(`Unknown object type: ${obj_type}`);
} }
type OrderBy = { [key: string]: 'ASC' | 'DESC' }; type OrderBy = { [key: string]: 'ASC' | 'DESC' };
interface GetAeObjLiForObjIdCrudV2Params { interface GetAeObjLiForObjIdCrudV2Params {
api_cfg: any; // Consider defining a specific type for api_cfg api_cfg: any; // Consider defining a specific type for api_cfg
obj_type: string; obj_type: string;
for_obj_type: string; for_obj_type: string;
for_obj_id?: string; for_obj_id?: string;
use_alt_tbl?: boolean | string; use_alt_tbl?: boolean | string;
use_alt_mdl?: boolean | string; use_alt_mdl?: boolean | string;
use_alt_exp?: boolean | string; use_alt_exp?: boolean | string;
inc?: key_val; inc?: key_val;
enabled?: 'all' | 'enabled' | 'not_enabled'; enabled?: 'all' | 'enabled' | 'not_enabled';
hidden?: 'all' | 'hidden' | 'not_hidden'; hidden?: 'all' | 'hidden' | 'not_hidden';
order_by_li?: OrderBy[] | null; order_by_li?: OrderBy[] | null;
limit?: number; limit?: number;
offset?: number; offset?: number;
headers?: Record<string, string>; headers?: Record<string, string>;
params_json?: any; params_json?: any;
params?: key_val; params?: key_val;
log_lvl?: number; log_lvl?: number;
} }
export async function get_ae_obj_li_for_obj_id_crud_v2({ export async function get_ae_obj_li_for_obj_id_crud_v2({
api_cfg, api_cfg,
obj_type, obj_type,
for_obj_type, for_obj_type,
for_obj_id, for_obj_id,
use_alt_tbl = false, use_alt_tbl = false,
use_alt_mdl = false, use_alt_mdl = false,
use_alt_exp = false, use_alt_exp = false,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
order_by_li = null, order_by_li = null,
limit = 999999, limit = 999999,
offset = 0, offset = 0,
headers = {}, headers = {},
params_json = null, params_json = null,
params = {}, params = {},
log_lvl = 0 log_lvl = 0
}: GetAeObjLiForObjIdCrudV2Params) { }: GetAeObjLiForObjIdCrudV2Params) {
if (log_lvl) { if (log_lvl) {
console.log('*** get_ae_obj_li_for_obj_id_crud_v2() ***'); console.log('*** get_ae_obj_li_for_obj_id_crud_v2() ***');
} }
try { try {
const endpoint = `/v2${getEndpointForObjType(obj_type, for_obj_type)}`; const endpoint = `/v2${getEndpointForObjType(obj_type, for_obj_type)}`;
if (log_lvl) { if (log_lvl) {
console.log('Endpoint:', endpoint); console.log('Endpoint:', endpoint);
} }
// We need to remove a few parameters from the params object that are not allowed. // We need to remove a few parameters from the params object that are not allowed.
delete params['qry__enabled']; delete params['qry__enabled'];
delete params['qry__hidden']; delete params['qry__hidden'];
delete params['qry__limit']; delete params['qry__limit'];
delete params['qry__offset']; delete params['qry__offset'];
if (for_obj_type) params['for_obj_type'] = for_obj_type; if (for_obj_type) params['for_obj_type'] = for_obj_type;
if (for_obj_id) params['for_obj_id'] = for_obj_id; if (for_obj_id) params['for_obj_id'] = for_obj_id;
if (use_alt_tbl === true) params['tbl_alt'] = 'alt'; if (use_alt_tbl === true) params['tbl_alt'] = 'alt';
if (use_alt_mdl === true) params['mdl_alt'] = 'alt'; if (use_alt_mdl === true) params['mdl_alt'] = 'alt';
if (use_alt_exp === true) params['exp_alt'] = 'alt'; if (use_alt_exp === true) params['exp_alt'] = 'alt';
const allowed_enabled_list = ['all', 'enabled', 'not_enabled']; const allowed_enabled_list = ['all', 'enabled', 'not_enabled'];
if (allowed_enabled_list.includes(enabled)) { if (allowed_enabled_list.includes(enabled)) {
params['enabled'] = enabled; params['enabled'] = enabled;
} }
const allowed_hidden_list = ['all', 'hidden', 'not_hidden']; const allowed_hidden_list = ['all', 'hidden', 'not_hidden'];
if (allowed_hidden_list.includes(hidden)) { if (allowed_hidden_list.includes(hidden)) {
params['hidden'] = hidden; params['hidden'] = hidden;
} }
// NOTE: The order_by_li variable is in the "headers" because URL GET params do not handle complex objects very well. // NOTE: The order_by_li variable is in the "headers" because URL GET params do not handle complex objects very well.
if (order_by_li) { if (order_by_li) {
headers['order_by_li'] = JSON.stringify(order_by_li); headers['order_by_li'] = JSON.stringify(order_by_li);
} }
if (limit > 0) params['limit'] = limit; if (limit > 0) params['limit'] = limit;
if (offset > 0) params['offset'] = offset; if (offset > 0) params['offset'] = offset;
if (params_json) { if (params_json) {
// NOTE: "jp" stands for "JSON Params". This is a JSON object that needs to be safely converted to a string for the params. // NOTE: "jp" stands for "JSON Params". This is a JSON object that needs to be safely converted to a string for the params.
// Max characters for a GET request is ~2000. This is a limitation of the browser. // Max characters for a GET request is ~2000. This is a limitation of the browser.
const json_params_str = encodeURIComponent(JSON.stringify(params_json)); const json_params_str = encodeURIComponent(JSON.stringify(params_json));
if (json_params_str.length > 2083) { if (json_params_str.length > 2083) {
// Using console.error instead of throwing an error to avoid crashing the app for a known limitation. // Using console.error instead of throwing an error to avoid crashing the app for a known limitation.
console.error( console.error(
`The JSON object is too large to be used as a GET parameter. Max length is 2083 characters. Length = ${json_params_str.length}` `The JSON object is too large to be used as a GET parameter. Max length is 2083 characters. Length = ${json_params_str.length}`
); );
return false; return false;
} }
params['jp'] = json_params_str; params['jp'] = json_params_str;
} }
if (log_lvl) { if (log_lvl) {
console.log('Params:', params); console.log('Params:', params);
} }
const object_li_get_promise = await get_object({ const object_li_get_promise = await get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
headers: headers, headers: headers,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(object_li_get_promise); console.log(object_li_get_promise);
} }
return object_li_get_promise; return object_li_get_promise;
} catch (error) { } catch (error) {
console.error('Error in get_ae_obj_li_for_obj_id_crud_v2:', error); console.error('Error in get_ae_obj_li_for_obj_id_crud_v2:', error);
return false; // Or handle the error as appropriate return false; // Or handle the error as appropriate
} }
} }

View File

@@ -7,230 +7,230 @@ export const temp_get_object_percent_completed = 0;
export const get_object_percent_completed = temp_get_object_percent_completed; export const get_object_percent_completed = temp_get_object_percent_completed;
export const get_object = async function get_object({ export const get_object = async function get_object({
api_cfg = null, api_cfg = null,
endpoint = '', endpoint = '',
headers = {}, headers = {},
params = {}, params = {},
data = {}, data = {},
timeout = 60000, timeout = 60000,
return_meta = false, return_meta = false,
return_blob = false, return_blob = false,
filename = '', filename = '',
auto_download = false, auto_download = false,
as_list = false, // Is this still really needed? as_list = false, // Is this still really needed?
// The task_id value should be a random string that is unique to the task. This is used to identify the task in the message event. // The task_id value should be a random string that is unique to the task. This is used to identify the task in the message event.
task_id = crypto.randomUUID(), task_id = crypto.randomUUID(),
log_lvl = 0, log_lvl = 0,
retry_count = 5 // Number of retry attempts retry_count = 5 // Number of retry attempts
}: { }: {
api_cfg: any; api_cfg: any;
endpoint: string; endpoint: string;
headers?: any; headers?: any;
params?: any; params?: any;
data?: any; data?: any;
timeout?: number; timeout?: number;
return_meta?: boolean; return_meta?: boolean;
return_blob?: boolean; return_blob?: boolean;
filename?: null | string; filename?: null | string;
auto_download?: boolean; auto_download?: boolean;
as_list?: boolean; as_list?: boolean;
task_id?: string; task_id?: string;
log_lvl?: number; log_lvl?: number;
retry_count?: number; retry_count?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** get_object() *** Endpoint: ${endpoint} AE Task ID: ${task_id}`); console.log(`*** get_object() *** Endpoint: ${endpoint} AE Task ID: ${task_id}`);
console.log('Params:', params); console.log('Params:', params);
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Data:', data); console.log('Data:', data);
} }
} }
if (!api_cfg) { if (!api_cfg) {
console.log('No API Config was provided. Returning false.'); console.log('No API Config was provided. Returning false.');
return false; return false;
} }
const url = new URL(endpoint, api_cfg['base_url']); const url = new URL(endpoint, api_cfg['base_url']);
Object.keys(params).forEach((key) => url.searchParams.append(key, params[key])); Object.keys(params).forEach((key) => url.searchParams.append(key, params[key]));
const controller = new AbortController(); const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeout); const timeoutId = setTimeout(() => controller.abort(), timeout);
// Remove a header parameter if it is set to null // Remove a header parameter if it is set to null
if ( if (
api_cfg['headers'].hasOwnProperty('x-no-account-id') && api_cfg['headers'].hasOwnProperty('x-no-account-id') &&
api_cfg['headers']['x-no-account-id'] === null api_cfg['headers']['x-no-account-id'] === null
) { ) {
delete api_cfg['headers']['x-no-account-id']; delete api_cfg['headers']['x-no-account-id'];
} }
// Clean the headers // Clean the headers
const headers_cleaned: key_val = {}; const headers_cleaned: key_val = {};
for (const prop in headers) { for (const prop in headers) {
const prop_cleaned = prop.replaceAll('_', '-'); const prop_cleaned = prop.replaceAll('_', '-');
if (typeof headers[prop] != 'string') { if (typeof headers[prop] != 'string') {
headers[prop] = JSON.stringify(headers[prop]); headers[prop] = JSON.stringify(headers[prop]);
} }
headers_cleaned[prop_cleaned] = headers[prop]; headers_cleaned[prop_cleaned] = headers[prop];
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`${prop_cleaned}: ${headers_cleaned[prop_cleaned]}`); console.log(`${prop_cleaned}: ${headers_cleaned[prop_cleaned]}`);
} }
} }
headers = headers_cleaned; headers = headers_cleaned;
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('All headers cleaned:', headers); console.log('All headers cleaned:', headers);
} }
const fetchOptions: RequestInit = { const fetchOptions: RequestInit = {
method: 'GET', method: 'GET',
headers: { headers: {
...api_cfg['headers'], ...api_cfg['headers'],
...headers ...headers
}, },
signal: controller.signal signal: controller.signal
}; };
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Fetch options:', fetchOptions); console.log('Fetch options:', fetchOptions);
} }
let fetch_method: any = fetch; let fetch_method: any = fetch;
if (api_cfg.fetch) { if (api_cfg.fetch) {
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Using custom fetch function from api_cfg!!!'); console.log('Using custom fetch function from api_cfg!!!');
} }
fetch_method = api_cfg.fetch; fetch_method = api_cfg.fetch;
} }
for (let attempt = 1; attempt <= retry_count; attempt++) { for (let attempt = 1; attempt <= retry_count; attempt++) {
try { try {
const response = await fetch_method(url.toString(), fetchOptions).catch(function ( const response = await fetch_method(url.toString(), fetchOptions).catch(function (
error: any error: any
) { ) {
console.log( console.log(
'API GET Object *fetch* request was aborted or failed in an unexpected way.', 'API GET Object *fetch* request was aborted or failed in an unexpected way.',
error error
); );
}); });
clearTimeout(timeoutId); clearTimeout(timeoutId);
if (!response) { if (!response) {
if (log_lvl > 1) { if (log_lvl > 1) {
console.log( console.log(
'API GET Object: Something went wrong with *fetch* request. Returning false? Throwing an error!' 'API GET Object: Something went wrong with *fetch* request. Returning false? Throwing an error!'
); );
} }
throw new Error( throw new Error(
`HTTP fetch request was aborted or failed in an unexpected way! URL = ${url.toString()}` `HTTP fetch request was aborted or failed in an unexpected way! URL = ${url.toString()}`
); // This will allow it to retry ); // This will allow it to retry
// return false; // This will stop the retries // return false; // This will stop the retries
} }
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`Response: status=${response.status} statusText=${response.statusText} url=${response.url} attempt=${attempt}` `Response: status=${response.status} statusText=${response.statusText} url=${response.url} attempt=${attempt}`
); );
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Response:', response); console.log('Response:', response);
} }
if (!response.ok) { if (!response.ok) {
if (response.status === 404) { if (response.status === 404) {
if (log_lvl) { if (log_lvl) {
console.log('The response was a 404 not found "error". Returning null.'); console.log('The response was a 404 not found "error". Returning null.');
} }
return null; return null;
} }
console.log('The response was not ok. Throwing an error!'); console.log('The response was not ok. Throwing an error!');
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);
} }
if (!return_blob) { if (!return_blob) {
const json = await response.json(); const json = await response.json();
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Response JSON:', json); console.log('Response JSON:', json);
} }
if (!Array.isArray(json.data) && as_list) { if (!Array.isArray(json.data) && as_list) {
return [json.data]; return [json.data];
} }
return json.data || json; return json.data || json;
} else { } else {
const reader = response.body?.getReader(); const reader = response.body?.getReader();
const contentLength = +response.headers.get('Content-Length')!; const contentLength = +response.headers.get('Content-Length')!;
let receivedLength = 0; let receivedLength = 0;
const chunks = []; const chunks = [];
while (true) { while (true) {
const { done, value } = await reader!.read(); const { done, value } = await reader!.read();
if (done) break; if (done) break;
chunks.push(value); chunks.push(value);
receivedLength += value.length; receivedLength += value.length;
const percent_completed = Math.round((receivedLength * 100) / contentLength); const percent_completed = Math.round((receivedLength * 100) / contentLength);
if (log_lvl > 1) { if (log_lvl > 1) {
console.log( console.log(
'GET Blob Progress:', 'GET Blob Progress:',
percent_completed, percent_completed,
'Total:', 'Total:',
contentLength, contentLength,
'Loaded:', 'Loaded:',
receivedLength, receivedLength,
'Percent Completed', 'Percent Completed',
percent_completed percent_completed
); );
} }
temp_get_blob_percent_completed = percent_completed; temp_get_blob_percent_completed = percent_completed;
try { try {
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.postMessage( window.postMessage(
{ {
type: 'api_download_blob', type: 'api_download_blob',
status: 'downloading', status: 'downloading',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
filename: filename, filename: filename,
size_total: contentLength, size_total: contentLength,
size_loaded: receivedLength, size_loaded: receivedLength,
percent_completed: percent_completed percent_completed: percent_completed
}, },
'*' '*'
); );
} }
} catch (e) { } catch (e) {
console.error('Error posting message:', e); console.error('Error posting message:', e);
} }
} }
const blob = new Blob(chunks); const blob = new Blob(chunks);
if (auto_download) { if (auto_download) {
const downloadUrl = window.URL.createObjectURL(blob); const downloadUrl = window.URL.createObjectURL(blob);
const link = document.createElement('a'); const link = document.createElement('a');
link.href = downloadUrl; link.href = downloadUrl;
link.setAttribute('download', filename || 'download'); link.setAttribute('download', filename || 'download');
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
link.remove(); link.remove();
return true; return true;
} else { } else {
return blob; return blob;
} }
} }
} catch (error) { } catch (error) {
console.log(`API GET object request *fetch* error on attempt ${attempt}:`, error); console.log(`API GET object request *fetch* error on attempt ${attempt}:`, error);
if (attempt === retry_count) { if (attempt === retry_count) {
console.log('Max retry attempts reached. Returning false.'); console.log('Max retry attempts reached. Returning false.');
return false; return false;
} }
// Log retry information // Log retry information
if (log_lvl) { if (log_lvl) {
console.log(`Retrying... (${attempt}/${retry_count})`); console.log(`Retrying... (${attempt}/${retry_count})`);
} }
} }
} }
}; };

View File

@@ -12,509 +12,515 @@ export const get_object_percent_completed = temp_get_object_percent_completed;
// Updated 2024-05-23 // Updated 2024-05-23
export const get_object = async function get_object({ export const get_object = async function get_object({
api_cfg = null, api_cfg = null,
endpoint = '', endpoint = '',
headers = {}, headers = {},
params = {}, params = {},
data = {}, data = {},
timeout = 60000, timeout = 60000,
return_meta = false, return_meta = false,
return_blob = false, return_blob = false,
filename = '', filename = '',
auto_download = false, auto_download = false,
as_list = false, as_list = false,
// The task_id value should be a random string that is unique to the task. This is used to identify the task in the message event. // The task_id value should be a random string that is unique to the task. This is used to identify the task in the message event.
task_id = crypto.randomUUID(), task_id = crypto.randomUUID(),
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
endpoint: string; endpoint: string;
headers?: any; headers?: any;
params?: any; params?: any;
data?: any; data?: any;
timeout?: number; timeout?: number;
return_meta?: boolean; return_meta?: boolean;
return_blob?: boolean; return_blob?: boolean;
filename?: null | string; filename?: null | string;
auto_download?: boolean; auto_download?: boolean;
as_list?: boolean; as_list?: boolean;
task_id?: string; task_id?: string;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** get_object() *** Endpoint: ${endpoint} AE Task ID: ${task_id}`); console.log(`*** get_object() *** Endpoint: ${endpoint} AE Task ID: ${task_id}`);
console.log('Params:', params); console.log('Params:', params);
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Data:', data); console.log('Data:', data);
console.log(`Base URL: ${api_cfg['base_url']}; Timeout: ${timeout}`); console.log(`Base URL: ${api_cfg['base_url']}; Timeout: ${timeout}`);
console.log('API Config:', api_cfg); console.log('API Config:', api_cfg);
} }
if (log_lvl > 2) { if (log_lvl > 2) {
console.log( console.log(
`Return Meta: ${return_meta}; Return Blob: ${return_blob}; Filename: ${filename}; Auto Download: ${auto_download}` `Return Meta: ${return_meta}; Return Blob: ${return_blob}; Filename: ${filename}; Auto Download: ${auto_download}`
); );
} }
} }
if (!api_cfg) { if (!api_cfg) {
console.log('No API Config was provided. Returning false.'); console.log('No API Config was provided. Returning false.');
return false; return false;
} }
const axios_api = axios.create({ const axios_api = axios.create({
baseURL: api_cfg['base_url'], baseURL: api_cfg['base_url'],
timeout: timeout // in milliseconds; 60000 = 60 seconds timeout: timeout // in milliseconds; 60000 = 60 seconds
/* other custom settings */ /* other custom settings */
}); });
axios_api.defaults.headers = api_cfg['headers']; axios_api.defaults.headers = api_cfg['headers'];
if (log_lvl) { if (log_lvl) {
console.log('axios_api.defaults.headers:', axios_api.defaults.headers); console.log('axios_api.defaults.headers:', axios_api.defaults.headers);
console.log('Additional headers:', headers); console.log('Additional headers:', headers);
} }
// console.log('Clean the headers. No _underscores_!') // console.log('Clean the headers. No _underscores_!')
const headers_cleaned: key_val = {}; const headers_cleaned: key_val = {};
for (const prop in headers) { for (const prop in headers) {
// No underscores allowed in the header parameters! // No underscores allowed in the header parameters!
const prop_cleaned = prop.replaceAll('_', '-'); const prop_cleaned = prop.replaceAll('_', '-');
// The value must be a string for the header! // The value must be a string for the header!
if (typeof headers[prop] != 'string') { if (typeof headers[prop] != 'string') {
headers[prop] = JSON.stringify(headers[prop]); headers[prop] = JSON.stringify(headers[prop]);
} }
headers_cleaned[prop_cleaned] = headers[prop]; headers_cleaned[prop_cleaned] = headers[prop];
if (log_lvl) { if (log_lvl) {
console.log(`${prop_cleaned}: ${headers_cleaned[prop_cleaned]}`); console.log(`${prop_cleaned}: ${headers_cleaned[prop_cleaned]}`);
} }
} }
headers = headers_cleaned; headers = headers_cleaned;
if (log_lvl) { if (log_lvl) {
console.log('All headers cleaned:', headers); console.log('All headers cleaned:', headers);
} }
if (log_lvl) { if (log_lvl) {
console.log('URL params:'); console.log('URL params:');
} }
for (const prop in params) { for (const prop in params) {
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`URL param: ${prop}: ${params[prop]}`); console.log(`URL param: ${prop}: ${params[prop]}`);
} }
if (params[prop] === null) { if (params[prop] === null) {
params[prop] = 'null'; params[prop] = 'null';
} }
} }
// Handle the case where there is no Blob expected to be returned. Mainly JSON and text data. // Handle the case where there is no Blob expected to be returned. Mainly JSON and text data.
if (!return_blob) { if (!return_blob) {
const response_data_promise = await axios_api const response_data_promise = await axios_api
.get(endpoint, { .get(endpoint, {
headers: headers, headers: headers,
params: params, params: params,
onDownloadProgress: (progressEvent) => { onDownloadProgress: (progressEvent) => {
const percent_completed = Math.round((progressEvent.loaded * 100) / progressEvent.total); const percent_completed = Math.round(
if (log_lvl > 1) { (progressEvent.loaded * 100) / progressEvent.total
console.log( );
'GET Data Progress:', if (log_lvl > 1) {
progressEvent.progress, console.log(
'Total:', 'GET Data Progress:',
progressEvent.total, progressEvent.progress,
'Loaded:', 'Total:',
progressEvent.loaded, progressEvent.total,
'Percent Completed', 'Loaded:',
percent_completed progressEvent.loaded,
); 'Percent Completed',
} percent_completed
);
}
temp_get_object_percent_completed = percent_completed; temp_get_object_percent_completed = percent_completed;
// WARNING: This needs to be tied to an object type and ID. This is a temporary solution. // WARNING: This needs to be tied to an object type and ID. This is a temporary solution.
try { try {
// Check if window is defined. This is to prevent errors in SvelteKit. // Check if window is defined. This is to prevent errors in SvelteKit.
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.postMessage( window.postMessage(
{ {
type: 'api_download_data', type: 'api_download_data',
status: 'downloading', status: 'downloading',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
filename: filename, filename: filename,
size_total: progressEvent.total, size_total: progressEvent.total,
size_loaded: progressEvent.loaded, size_loaded: progressEvent.loaded,
percent_completed: percent_completed percent_completed: percent_completed
}, },
'*' '*'
); );
} }
} catch (error) { } catch (error) {
console.log('Error posting message to window:', error); console.log('Error posting message to window:', error);
} }
} }
}) })
.then(function (response) { .then(function (response) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`GET Response: status=${response.status} statusText=${response.statusText} baseURL=${response.config.baseURL} url=${response.config.url} method=${response.config.method} headers=${response.config.headers} params=${JSON.stringify(response.config.params)}` `GET Response: status=${response.status} statusText=${response.statusText} baseURL=${response.config.baseURL} url=${response.config.url} method=${response.config.method} headers=${response.config.headers} params=${JSON.stringify(response.config.params)}`
); );
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('GET Response:', response); console.log('GET Response:', response);
} }
// Post file download message // Post file download message
try { try {
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.postMessage( window.postMessage(
{ {
type: 'api_download_data', type: 'api_download_data',
status: 'complete', status: 'complete',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
filename: filename, filename: filename,
size_total: 0, size_total: 0,
size_loaded: 0, size_loaded: 0,
percent_completed: 100 percent_completed: 100
}, },
'*' '*'
); );
} }
} catch (error) { } catch (error) {
console.log('Error posting message to window:', error); console.log('Error posting message to window:', error);
} }
if (!Array.isArray(response.data['data']) && as_list) { if (!Array.isArray(response.data['data']) && as_list) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
'Data result is a dictionary/object, not an array/list. Forcing return as an array/list' 'Data result is a dictionary/object, not an array/list. Forcing return as an array/list'
); );
} }
const return_data = []; const return_data = [];
return_data.push(response.data['data']); return_data.push(response.data['data']);
return return_data; return return_data;
} else if (response.data['data']) { } else if (response.data['data']) {
const return_data = response.data['data']; const return_data = response.data['data'];
if (log_lvl) { if (log_lvl) {
if (Array.isArray(return_data)) { if (Array.isArray(return_data)) {
console.log(`Data result is an array/list. Array length: ${return_data.length}`); console.log(
} else { `Data result is an array/list. Array length: ${return_data.length}`
console.log(`Data result is a dictionary/object, not an array/list.`); );
} } else {
} console.log(`Data result is a dictionary/object, not an array/list.`);
return return_data; }
} else { }
const return_data = response.data; return return_data;
if (log_lvl) { } else {
if (Array.isArray(return_data)) { const return_data = response.data;
console.log( if (log_lvl) {
`Not a standard response from Aether's API. Data result is an array/list. Array length: ${return_data.length}` if (Array.isArray(return_data)) {
); console.log(
} else { `Not a standard response from Aether's API. Data result is an array/list. Array length: ${return_data.length}`
console.log( );
`Not a standard response from Aether's API. Data result is a dictionary/object, not an array/list.` } else {
); console.log(
} `Not a standard response from Aether's API. Data result is a dictionary/object, not an array/list.`
} );
return return_data; }
} }
}) return return_data;
.catch(function (error: any) { }
// Handle the common and expected 404 "error" first })
if (error.response && error.response.status === 404) { .catch(function (error: any) {
if (log_lvl) { // Handle the common and expected 404 "error" first
console.log('The response was a 404 not found "error". Returning null.'); if (error.response && error.response.status === 404) {
} if (log_lvl) {
if (log_lvl > 1) { console.log('The response was a 404 not found "error". Returning null.');
console.log(error.response); }
} if (log_lvl > 1) {
if (log_lvl > 2) { console.log(error.response);
console.log(error); }
} if (log_lvl > 2) {
console.log(error);
}
// Post file download message // Post file download message
try { try {
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.postMessage( window.postMessage(
{ {
type: 'api_download_data', type: 'api_download_data',
status: 'complete', status: 'complete',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
filename: filename, filename: filename,
size_total: 0, size_total: 0,
size_loaded: 0, size_loaded: 0,
percent_completed: 0 percent_completed: 0
}, },
'*' '*'
); );
} }
} catch (error) { } catch (error) {
console.log('Error posting message to window:', error); console.log('Error posting message to window:', error);
} }
return null; // Returning null since there were no results return null; // Returning null since there were no results
} }
if (log_lvl) { if (log_lvl) {
console.log(`Base URL: ${api_cfg['base_url']} | Endpoint: ${endpoint}`); console.log(`Base URL: ${api_cfg['base_url']} | Endpoint: ${endpoint}`);
console.log('Error Message:', error.message); // Is this needed here or below in the in the else portion??? console.log('Error Message:', error.message); // Is this needed here or below in the in the else portion???
if (error.response) { if (error.response) {
// The request was made and the server responded with a status code that falls out of the range of 2xx // The request was made and the server responded with a status code that falls out of the range of 2xx
console.log('Error Response Data', error.response.data); console.log('Error Response Data', error.response.data);
console.log('Error Response Status', error.response.status); console.log('Error Response Status', error.response.status);
console.log('Error Response Headers', error.response.headers); console.log('Error Response Headers', error.response.headers);
} else if (error.request) { } else if (error.request) {
// The request was made but no response was received `error.request` is an instance of XMLHttpRequest in the browser and an instance of http.ClientRequest in node.js // The request was made but no response was received `error.request` is an instance of XMLHttpRequest in the browser and an instance of http.ClientRequest in node.js
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Error Request', error.request); console.log('Error Request', error.request);
} }
} else { } else {
// Something happened in setting up the request that triggered an Error // Something happened in setting up the request that triggered an Error
console.log('Error Message', error.message); console.log('Error Message', error.message);
} }
} }
if (log_lvl > 2) { if (log_lvl > 2) {
console.log('Error:', error); console.log('Error:', error);
console.log(error.config); console.log(error.config);
} }
if (error.code === 'ECONNABORTED') { if (error.code === 'ECONNABORTED') {
// Timeout Error (You can implement retry here where suitable) // Timeout Error (You can implement retry here where suitable)
console.log('Timeout Error: ', error.message); console.log('Timeout Error: ', error.message);
} }
if (log_lvl) { if (log_lvl) {
console.log('The response was an error. Returning false.'); console.log('The response was an error. Returning false.');
} }
return false; // Returning false since something may have gone wrong. This includes timeouts. Also more in line with what the API returns. return false; // Returning false since something may have gone wrong. This includes timeouts. Also more in line with what the API returns.
// return error; // return error;
}); });
if (log_lvl > 1) { if (log_lvl > 1) {
// console.log(`Response Data: ${response_data_promise}`); // console.log(`Response Data: ${response_data_promise}`);
console.log(`Response Data:`, response_data_promise); console.log(`Response Data:`, response_data_promise);
// console.log(response_data_promise); // console.log(response_data_promise);
} }
if (response_data_promise) { if (response_data_promise) {
// The most common and expected response. // The most common and expected response.
// console.log('Returning result. This is generally expected.'); // console.log('Returning result. This is generally expected.');
return response_data_promise; return response_data_promise;
} else if (response_data_promise === null) { } else if (response_data_promise === null) {
// Less common, but expected response if no results were returned. // Less common, but expected response if no results were returned.
if (log_lvl) { if (log_lvl) {
console.log('Returning null. This is expected if no results were found. (404)'); console.log('Returning null. This is expected if no results were found. (404)');
} }
return response_data_promise; return response_data_promise;
} else if (response_data_promise === false) { } else if (response_data_promise === false) {
// Not common, but expected response if the request to the API had an issue. // Not common, but expected response if the request to the API had an issue.
console.log('Returning false. There may have been an issue with this request.'); console.log('Returning false. There may have been an issue with this request.');
return response_data_promise; return response_data_promise;
} else { } else {
// This generally should not happen. It likely means the query was bad or an API issue. // This generally should not happen. It likely means the query was bad or an API issue.
console.log('Returning (JSON/text) unknown. This should not happen in most cases.'); console.log('Returning (JSON/text) unknown. This should not happen in most cases.');
Promise.reject(new Error('fail')).then(resolved, rejected); Promise.reject(new Error('fail')).then(resolved, rejected);
} }
// Handle the case where a Blob is expected to be returned. // Handle the case where a Blob is expected to be returned.
} else { } else {
// console.log('Expecting a Blob to be returned...'); // console.log('Expecting a Blob to be returned...');
const response_data_promise = await axios_api const response_data_promise = await axios_api
.get(endpoint, { .get(endpoint, {
params: params, params: params,
responseType: 'blob', responseType: 'blob',
onDownloadProgress: (progressEvent) => { onDownloadProgress: (progressEvent) => {
const percent_completed = Math.round((progressEvent.loaded * 100) / progressEvent.total); const percent_completed = Math.round(
console.log( (progressEvent.loaded * 100) / progressEvent.total
'GET Blob Progress:', );
progressEvent.progress, console.log(
'Total:', 'GET Blob Progress:',
progressEvent.total, progressEvent.progress,
'Loaded:', 'Total:',
progressEvent.loaded, progressEvent.total,
'Percent Completed', 'Loaded:',
percent_completed progressEvent.loaded,
); 'Percent Completed',
percent_completed
);
temp_get_blob_percent_completed = percent_completed; temp_get_blob_percent_completed = percent_completed;
// WARNING: This needs to be tied to an object type and ID. This is a temporary solution. // WARNING: This needs to be tied to an object type and ID. This is a temporary solution.
try { try {
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.postMessage( window.postMessage(
{ {
type: 'api_download_blob', type: 'api_download_blob',
status: 'downloading', status: 'downloading',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
filename: filename, filename: filename,
size_total: progressEvent.total, size_total: progressEvent.total,
size_loaded: progressEvent.loaded, size_loaded: progressEvent.loaded,
percent_completed: percent_completed percent_completed: percent_completed
}, },
'*' '*'
); );
} }
} catch (error) { } catch (error) {
console.log('Error posting message to window:', error); console.log('Error posting message to window:', error);
} }
} }
}) })
.then(function (response) { .then(function (response) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`GET (blob) Response: status=${response.status} statusText=${response.statusText} baseURL=${response.config.baseURL} url=${response.config.url} method=${response.config.method} headers=${response.config.headers} params=${response.config.params}` `GET (blob) Response: status=${response.status} statusText=${response.statusText} baseURL=${response.config.baseURL} url=${response.config.url} method=${response.config.method} headers=${response.config.headers} params=${response.config.params}`
); );
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('GET (blob) Response:', response); console.log('GET (blob) Response:', response);
} }
const { data, headers } = response; const { data, headers } = response;
// Careful if this download filename needs to be changed to a different file extension. The browser/client may not know how to handle it. // Careful if this download filename needs to be changed to a different file extension. The browser/client may not know how to handle it.
if (filename) { if (filename) {
} else if (headers['content-disposition']) { } else if (headers['content-disposition']) {
filename = headers['content-disposition'].replace(/\w+;filename=(.*)/, '$1'); filename = headers['content-disposition'].replace(/\w+;filename=(.*)/, '$1');
} else { } else {
filename = 'unknown_file.ext'; filename = 'unknown_file.ext';
} }
// WARNING: This needs to be tied to an object type and ID. This is a temporary solution. // WARNING: This needs to be tied to an object type and ID. This is a temporary solution.
try { try {
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.postMessage( window.postMessage(
{ {
type: 'api_download_blob', type: 'api_download_blob',
status: 'complete', status: 'complete',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
filename: filename, filename: filename,
size_total: 0, size_total: 0,
size_loaded: 0, size_loaded: 0,
percent_completed: 100 percent_completed: 100
}, },
'*' '*'
); );
} }
} catch (error) { } catch (error) {
console.log('Error posting message to window:', error); console.log('Error posting message to window:', error);
} }
if (auto_download) { if (auto_download) {
if (log_lvl) { if (log_lvl) {
console.log(`Auto Download: ${filename}`); console.log(`Auto Download: ${filename}`);
} }
const url = window.URL.createObjectURL(new Blob([response.data])); const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a'); const link = document.createElement('a');
link.href = url; link.href = url;
link.setAttribute('download', filename); link.setAttribute('download', filename);
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
return true; return true;
} else { } else {
return response; return response;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
// Handle the common and expected 404 "error" first // Handle the common and expected 404 "error" first
if (error.response && error.response.status === 404) { if (error.response && error.response.status === 404) {
if (log_lvl) { if (log_lvl) {
console.log('The response was a 404 not found "error". Returning null.'); console.log('The response was a 404 not found "error". Returning null.');
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(error.response); console.log(error.response);
} }
if (log_lvl > 2) { if (log_lvl > 2) {
console.log(error); console.log(error);
} }
// Post file download message // Post file download message
try { try {
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.postMessage( window.postMessage(
{ {
type: 'api_download_blob', type: 'api_download_blob',
status: 'complete', status: 'complete',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
filename: filename, filename: filename,
size_total: 0, size_total: 0,
size_loaded: 0, size_loaded: 0,
percent_completed: 0 percent_completed: 0
}, },
'*' '*'
); );
} }
} catch (error) { } catch (error) {
console.log('Error posting message to window:', error); console.log('Error posting message to window:', error);
} }
return null; // Returning null since there were no results return null; // Returning null since there were no results
} }
if (log_lvl) { if (log_lvl) {
console.log(`Base URL: ${api_cfg['base_url']} | Endpoint: ${endpoint}`); console.log(`Base URL: ${api_cfg['base_url']} | Endpoint: ${endpoint}`);
console.log('Error Message:', error.message); // Is this needed here or below in the in the else portion??? console.log('Error Message:', error.message); // Is this needed here or below in the in the else portion???
if (error.response) { if (error.response) {
// The request was made and the server responded with a status code that falls out of the range of 2xx // The request was made and the server responded with a status code that falls out of the range of 2xx
console.log('Error Response Data', error.response.data); console.log('Error Response Data', error.response.data);
console.log('Error Response Status', error.response.status); console.log('Error Response Status', error.response.status);
console.log('Error Response Headers', error.response.headers); console.log('Error Response Headers', error.response.headers);
} else if (error.request) { } else if (error.request) {
// The request was made but no response was received `error.request` is an instance of XMLHttpRequest in the browser and an instance of http.ClientRequest in node.js // The request was made but no response was received `error.request` is an instance of XMLHttpRequest in the browser and an instance of http.ClientRequest in node.js
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Error Request', error.request); console.log('Error Request', error.request);
} }
} else { } else {
// Something happened in setting up the request that triggered an Error // Something happened in setting up the request that triggered an Error
console.log('Error Message', error.message); console.log('Error Message', error.message);
} }
} }
if (error.code === 'ECONNABORTED') { if (error.code === 'ECONNABORTED') {
// Timeout Error (You can implement retry here where suitable) // Timeout Error (You can implement retry here where suitable)
console.log('Timeout Error: ', error.message); console.log('Timeout Error: ', error.message);
} }
if (log_lvl) { if (log_lvl) {
console.log('The response was an error. Returning false.'); console.log('The response was an error. Returning false.');
} }
return false; // Returning false since something may have gone wrong. This includes timeouts. Also more in line with what the API returns. return false; // Returning false since something may have gone wrong. This includes timeouts. Also more in line with what the API returns.
// return error; // return error;
}); });
if (response_data_promise) { if (response_data_promise) {
// The most common and expected response. // The most common and expected response.
// console.log('Returning result. This is generally expected.'); // console.log('Returning result. This is generally expected.');
// let test_blob = new Blob([response_data_promise.data]); // let test_blob = new Blob([response_data_promise.data]);
// console.log(test_blob); // console.log(test_blob);
// return test_blob; // return test_blob;
// console.log(response_data_promise.blob()); // console.log(response_data_promise.blob());
return response_data_promise; return response_data_promise;
} else if (response_data_promise === null) { } else if (response_data_promise === null) {
// Less common, but expected response if no results were returned. // Less common, but expected response if no results were returned.
if (log_lvl) { if (log_lvl) {
console.log('Returning null. This is expected if no results were found. (404)'); console.log('Returning null. This is expected if no results were found. (404)');
} }
return response_data_promise; return response_data_promise;
} else if (response_data_promise === false) { } else if (response_data_promise === false) {
// Not common, but expected response if the request to the API had an issue. // Not common, but expected response if the request to the API had an issue.
console.log('Returning false. There may have been an issue with this request.'); console.log('Returning false. There may have been an issue with this request.');
return response_data_promise; return response_data_promise;
} else { } else {
// This generally should not happen. It likely means the query was bad or an API issue. // This generally should not happen. It likely means the query was bad or an API issue.
console.log('Returning (blob) unknown. This should not happen in most cases.'); console.log('Returning (blob) unknown. This should not happen in most cases.');
Promise.reject(new Error('fail')).then(resolved, rejected); Promise.reject(new Error('fail')).then(resolved, rejected);
} }
} }
}; };
function resolved(result: any) { function resolved(result: any) {
console.log('Resolved'); console.log('Resolved');
} }
function rejected(result: any) { function rejected(result: any) {
console.error(result); console.error(result);
} }

View File

@@ -2,143 +2,143 @@
// Updated 2024-05-23 // Updated 2024-05-23
export const patch_object = async function patch_object({ export const patch_object = async function patch_object({
api_cfg = null, api_cfg = null,
endpoint = '', endpoint = '',
params = {}, params = {},
data = {}, data = {},
return_meta = false, return_meta = false,
log_lvl = 0, log_lvl = 0,
retry_count = 5 // Number of retry attempts retry_count = 5 // Number of retry attempts
}: { }: {
api_cfg: any; api_cfg: any;
endpoint: string; endpoint: string;
params?: any; params?: any;
data?: any; data?: any;
return_meta?: boolean; return_meta?: boolean;
log_lvl?: number; log_lvl?: number;
retry_count?: number; retry_count?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** patch_object() *** Endpoint: ${endpoint}`); console.log(`*** patch_object() *** Endpoint: ${endpoint}`);
console.log('Params:', params); console.log('Params:', params);
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Data:', data); console.log('Data:', data);
} }
} }
if (!api_cfg) { if (!api_cfg) {
console.error('No API Config was provided. Returning false.'); console.error('No API Config was provided. Returning false.');
return false; return false;
} }
// Construct the URL with query parameters // Construct the URL with query parameters
const url = new URL(endpoint, api_cfg['base_url']); const url = new URL(endpoint, api_cfg['base_url']);
Object.keys(params).forEach((key) => url.searchParams.append(key, params[key])); Object.keys(params).forEach((key) => url.searchParams.append(key, params[key]));
// Clean the headers // Clean the headers
const headers_cleaned: Record<string, string> = {}; const headers_cleaned: Record<string, string> = {};
for (const prop in api_cfg['headers']) { for (const prop in api_cfg['headers']) {
const prop_cleaned = prop.replaceAll('_', '-'); const prop_cleaned = prop.replaceAll('_', '-');
headers_cleaned[prop_cleaned] = api_cfg['headers'][prop]; headers_cleaned[prop_cleaned] = api_cfg['headers'][prop];
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Cleaned Headers:', headers_cleaned); console.log('Cleaned Headers:', headers_cleaned);
} }
const fetchOptions: RequestInit = { const fetchOptions: RequestInit = {
method: 'PATCH', method: 'PATCH',
headers: { headers: {
...headers_cleaned, ...headers_cleaned,
'Content-Type': 'application/json' 'Content-Type': 'application/json'
}, },
body: JSON.stringify(data) body: JSON.stringify(data)
}; };
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Fetch Options:', fetchOptions); console.log('Fetch Options:', fetchOptions);
} }
for (let attempt = 1; attempt <= retry_count; attempt++) { for (let attempt = 1; attempt <= retry_count; attempt++) {
try { try {
const response = await fetch(url.toString(), fetchOptions); const response = await fetch(url.toString(), fetchOptions);
if (log_lvl) { if (log_lvl) {
console.log(`Response: status=${response.status} attempt=${attempt}`); console.log(`Response: status=${response.status} attempt=${attempt}`);
} }
if (!response.ok) { if (!response.ok) {
if (response.status === 404) { if (response.status === 404) {
console.warn('404 Not Found. Returning null.'); console.warn('404 Not Found. Returning null.');
return null; // Returning null since there were no results return null; // Returning null since there were no results
} }
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);
} }
const json = await response.json(); const json = await response.json();
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Response JSON:', json); console.log('Response JSON:', json);
} }
// Return the response data or metadata // Return the response data or metadata
return return_meta ? json : json.data; return return_meta ? json : json.data;
} catch (error) { } catch (error) {
console.error(`API PATCH error on attempt ${attempt}:`, error); console.error(`API PATCH error on attempt ${attempt}:`, error);
// If this is the last attempt, return false // If this is the last attempt, return false
if (attempt === retry_count) { if (attempt === retry_count) {
console.error('Max retry attempts reached. Returning false.'); console.error('Max retry attempts reached. Returning false.');
return false; return false;
} }
// Log retry information // Log retry information
if (log_lvl) { if (log_lvl) {
console.log(`Retrying... (${attempt}/${retry_count})`); console.log(`Retrying... (${attempt}/${retry_count})`);
} }
} }
} }
// let axios_api = axios.create({ // let axios_api = axios.create({
// baseURL: api_cfg['base_url'], // baseURL: api_cfg['base_url'],
// /* other custom settings */ // /* other custom settings */
// }); // });
// axios_api.defaults.headers = api_cfg['headers']; // axios_api.defaults.headers = api_cfg['headers'];
// for (let attempt = 1; attempt <= retry_count; attempt++) { // for (let attempt = 1; attempt <= retry_count; attempt++) {
// try { // try {
// const response = await axios_api.patch(endpoint, data, { params: params }); // const response = await axios_api.patch(endpoint, data, { params: params });
// if (log_lvl) { // if (log_lvl) {
// console.log(`Response: status=${response.status} attempt=${attempt}`); // console.log(`Response: status=${response.status} attempt=${attempt}`);
// } // }
// if (log_lvl > 1) { // if (log_lvl > 1) {
// console.log('Response Data:', response.data); // console.log('Response Data:', response.data);
// } // }
// // Return the response data // // Return the response data
// return response.data['data']; // return response.data['data'];
// } catch (error) { // } catch (error) {
// if (log_lvl) { // if (log_lvl) {
// console.error(`Error on attempt ${attempt}:`, error); // console.error(`Error on attempt ${attempt}:`, error);
// } // }
// // Handle specific errors (e.g., 404) // // Handle specific errors (e.g., 404)
// if (error.response && error.response.status === 404) { // if (error.response && error.response.status === 404) {
// console.warn('404 Not Found. Returning null.'); // console.warn('404 Not Found. Returning null.');
// return null; // Returning null since there were no results // return null; // Returning null since there were no results
// } // }
// // If this is the last attempt, return false // // If this is the last attempt, return false
// if (attempt === retry_count) { // if (attempt === retry_count) {
// console.error('Max retry attempts reached. Returning false.'); // console.error('Max retry attempts reached. Returning false.');
// return false; // return false;
// } // }
// // Log retry information // // Log retry information
// if (log_lvl) { // if (log_lvl) {
// console.log(`Retrying... (${attempt}/${retry_count})`); // console.log(`Retrying... (${attempt}/${retry_count})`);
// } // }
// } // }
// } // }
// return response_data; // return response_data;
}; };

View File

@@ -7,339 +7,339 @@ export const post_object_percent_completed = temp_post_object_percent_completed;
// Updated 2024-05-23 // Updated 2024-05-23
export const post_object = async function post_object({ export const post_object = async function post_object({
api_cfg = null, api_cfg = null,
endpoint = '', endpoint = '',
params = {}, params = {},
data = {}, data = {},
form_data = null, form_data = null,
return_meta = false, return_meta = false,
return_blob = false, return_blob = false,
filename = '', filename = '',
auto_download = false, auto_download = false,
// The task_id value should be a random string that is unique to the task. This is used to identify the task in the message event. // The task_id value should be a random string that is unique to the task. This is used to identify the task in the message event.
task_id = crypto.randomUUID(), task_id = crypto.randomUUID(),
log_lvl = 0, log_lvl = 0,
retry_count = 5 retry_count = 5
}: { }: {
api_cfg: any; api_cfg: any;
endpoint: string; endpoint: string;
params?: any; params?: any;
data?: any; data?: any;
form_data?: any; form_data?: any;
return_meta?: boolean; return_meta?: boolean;
return_blob?: boolean; return_blob?: boolean;
filename?: string; filename?: string;
auto_download?: boolean; auto_download?: boolean;
task_id?: string; task_id?: string;
log_lvl?: number; log_lvl?: number;
retry_count?: number; retry_count?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** post_object() *** Endpoint: ${endpoint} Task ID: ${task_id}`); console.log(`*** post_object() *** Endpoint: ${endpoint} Task ID: ${task_id}`);
console.log('Params:', params); console.log('Params:', params);
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Data:', data); console.log('Data:', data);
console.log(typeof data); console.log(typeof data);
console.log(`Base URL: ${api_cfg['base_url']}`); console.log(`Base URL: ${api_cfg['base_url']}`);
console.log('API Config:', api_cfg); console.log('API Config:', api_cfg);
} }
if (log_lvl > 2) { if (log_lvl > 2) {
console.log(`Return Meta: ${return_meta}`); console.log(`Return Meta: ${return_meta}`);
console.log(`Return Blob: ${return_blob}`); console.log(`Return Blob: ${return_blob}`);
console.log(`Filename: ${filename}`); console.log(`Filename: ${filename}`);
console.log(`Auto Download: ${auto_download}`); console.log(`Auto Download: ${auto_download}`);
} }
} }
// console.log('HERE!! API POST 0'); // console.log('HERE!! API POST 0');
if (!api_cfg) { if (!api_cfg) {
console.error('No API Config was provided. Returning false.'); console.error('No API Config was provided. Returning false.');
return false; return false;
} }
// console.log('HERE!! API POST 1'); // console.log('HERE!! API POST 1');
// Construct the URL with query parameters // Construct the URL with query parameters
const url = new URL(endpoint, api_cfg['base_url']); const url = new URL(endpoint, api_cfg['base_url']);
if (params) { if (params) {
Object.keys(params).forEach((key) => url.searchParams.append(key, params[key])); Object.keys(params).forEach((key) => url.searchParams.append(key, params[key]));
} }
// console.log('HERE!! API POST 2'); // console.log('HERE!! API POST 2');
// Clean the headers // Clean the headers
const headers_cleaned: Record<string, string> = {}; const headers_cleaned: Record<string, string> = {};
for (const prop in api_cfg['headers']) { for (const prop in api_cfg['headers']) {
const prop_cleaned = prop.replaceAll('_', '-'); const prop_cleaned = prop.replaceAll('_', '-');
headers_cleaned[prop_cleaned] = api_cfg['headers'][prop]; headers_cleaned[prop_cleaned] = api_cfg['headers'][prop];
} }
// console.log('HERE!! API POST 3'); // console.log('HERE!! API POST 3');
if (form_data) { if (form_data) {
// headers_cleaned['Content-Type'] = 'multipart/form-data'; // headers_cleaned['Content-Type'] = 'multipart/form-data';
delete headers_cleaned['Content-Type']; delete headers_cleaned['Content-Type'];
delete headers_cleaned['content-type']; // Just in case delete headers_cleaned['content-type']; // Just in case
delete headers_cleaned['Content-type']; // Just in case delete headers_cleaned['Content-type']; // Just in case
console.log('Form Data:', form_data); console.log('Form Data:', form_data);
} else { } else {
headers_cleaned['Content-Type'] = 'application/json'; headers_cleaned['Content-Type'] = 'application/json';
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Cleaned Headers:', headers_cleaned); console.log('Cleaned Headers:', headers_cleaned);
} }
// console.log('HERE!! API POST 4'); // console.log('HERE!! API POST 4');
for (let attempt = 1; attempt <= retry_count; attempt++) { for (let attempt = 1; attempt <= retry_count; attempt++) {
try { try {
const controller = new AbortController(); const controller = new AbortController();
const fetchOptions: RequestInit = { const fetchOptions: RequestInit = {
method: 'POST', method: 'POST',
headers: headers_cleaned, headers: headers_cleaned,
body: form_data ? form_data : JSON.stringify(data), body: form_data ? form_data : JSON.stringify(data),
signal: controller.signal signal: controller.signal
}; };
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Fetch Options:', fetchOptions); console.log('Fetch Options:', fetchOptions);
} }
const response = await fetch(url.toString(), fetchOptions); const response = await fetch(url.toString(), fetchOptions);
if (log_lvl) { if (log_lvl) {
console.log(`Response: status=${response.status} attempt=${attempt}`); console.log(`Response: status=${response.status} attempt=${attempt}`);
} }
if (!response.ok) { if (!response.ok) {
if (response.status === 404) { if (response.status === 404) {
console.warn('404 Not Found. Returning null.'); console.warn('404 Not Found. Returning null.');
return null; // Returning null since there were no results return null; // Returning null since there were no results
} }
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);
} }
if (!return_blob) { if (!return_blob) {
const json = await response.json(); const json = await response.json();
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Response JSON:', json); console.log('Response JSON:', json);
} }
// Post a message to the window indicating the upload is complete // Post a message to the window indicating the upload is complete
try { try {
window.postMessage( window.postMessage(
{ {
type: 'api_post_json_form', type: 'api_post_json_form',
status: 'complete', status: 'complete',
task_id: task_id, task_id: task_id,
endpoint: endpoint, endpoint: endpoint,
size_total: 0, size_total: 0,
size_loaded: 0, size_loaded: 0,
percent_completed: 100, percent_completed: 100,
progress: 100, progress: 100,
rate: 0 rate: 0
}, },
'*' '*'
); );
} catch (error) { } catch (error) {
console.error('Error posting message to window:', error); console.error('Error posting message to window:', error);
} }
// Return the response data or metadata // Return the response data or metadata
return return_meta ? json : json.data; return return_meta ? json : json.data;
} else { } else {
const blob = await response.blob(); const blob = await response.blob();
if (auto_download) { if (auto_download) {
const downloadUrl = window.URL.createObjectURL(blob); const downloadUrl = window.URL.createObjectURL(blob);
const link = document.createElement('a'); const link = document.createElement('a');
link.href = downloadUrl; link.href = downloadUrl;
link.setAttribute('download', filename || 'download'); link.setAttribute('download', filename || 'download');
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
link.remove(); link.remove();
return true; return true;
} else { } else {
return blob; return blob;
} }
} }
} catch (error) { } catch (error) {
console.error(`API POST error on attempt ${attempt}:`, error); console.error(`API POST error on attempt ${attempt}:`, error);
// If this is the last attempt, return false // If this is the last attempt, return false
if (attempt === retry_count) { if (attempt === retry_count) {
console.error('Max retry attempts reached. Returning false.'); console.error('Max retry attempts reached. Returning false.');
return false; return false;
} }
// Log retry information // Log retry information
if (log_lvl) { if (log_lvl) {
console.log(`Retrying... (${attempt}/${retry_count})`); console.log(`Retrying... (${attempt}/${retry_count})`);
} }
} }
} }
// let axios_api = axios.create({ // let axios_api = axios.create({
// baseURL: api_cfg['base_url'], // baseURL: api_cfg['base_url'],
// /* other custom settings */ // /* other custom settings */
// }); // });
// axios_api.defaults.headers = api_cfg['headers']; // axios_api.defaults.headers = api_cfg['headers'];
// console.log('Axios API', axios_api); // console.log('Axios API', axios_api);
// // console.log('Axios API POST', axios_api.post); // // console.log('Axios API POST', axios_api.post);
// // if (typeof data == 'FormData') { // // if (typeof data == 'FormData') {
// if (form_data) { // if (form_data) {
// axios_api.defaults.headers['content-type'] = 'multipart/form-data'; // axios_api.defaults.headers['content-type'] = 'multipart/form-data';
// data = form_data; // data = form_data;
// } else { // } else {
// axios_api.defaults.headers['content-type'] = 'application/json'; // axios_api.defaults.headers['content-type'] = 'application/json';
// } // }
// if (!return_blob) { // if (!return_blob) {
// let response_data = await axios_api.post( // let response_data = await axios_api.post(
// endpoint, // endpoint,
// data, // data,
// { // {
// params: params, // params: params,
// onUploadProgress: (progressEvent) => { // onUploadProgress: (progressEvent) => {
// let percent_completed = Math.round( // let percent_completed = Math.round(
// (progressEvent.loaded * 100) / progressEvent.total // (progressEvent.loaded * 100) / progressEvent.total
// ); // );
// console.log('POST Progress:', progressEvent.progress, 'Total:', progressEvent.total, 'Loaded:', progressEvent.loaded, 'Percent Completed', percent_completed); // console.log('POST Progress:', progressEvent.progress, 'Total:', progressEvent.total, 'Loaded:', progressEvent.loaded, 'Percent Completed', percent_completed);
// temp_post_object_percent_completed = percent_completed; // temp_post_object_percent_completed = percent_completed;
// try { // try {
// window.postMessage({ // window.postMessage({
// type: 'api_post_json_form', // type: 'api_post_json_form',
// status: 'uploading', // status: 'uploading',
// task_id: task_id, // task_id: task_id,
// endpoint: endpoint, // endpoint: endpoint,
// size_total: progressEvent.total, // size_total: progressEvent.total,
// size_loaded: progressEvent.loaded, // size_loaded: progressEvent.loaded,
// percent_completed: percent_completed, // percent_completed: percent_completed,
// progress: progressEvent.progress, // progress: progressEvent.progress,
// rate: progressEvent.rate, // rate: progressEvent.rate,
// }, // },
// '*' // '*'
// ); // );
// } catch (error) { // } catch (error) {
// console.log('Error posting message to window:', error); // console.log('Error posting message to window:', error);
// } // }
// } // }
// } // }
// ) // )
// .then(function (response) { // .then(function (response) {
// console.log('POST Response Data:', response.data); // console.log('POST Response Data:', response.data);
// try { // try {
// window.postMessage({ // window.postMessage({
// type: 'api_post_json_form', // type: 'api_post_json_form',
// status: 'complete', // status: 'complete',
// task_id: task_id, // task_id: task_id,
// endpoint: endpoint, // endpoint: endpoint,
// size_total: 0, // size_total: 0,
// size_loaded: 0, // size_loaded: 0,
// percent_completed: 100, // percent_completed: 100,
// progress: 100, // progress: 100,
// rate: 0, // rate: 0,
// }, // },
// '*' // '*'
// ); // );
// } catch (error) { // } catch (error) {
// console.log('Error posting message to window:', error); // console.log('Error posting message to window:', error);
// } // }
// if (response.data['data'].result === null) { // if (response.data['data'].result === null) {
// // This should mean that the request was successful, but a result of None/null was returned from Aether API. // // This should mean that the request was successful, but a result of None/null was returned from Aether API.
// // console.log('Returning null after POST'); // // console.log('Returning null after POST');
// return null; // return null;
// } else { // } else {
// // This should mean that the request was successful, and a result with data was returned from Aether API. // // This should mean that the request was successful, and a result with data was returned from Aether API.
// // console.log('Returning data after POST'); // // console.log('Returning data after POST');
// return response.data['data']; // return response.data['data'];
// } // }
// //return response.data; // //return response.data;
// }) // })
// .catch(function (error: any) { // .catch(function (error: any) {
// if (error.response && error.response.status === 404) { // if (error.response && error.response.status === 404) {
// return null; // Returning null since there were no results // return null; // Returning null since there were no results
// } // }
// console.log(error); // console.log(error);
// return false; // Returning false since something may have gone wrong. Also more in line with what the API returns. // return false; // Returning false since something may have gone wrong. Also more in line with what the API returns.
// // return error; // // return error;
// }); // });
// if (log_lvl > 1) { // if (log_lvl > 1) {
// console.log('Response Data:', response_data); // console.log('Response Data:', response_data);
// } // }
// axios_api.defaults.headers['content-type'] = 'application/json'; // axios_api.defaults.headers['content-type'] = 'application/json';
// return response_data; // return response_data;
// } else { // } else {
// // console.log('Expecting a Blob to be returned...'); // // console.log('Expecting a Blob to be returned...');
// let response_data_promise = await axios_api.post( // let response_data_promise = await axios_api.post(
// endpoint, // endpoint,
// data, // data,
// { // {
// params: params, // params: params,
// responseType: 'blob', // responseType: 'blob',
// onDownloadProgress: (progressEvent) => { // onDownloadProgress: (progressEvent) => {
// let percent_completed = Math.round( // let percent_completed = Math.round(
// (progressEvent.loaded * 100) / progressEvent.total // (progressEvent.loaded * 100) / progressEvent.total
// ); // );
// console.log('POST Blob Progress:', progressEvent.progress, 'Total:', progressEvent.total, 'Loaded:', progressEvent.loaded, 'Percent Completed', percent_completed); // console.log('POST Blob Progress:', progressEvent.progress, 'Total:', progressEvent.total, 'Loaded:', progressEvent.loaded, 'Percent Completed', percent_completed);
// temp_post_blob_percent_completed = percent_completed; // temp_post_blob_percent_completed = percent_completed;
// } // }
// } // }
// ) // )
// .then(function (response) { // .then(function (response) {
// if (log_lvl) { // if (log_lvl) {
// console.log(response); // console.log(response);
// } // }
// const { data, headers } = response // const { data, headers } = response
// console.log(headers); // console.log(headers);
// if (filename) { // if (filename) {
// } else if (headers['content-disposition']) { // } else if (headers['content-disposition']) {
// filename = headers['content-disposition'].replace(/\w+;filename=(.*)/, '$1'); // filename = headers['content-disposition'].replace(/\w+;filename=(.*)/, '$1');
// } else { // } else {
// filename = 'unknown_file.ext'; // filename = 'unknown_file.ext';
// } // }
// if (auto_download) { // if (auto_download) {
// const url = window.URL.createObjectURL(new Blob([response.data])); // const url = window.URL.createObjectURL(new Blob([response.data]));
// const link = document.createElement('a'); // const link = document.createElement('a');
// link.href = url; // link.href = url;
// // link.setAttribute('download', 'event_exhibit_tracking_export.xlsx'); //or any other extension // // link.setAttribute('download', 'event_exhibit_tracking_export.xlsx'); //or any other extension
// link.setAttribute('download', filename); //or any other extension // link.setAttribute('download', filename); //or any other extension
// document.body.appendChild(link); // document.body.appendChild(link);
// link.click(); // link.click();
// return true; // return true;
// } else { // } else {
// return response; // return response;
// } // }
// }); // });
// if (response_data_promise) { // if (response_data_promise) {
// // The most common and expected response. // // The most common and expected response.
// // console.log('Returning result. This is generally expected.'); // // console.log('Returning result. This is generally expected.');
// // let test_blob = new Blob([response_data_promise.data]); // // let test_blob = new Blob([response_data_promise.data]);
// // console.log(test_blob); // // console.log(test_blob);
// // return test_blob; // // return test_blob;
// // console.log(response_data_promise.blob()); // // console.log(response_data_promise.blob());
// return response_data_promise; // return response_data_promise;
// } else { // } else {
// // This generally should not happen. It likely means the query was bad or an API issue. // // This generally should not happen. It likely means the query was bad or an API issue.
// console.log('Returning unknown. This should not happen in most cases.'); // console.log('Returning unknown. This should not happen in most cases.');
// Promise.reject(new Error('fail')).then(resolved, rejected); // Promise.reject(new Error('fail')).then(resolved, rejected);
// } // }
// } // }
}; };
// function resolved(result: any) { // function resolved(result: any) {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,32 +1,32 @@
// This file is used to export all the functions that are used for Aether Posts related functions. // This file is used to export all the functions that are used for Aether Posts related functions.
import { import {
load_ae_obj_id__archive, load_ae_obj_id__archive,
load_ae_obj_li__archive, load_ae_obj_li__archive,
create_ae_obj__archive, create_ae_obj__archive,
delete_ae_obj_id__archive, delete_ae_obj_id__archive,
update_ae_obj__archive update_ae_obj__archive
} from '$lib/ae_archives/ae_archives__archive'; } from '$lib/ae_archives/ae_archives__archive';
import { import {
load_ae_obj_id__archive_content, load_ae_obj_id__archive_content,
load_ae_obj_li__archive_content, load_ae_obj_li__archive_content,
create_ae_obj__archive_content, create_ae_obj__archive_content,
delete_ae_obj_id__archive_content, delete_ae_obj_id__archive_content,
update_ae_obj__archive_content update_ae_obj__archive_content
} from '$lib/ae_archives/ae_archives__archive_content'; } from '$lib/ae_archives/ae_archives__archive_content';
const export_obj = { const export_obj = {
load_ae_obj_id__archive: load_ae_obj_id__archive, load_ae_obj_id__archive: load_ae_obj_id__archive,
load_ae_obj_li__archive: load_ae_obj_li__archive, load_ae_obj_li__archive: load_ae_obj_li__archive,
create_ae_obj__archive: create_ae_obj__archive, create_ae_obj__archive: create_ae_obj__archive,
delete_ae_obj_id__archive: delete_ae_obj_id__archive, delete_ae_obj_id__archive: delete_ae_obj_id__archive,
update_ae_obj__archive: update_ae_obj__archive, update_ae_obj__archive: update_ae_obj__archive,
load_ae_obj_id__archive_content: load_ae_obj_id__archive_content, load_ae_obj_id__archive_content: load_ae_obj_id__archive_content,
load_ae_obj_li__archive_content: load_ae_obj_li__archive_content, load_ae_obj_li__archive_content: load_ae_obj_li__archive_content,
create_ae_obj__archive_content: create_ae_obj__archive_content, create_ae_obj__archive_content: create_ae_obj__archive_content,
delete_ae_obj_id__archive_content: delete_ae_obj_id__archive_content, delete_ae_obj_id__archive_content: delete_ae_obj_id__archive_content,
update_ae_obj__archive_content: update_ae_obj__archive_content update_ae_obj__archive_content: update_ae_obj__archive_content
}; };
export const archives_func = export_obj; export const archives_func = export_obj;

View File

@@ -7,135 +7,135 @@ import type { key_val } from '$lib/stores/ae_stores';
// Updated 2024-09-25 // Updated 2024-09-25
export interface Archive { export interface Archive {
id: string; id: string;
// id_random: string; // id_random: string;
archive_id: string; archive_id: string;
// archive_id_random: string; // archive_id_random: string;
code?: null | string; code?: null | string;
account_id: string; account_id: string;
// account_id_random: string; // account_id_random: string;
// archive_type: string; // archive_type: string;
// type: string; // type: string;
name: string; name: string;
// summary?: null|string; // summary?: null|string;
description?: null | string; description?: null | string;
content_html?: null | string; content_html?: null | string;
content_json?: null | string; content_json?: null | string;
content_url?: null | string; content_url?: null | string;
content_url_text?: null | string; content_url_text?: null | string;
original_datetime?: Date; original_datetime?: Date;
original_timezone?: null | string; original_timezone?: null | string;
original_location?: null | string; original_location?: null | string;
original_url?: null | string; original_url?: null | string;
original_url_text?: null | string; original_url_text?: null | string;
// meta_data?: null|string; // meta_data?: null|string;
// access_key?: null|string; /// Rename this to "passcode" if used later // access_key?: null|string; /// Rename this to "passcode" if used later
sort_by?: null | string; sort_by?: null | string;
sort_by_desc?: null | string; sort_by_desc?: null | string;
cfg_json?: null | key_val; cfg_json?: null | key_val;
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
// archive_content_count?: number; // archive_content_count?: number;
// archive_content_kv?: null|key_val; // archive_content_kv?: null|key_val;
// archive_content_li?: null|[]; // archive_content_li?: null|[];
} }
// Updated 2024-09-25 // Updated 2024-09-25
export interface Archive_Content { export interface Archive_Content {
id: string; id: string;
// id_random: string; // id_random: string;
archive_content_id: string; archive_content_id: string;
// archive_content_id_random: string; // archive_content_id_random: string;
archive_id: string; archive_id: string;
// archive_id_random: string; // archive_id_random: string;
archive_content_type: string; archive_content_type: string;
name: string; name: string;
description?: null | string; description?: null | string;
content_html?: null | string; content_html?: null | string;
content_json?: null | string; content_json?: null | string;
// linked_li_json?: null|string; // For future use? linked content list instead of one content item // linked_li_json?: null|string; // For future use? linked content list instead of one content item
url?: null | string; url?: null | string;
url_text?: null | string; url_text?: null | string;
hosted_file_id?: string; hosted_file_id?: string;
file_path?: null | string; file_path?: null | string;
filename?: null | string; filename?: null | string;
file_extension?: null | string; file_extension?: null | string;
original_datetime?: Date; original_datetime?: Date;
original_timezone?: null | string; original_timezone?: null | string;
original_location?: null | string; original_location?: null | string;
original_url?: null | string; original_url?: null | string;
original_url_text?: null | string; original_url_text?: null | string;
// meta_data?: null|string; // meta_data?: null|string;
// access_key?: null|string; /// Rename this to "passcode" if used later // access_key?: null|string; /// Rename this to "passcode" if used later
enable_for_public?: boolean; enable_for_public?: boolean;
cfg_json?: null | key_val; cfg_json?: null | key_val;
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
archive_code?: null | string; archive_code?: null | string;
archive_name?: null | string; archive_name?: null | string;
hash_sha256?: null | string; hash_sha256?: null | string;
} }
// Updated 2024-09-25 // Updated 2024-09-25
export class MySubClassedDexie extends Dexie { export class MySubClassedDexie extends Dexie {
// We just tell the typing system this is the case // We just tell the typing system this is the case
archive!: Table<Archive>; archive!: Table<Archive>;
content!: Table<Archive_Content>; content!: Table<Archive_Content>;
constructor() { constructor() {
super('ae_archives_db'); super('ae_archives_db');
this.version(1).stores({ this.version(1).stores({
archive: ` archive: `
id, archive_id, id, archive_id,
code, code,
account_id, account_id,
@@ -143,7 +143,7 @@ export class MySubClassedDexie extends Dexie {
original_datetime, original_timezone, original_location, original_datetime, original_timezone, original_location,
tmp_sort_1, tmp_sort_2, tmp_sort_1, tmp_sort_2,
enable, hide, priority, sort, group, notes, created_on, updated_on`, enable, hide, priority, sort, group, notes, created_on, updated_on`,
content: ` content: `
id, archive_content_id, id, archive_content_id,
archive_id, archive_id,
archive_content_type, archive_content_type,
@@ -153,13 +153,13 @@ export class MySubClassedDexie extends Dexie {
[group+original_datetime], [group+original_datetime],
tmp_sort_1, tmp_sort_2, tmp_sort_1, tmp_sort_2,
enable, hide, priority, sort, group, notes, created_on, updated_on, [group+priority+sort+updated_on]` enable, hide, priority, sort, group, notes, created_on, updated_on, [group+priority+sort+updated_on]`
}); });
// file_path, // file_path,
// filename, file_extension, // filename, file_extension,
// original_datetime, original_timezone, original_location, original_url, original_url_text, // original_datetime, original_timezone, original_location, original_url, original_url_text,
// enable_for_public, // enable_for_public,
} }
} }
export const db_archives = new MySubClassedDexie(); export const db_archives = new MySubClassedDexie();

View File

@@ -1,387 +1,418 @@
<script lang="ts"> <script lang="ts">
import { preventDefault } from 'svelte/legacy'; import { preventDefault } from 'svelte/legacy';
// Imports // Imports
// Import components and elements // Import components and elements
// import Element_input_files_tbl from '$lib/element_input_files_tbl.svelte'; // import Element_input_files_tbl from '$lib/element_input_files_tbl.svelte';
// Import storage, functions, and libraries // Import storage, functions, and libraries
import type { key_val } from '$lib/stores/ae_stores'; import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api'; import { api } from '$lib/api/api';
import { ae_util } from '$lib/ae_utils/ae_utils'; import { ae_util } from '$lib/ae_utils/ae_utils';
import { import {
ae_snip, ae_snip,
ae_loc, ae_loc,
ae_sess, ae_sess,
ae_api, ae_api,
ae_trig, ae_trig,
slct, slct,
slct_trigger slct_trigger
} from '$lib/stores/ae_stores'; } from '$lib/stores/ae_stores';
// Exports // Exports
// export let input_name = 'file_list'; // export let input_name = 'file_list';
// export let multiple: boolean = true; // export let multiple: boolean = true;
// export let required: boolean = true; // export let required: boolean = true;
// export let input_class_li: string[] = ['file_drop_area']; // export let input_class_li: string[] = ['file_drop_area'];
interface Props { interface Props {
log_lvl?: number; log_lvl?: number;
// Expecting these for link_to_type: 'event', 'event_location', 'archive_content', etc // Expecting these for link_to_type: 'event', 'event_location', 'archive_content', etc
link_to_type: string; link_to_type: string;
link_to_id: string; link_to_id: string;
// export let accept: string = 'audio/*, image/*, video/*, .bak, .cfg, .css, .csv, .doc, .docx, .gz, .htm, .html, .ini, .iso, .j2, .json, .key, .keynote, .md, .pdf, .ppt, .pptx, .rar, .rtf, .sql, .svelte, ttf, .txt, .xls, .xlsx, .xz, .zip, .bin, .dmg, .exe, .js, .msi, .php, .py, .sh'; // export let accept: string = 'audio/*, image/*, video/*, .bak, .cfg, .css, .csv, .doc, .docx, .gz, .htm, .html, .ini, .iso, .j2, .json, .key, .keynote, .md, .pdf, .ppt, .pptx, .rar, .rtf, .sql, .svelte, ttf, .txt, .xls, .xlsx, .xz, .zip, .bin, .dmg, .exe, .js, .msi, .php, .py, .sh';
class_li_default?: string; class_li_default?: string;
class_li?: string; class_li?: string;
// export let table_class_li: string[] = ['table', 'table-sm', 'table-striped', 'table-hover' , 'text-sm']; // export let table_class_li: string[] = ['table', 'table-sm', 'table-striped', 'table-hover' , 'text-sm'];
clip_complete?: boolean; clip_complete?: boolean;
// export let upload_complete: boolean = false; // export let upload_complete: boolean = false;
submit_status?: null | string; submit_status?: null | string;
// hosted_file_id_li?: string[]; // hosted_file_id_li?: string[];
// hosted_file_obj_li?: any[]; // hosted_file_obj_li?: any[];
hosted_file_obj_kv?: key_val; hosted_file_obj_kv?: key_val;
video_clip_file_kv?: key_val; video_clip_file_kv?: key_val;
} }
let { let {
log_lvl = $bindable(0), log_lvl = $bindable(0),
link_to_type = $bindable(), link_to_type = $bindable(),
link_to_id = $bindable(), link_to_id = $bindable(),
class_li_default = 'flex flex-col gap-1 items-center justify-center w-full max-w-2xl mx-auto my-1', class_li_default = 'flex flex-col gap-1 items-center justify-center w-full max-w-2xl mx-auto my-1',
class_li = $bindable(''), class_li = $bindable(''),
clip_complete = $bindable(false), clip_complete = $bindable(false),
submit_status = $bindable(null), submit_status = $bindable(null),
// hosted_file_id_li = [], // hosted_file_id_li = [],
// hosted_file_obj_li = [], // hosted_file_obj_li = [],
hosted_file_obj_kv = $bindable({}), hosted_file_obj_kv = $bindable({}),
video_clip_file_kv = $bindable({}) video_clip_file_kv = $bindable({})
}: Props = $props(); }: Props = $props();
// Local Variables // Local Variables
let task_id = link_to_id; let task_id = link_to_id;
// let input_file_list: any = null; // let input_file_list: any = null;
let ae_promises: key_val = $state({}); let ae_promises: key_val = $state({});
// let ae_promises_clipping: key_val = {}; // let ae_promises_clipping: key_val = {};
// let ae_triggers: key_val = {}; // let ae_triggers: key_val = {};
// let input_element_id = 'ae_comp__hosted_files_upload__input'; // let input_element_id = 'ae_comp__hosted_files_upload__input';
// let form_kv: key_val = { // let form_kv: key_val = {
// start_time: null, // start_time: null,
// end_time: null, // end_time: null,
// reencode: null, // reencode: null,
// video_file: null, // video_file: null,
// }; // };
// let download_clip_src: string; // let download_clip_src: string;
// let download_clip_filename: string; // let download_clip_filename: string;
$ae_sess.files.obj = { $ae_sess.files.obj = {
obj: null obj: null
}; };
// *** Functions and Logic // *** Functions and Logic
function handle_clip_video(event) { function handle_clip_video(event) {
console.log('*** handle_clip_video() ***'); console.log('*** handle_clip_video() ***');
submit_status = 'clipping'; submit_status = 'clipping';
clip_complete = false; clip_complete = false;
let hosted_file_id = event.target.hosted_file_id.value; let hosted_file_id = event.target.hosted_file_id.value;
$ae_sess.files.processed_file_kv[hosted_file_id] = {}; $ae_sess.files.processed_file_kv[hosted_file_id] = {};
$ae_sess.files.processed_file_kv[hosted_file_id].submit_status = 'clipping'; $ae_sess.files.processed_file_kv[hosted_file_id].submit_status = 'clipping';
$ae_sess.files.processed_file_kv[hosted_file_id].clip_complete = false; $ae_sess.files.processed_file_kv[hosted_file_id].clip_complete = false;
// $ae_sess.files.disable_submit__hosted_file_obj = true; // $ae_sess.files.disable_submit__hosted_file_obj = true;
$ae_loc.files.processed_file_kv[hosted_file_id] = {}; $ae_loc.files.processed_file_kv[hosted_file_id] = {};
$ae_loc.files.processed_file_kv[hosted_file_id].submit_status = 'clipping'; $ae_loc.files.processed_file_kv[hosted_file_id].submit_status = 'clipping';
$ae_loc.files.processed_file_kv[hosted_file_id].start_time = event.target.start_time.value; $ae_loc.files.processed_file_kv[hosted_file_id].start_time = event.target.start_time.value;
$ae_loc.files.processed_file_kv[hosted_file_id].end_time = event.target.end_time.value; $ae_loc.files.processed_file_kv[hosted_file_id].end_time = event.target.end_time.value;
$ae_loc.files.processed_file_kv[hosted_file_id].reencode = event.target.reencode.value; $ae_loc.files.processed_file_kv[hosted_file_id].reencode = event.target.reencode.value;
$ae_loc.files.processed_file_kv[hosted_file_id].scale_down = event.target.scale_down.value; $ae_loc.files.processed_file_kv[hosted_file_id].scale_down = event.target.scale_down.value;
$ae_loc.files.processed_file_kv[hosted_file_id].new_filename = event.target.new_filename.value; $ae_loc.files.processed_file_kv[hosted_file_id].new_filename =
$ae_loc.files.processed_file_kv[hosted_file_id].clip_complete = false; event.target.new_filename.value;
$ae_loc.files.processed_file_kv[hosted_file_id].clip_complete = false;
let endpoint = `/hosted_file/${hosted_file_id}/clip_video`; let endpoint = `/hosted_file/${hosted_file_id}/clip_video`;
let params = { let params = {
link_to_type: link_to_type, link_to_type: link_to_type,
link_to_id: link_to_id, link_to_id: link_to_id,
filename_no_ext: event.target.new_filename.value.replace('.mp4', ''), filename_no_ext: event.target.new_filename.value.replace('.mp4', ''),
from_type: 'mp4', // Video file type being converted from_type: 'mp4', // Video file type being converted
to_type: 'mp4', // Video file type to convert to to_type: 'mp4', // Video file type to convert to
start_time: event.target.start_time.value, start_time: event.target.start_time.value,
end_time: event.target.end_time.value, end_time: event.target.end_time.value,
reencode: event.target.reencode.value, reencode: event.target.reencode.value,
scale_down: event.target.scale_down.value scale_down: event.target.scale_down.value
}; };
ae_promises[hosted_file_id] = {}; ae_promises[hosted_file_id] = {};
// .convert__hosted_file_obj // .convert__hosted_file_obj
ae_promises[hosted_file_id] = api ae_promises[hosted_file_id] = api
.get_object({ .get_object({
api_cfg: $ae_api, api_cfg: $ae_api,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
timeout: 300000, // 5 minutes timeout: 300000, // 5 minutes
// return_blob: true, // return_blob: true,
// filename: event.target.new_filename.value, // filename: event.target.new_filename.value,
// auto_download: false, // auto_download: false,
task_id: task_id, task_id: task_id,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (result) { .then(function (result) {
console.log(result); console.log(result);
video_clip_file_kv[result.hosted_file_id_random] = {}; video_clip_file_kv[result.hosted_file_id_random] = {};
video_clip_file_kv[result.hosted_file_id_random] = result; video_clip_file_kv[result.hosted_file_id_random] = result;
// $ae_loc.files.video_clip_file_kv[result.hosted_file_id_random] = {}; // $ae_loc.files.video_clip_file_kv[result.hosted_file_id_random] = {};
// $ae_loc.files.video_clip_file_kv[result.hosted_file_id_random] = result; // $ae_loc.files.video_clip_file_kv[result.hosted_file_id_random] = result;
$ae_sess.files.processed_file_kv[hosted_file_id].submit_status = 'clipped'; $ae_sess.files.processed_file_kv[hosted_file_id].submit_status = 'clipped';
$ae_sess.files.processed_file_kv[hosted_file_id].clip_complete = true; $ae_sess.files.processed_file_kv[hosted_file_id].clip_complete = true;
$ae_loc.files.processed_file_kv[hosted_file_id].submit_status = 'clipped'; $ae_loc.files.processed_file_kv[hosted_file_id].submit_status = 'clipped';
$ae_loc.files.processed_file_kv[hosted_file_id].clip_complete = true; $ae_loc.files.processed_file_kv[hosted_file_id].clip_complete = true;
submit_status = 'clipped'; submit_status = 'clipped';
clip_complete = true; clip_complete = true;
// let file_blob = new Blob([result.data]); // let file_blob = new Blob([result.data]);
// // console.log(file_blob); // // console.log(file_blob);
// let file_obj_url = window.URL.createObjectURL(file_blob); // The img src // let file_obj_url = window.URL.createObjectURL(file_blob); // The img src
// // const url = window.URL.createObjectURL(new Blob([result.data])); // // const url = window.URL.createObjectURL(new Blob([result.data]));
// download_clip_src = file_obj_url; // download_clip_src = file_obj_url;
// // download_filename = file_obj_url; // // download_filename = file_obj_url;
return true; return true;
}); });
} }
</script> </script>
<section class="{class_li_default} {class_li}"> <section class="{class_li_default} {class_li}">
<!-- <h3 class="h3">{hosted_file_obj_li.length}&times; files uploaded</h3> <!-- <h3 class="h3">{hosted_file_obj_li.length}&times; files uploaded</h3>
{#each hosted_file_obj_li as hosted_file_obj, i} --> {#each hosted_file_obj_li as hosted_file_obj, i} -->
<h3 class="h3"> <h3 class="h3">
{Object.entries(hosted_file_obj_kv).length}× files uploaded {Object.entries(hosted_file_obj_kv).length}× files uploaded
</h3> </h3>
{#each Object.entries(hosted_file_obj_kv) as [hosted_file_id, hosted_file_obj]} {#each Object.entries(hosted_file_obj_kv) as [hosted_file_id, hosted_file_obj]}
<div class="border border-gray-300 rounded-lg p-2 m-2"> <div class="border border-gray-300 rounded-lg p-2 m-2">
<!-- {#if $ae_sess.files[hosted_file_id].upload_complete} <!-- {#if $ae_sess.files[hosted_file_id].upload_complete}
<a href="/hosted_file/{hosted_file_id}/download?x_no_account_id_token=direct-download" download={$ae_sess.files[hosted_file_id].new_filename} class="ae_btn btn_lg btn_primary"><span class="fas fa-download"></span> Ready to Download</a> <a href="/hosted_file/{hosted_file_id}/download?x_no_account_id_token=direct-download" download={$ae_sess.files[hosted_file_id].new_filename} class="ae_btn btn_lg btn_primary"><span class="fas fa-download"></span> Ready to Download</a>
{/if} --> {/if} -->
<div class="flex flex-row flex-wrap gap-1 justify-center items-center w-full"> <div class="flex flex-row flex-wrap gap-1 justify-center items-center w-full">
<!-- Remove from uploaded file kv list --> <!-- Remove from uploaded file kv list -->
<button <button
type="button" type="button"
onclick={() => { onclick={() => {
// This (uploaded_file_kv) is referenced by other AE components. Currently it is only used with the manage hosted file list and clip video components. // This (uploaded_file_kv) is referenced by other AE components. Currently it is only used with the manage hosted file list and clip video components.
console.log( console.log(
`Removed hosted file ID: ${hosted_file_id}`, `Removed hosted file ID: ${hosted_file_id}`,
$ae_loc.files.uploaded_file_kv $ae_loc.files.uploaded_file_kv
); );
// delete $ae_sess.files.uploaded_file_kv[hosted_file_id]; // delete $ae_sess.files.uploaded_file_kv[hosted_file_id];
delete $ae_loc.files.uploaded_file_kv[hosted_file_id]; delete $ae_loc.files.uploaded_file_kv[hosted_file_id];
$ae_loc.files.uploaded_file_kv = { ...$ae_loc.files.uploaded_file_kv }; $ae_loc.files.uploaded_file_kv = { ...$ae_loc.files.uploaded_file_kv };
delete hosted_file_obj_kv[hosted_file_id]; delete hosted_file_obj_kv[hosted_file_id];
hosted_file_obj_kv = { ...hosted_file_obj_kv }; hosted_file_obj_kv = { ...hosted_file_obj_kv };
// delete $ae_loc.files.uploaded_file_kv[hosted_file_obj.hosted_file_id]; // delete $ae_loc.files.uploaded_file_kv[hosted_file_obj.hosted_file_id];
console.log( console.log(
`Removed hosted file ID: ${hosted_file_obj.hosted_file_id}`, `Removed hosted file ID: ${hosted_file_obj.hosted_file_id}`,
$ae_loc.files.uploaded_file_kv $ae_loc.files.uploaded_file_kv
); );
}} }}
class="btn btn-sm preset-tonal-warning hover:preset-filled-warning-500" class="btn btn-sm preset-tonal-warning hover:preset-filled-warning-500"
title={`Remove this file from list of videos:\n${hosted_file_obj.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}... Hosted ID: ${hosted_file_obj.hosted_file_id_random}`} title={`Remove this file from list of videos:\n${hosted_file_obj.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}... Hosted ID: ${hosted_file_obj.hosted_file_id_random}`}
> >
<span class="fas fa-minus-circle m-1"></span> <span class="fas fa-minus-circle m-1"></span>
<span class="">Remove</span> <span class="">Remove</span>
</button> </button>
<!-- Download the file --> <!-- Download the file -->
<button <button
type="button" type="button"
disabled={!$ae_loc.trusted_access} disabled={!$ae_loc.trusted_access}
onclick={() => { onclick={() => {
ae_promises[hosted_file_id] = api.download_hosted_file({ ae_promises[hosted_file_id] = api.download_hosted_file({
api_cfg: $ae_api, api_cfg: $ae_api,
hosted_file_id: hosted_file_id, hosted_file_id: hosted_file_id,
return_file: true, return_file: true,
filename: hosted_file_obj.filename, filename: hosted_file_obj.filename,
auto_download: true, auto_download: true,
log_lvl: 0 log_lvl: 0
}); });
// window.postMessage({ type: 'download_event_file', hosted_file_id: idaa_archive_content_obj.hosted_file_id, filename: idaa_archive_content_obj.filename, auto_download: true }, '*'); // window.postMessage({ type: 'download_event_file', hosted_file_id: idaa_archive_content_obj.hosted_file_id, filename: idaa_archive_content_obj.filename, auto_download: true }, '*');
}} }}
class:hidden={!$ae_loc.edit_mode} class:hidden={!$ae_loc.edit_mode}
class="novi_btn btn btn-sm lg:btn-md preset-tonal-primary hover:preset-filled-primary-500 min-w-72 lg:min-w-96" class="novi_btn btn btn-sm lg:btn-md preset-tonal-primary hover:preset-filled-primary-500 min-w-72 lg:min-w-96"
title={`Download this file:\n${hosted_file_obj.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}... Hosted ID: ${hosted_file_obj.hosted_file_id_random}`} title={`Download this file:\n${hosted_file_obj.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}... Hosted ID: ${hosted_file_obj.hosted_file_id_random}`}
> >
{#await ae_promises[hosted_file_id]} {#await ae_promises[hosted_file_id]}
<span class="fas fa-spinner fa-spin mx-1"></span> <span class="fas fa-spinner fa-spin mx-1"></span>
{#if submit_status == 'clipping'} {#if submit_status == 'clipping'}
<span class="">Clipping</span> <span class="">Clipping</span>
{:else} {:else}
<span class=""> <span class="">
Downloading Downloading
{#if $ae_sess.api_download_kv[hosted_file_id]} {#if $ae_sess.api_download_kv[hosted_file_id]}
{$ae_sess.api_download_kv[hosted_file_id].percent_completed}% {$ae_sess.api_download_kv[hosted_file_id].percent_completed}%
{/if} {/if}
: :
</span> </span>
{/if} {/if}
{:then} {:then}
<span class="fas fa-{ae_util.file_extension_icon(hosted_file_obj?.file_extension)}" <span
></span> class="fas fa-{ae_util.file_extension_icon(
{/await} hosted_file_obj?.file_extension
)}"
></span>
{/await}
<span class="grow"> <span class="grow">
{ae_util.shorten_filename({ filename: hosted_file_obj?.filename, max_length: 30 })} {ae_util.shorten_filename({
</span> filename: hosted_file_obj?.filename,
</button> max_length: 30
<span })}
>{ae_util.shorten_filename({ filename: hosted_file_obj?.filename, max_length: 30 })}</span </span>
> </button>
<span> <span
<span class="text-sm font-bold"> File ID: </span> >{ae_util.shorten_filename({
{hosted_file_obj.hosted_file_id_random}</span filename: hosted_file_obj?.filename,
> max_length: 30
<span> })}</span
<span class="text-sm font-bold"> Type: </span> >
{hosted_file_obj.extension}</span <span>
> <span class="text-sm font-bold"> File ID: </span>
<!-- <span>{hosted_file_obj.filename}</span> --> {hosted_file_obj.hosted_file_id_random}</span
</div> >
<span>
<span class="text-sm font-bold"> Type: </span>
{hosted_file_obj.extension}</span
>
<!-- <span>{hosted_file_obj.filename}</span> -->
</div>
<form onsubmit={preventDefault(handle_clip_video)} class="{class_li_default} {class_li}"> <form
<!-- {$ae_sess?.files[hosted_file_obj?.hosted_file_id_random ?? 'obj'].submit_status ?? 'not set'} --> onsubmit={preventDefault(handle_clip_video)}
class="{class_li_default} {class_li}"
>
<!-- {$ae_sess?.files[hosted_file_obj?.hosted_file_id_random ?? 'obj'].submit_status ?? 'not set'} -->
<input type="hidden" name="hosted_file_id" value={hosted_file_obj.hosted_file_id_random} /> <input
type="hidden"
name="hosted_file_id"
value={hosted_file_obj.hosted_file_id_random}
/>
<div class="flex flex-row gap-1 justify-center items-center w-full"> <div class="flex flex-row gap-1 justify-center items-center w-full">
<span class="text-xs font-bold w-32">New Filename:</span> <span class="text-xs font-bold w-32">New Filename:</span>
<input <input
type="text" type="text"
class="input w-full text-sm" class="input w-full text-sm"
name="new_filename" name="new_filename"
value={hosted_file_obj.filename} value={hosted_file_obj.filename}
/> />
</div> </div>
<div class="max-w-(--breakpoint-sm) flex flex-row gap-1 justify-center items-center w-full"> <div
<label class="max-w-(--breakpoint-sm) flex flex-row gap-1 justify-center items-center w-full"
class="label w-48" >
title="The start time of the clip. This is the time in the video where the clip will start. You may need to subtract a few seconds to get the exact start time." <label
> class="label w-48"
<span class="text-xs font-bold">Start time (HH:MM:SS)</span> title="The start time of the clip. This is the time in the video where the clip will start. You may need to subtract a few seconds to get the exact start time."
<input >
type="text" <span class="text-xs font-bold">Start time (HH:MM:SS)</span>
name="start_time" <input
value={$ae_loc.files.processed_file_kv && type="text"
$ae_loc.files.processed_file_kv[hosted_file_id] && name="start_time"
$ae_loc.files.processed_file_kv[hosted_file_id].start_time value={$ae_loc.files.processed_file_kv &&
? $ae_loc.files.processed_file_kv[hosted_file_id].start_time $ae_loc.files.processed_file_kv[hosted_file_id] &&
: '00:00:00'} $ae_loc.files.processed_file_kv[hosted_file_id].start_time
placeholder="HH:MM:SS (00:01:30)" ? $ae_loc.files.processed_file_kv[hosted_file_id].start_time
class="input w-32" : '00:00:00'}
/> placeholder="HH:MM:SS (00:01:30)"
</label> class="input w-32"
/>
</label>
<label <label
class="label w-48" class="label w-48"
title="The end time of the clip. This is the time in the video where the clip will end. You may need to add a few seconds to get the exact end time." title="The end time of the clip. This is the time in the video where the clip will end. You may need to add a few seconds to get the exact end time."
> >
<span class="text-xs font-bold">End time (HH:MM:SS)</span> <span class="text-xs font-bold">End time (HH:MM:SS)</span>
<input <input
type="text" type="text"
name="end_time" name="end_time"
value={$ae_loc.files.processed_file_kv && value={$ae_loc.files.processed_file_kv &&
$ae_loc.files.processed_file_kv[hosted_file_id] && $ae_loc.files.processed_file_kv[hosted_file_id] &&
$ae_loc.files.processed_file_kv[hosted_file_id].end_time $ae_loc.files.processed_file_kv[hosted_file_id].end_time
? $ae_loc.files.processed_file_kv[hosted_file_id].end_time ? $ae_loc.files.processed_file_kv[hosted_file_id].end_time
: '00:45:59'} : '00:45:59'}
placeholder="HH:MM:SS (01:05:25)" placeholder="HH:MM:SS (01:05:25)"
class="input w-32" class="input w-32"
/> />
</label> </label>
<span <span
class="flex flex-col gap-1 items-center justify-center" class="flex flex-col gap-1 items-center justify-center"
title="Re-encode the video file? This does cause some minor quality loss. Re-encoding is useful if the audio or video seems to be chopped off at the beginning or end of the clip. It can also help with partially corrupted files." title="Re-encode the video file? This does cause some minor quality loss. Re-encoding is useful if the audio or video seems to be chopped off at the beginning or end of the clip. It can also help with partially corrupted files."
> >
<span class="text-xs font-bold"> Re-encode? </span> <span class="text-xs font-bold"> Re-encode? </span>
<label class="inline-block"> <label class="inline-block">
<input type="radio" name="reencode" value="true" class="radio" checked /> <input
True type="radio"
</label> name="reencode"
<label class="inline-block"> value="true"
<input type="radio" name="reencode" value="false" class="radio" /> class="radio"
False checked
</label> />
</span> True
</label>
<label class="inline-block">
<input type="radio" name="reencode" value="false" class="radio" />
False
</label>
</span>
<span <span
class="flex flex-col gap-1 items-center justify-center" class="flex flex-col gap-1 items-center justify-center"
title="Scale the video file down to 1920x1080? This does cause some minor quality loss. Re-encoding is useful if the audio or video seems to be chopped off at the beginning or end of the clip. It can also help with partially corrupted files." title="Scale the video file down to 1920x1080? This does cause some minor quality loss. Re-encoding is useful if the audio or video seems to be chopped off at the beginning or end of the clip. It can also help with partially corrupted files."
> >
<span class="text-xs font-bold"> Scale down? </span> <span class="text-xs font-bold"> Scale down? </span>
<label class="inline-block"> <label class="inline-block">
<input type="radio" name="scale_down" value="true" class="radio" checked /> <input
True type="radio"
</label> name="scale_down"
<label class="inline-block"> value="true"
<input type="radio" name="scale_down" value="false" class="radio" /> class="radio"
False checked
</label> />
</span> True
</div> </label>
<label class="inline-block">
<input type="radio" name="scale_down" value="false" class="radio" />
False
</label>
</span>
</div>
<button <button
type="submit" type="submit"
class="btn btn-lg btn-primary preset-tonal-primary border border-primary-500" class="btn btn-lg btn-primary preset-tonal-primary border border-primary-500"
disabled={submit_status == 'clipping'} disabled={submit_status == 'clipping'}
> >
<!-- {#await ae_promises[hosted_file_id]} --> <!-- {#await ae_promises[hosted_file_id]} -->
{#if $ae_loc.files.processed_file_kv[hosted_file_id] && $ae_loc.files.processed_file_kv[hosted_file_id].submit_status == 'clipping'} {#if $ae_loc.files.processed_file_kv[hosted_file_id] && $ae_loc.files.processed_file_kv[hosted_file_id].submit_status == 'clipping'}
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>
<span class="highlight">Clipping...</span> <span class="highlight">Clipping...</span>
{:else} {:else}
<!-- {#if ae_promises[hosted_file_id]} --> <!-- {#if ae_promises[hosted_file_id]} -->
{#if $ae_loc.files.processed_file_kv[hosted_file_id] && $ae_loc.files.processed_file_kv[hosted_file_id].submit_status == 'clipped'} {#if $ae_loc.files.processed_file_kv[hosted_file_id] && $ae_loc.files.processed_file_kv[hosted_file_id].submit_status == 'clipped'}
<span class="fas fa-check m-1"></span> <span class="fas fa-check m-1"></span>
Clipped Clipped
{:else} {:else}
<span class="fas fa-cut m-1"></span> <span class="fas fa-cut m-1"></span>
Clip Video Clip Video
{/if} {/if}
{/if} {/if}
<!-- <span class="fas fa-cut m-1"></span> <!-- <span class="fas fa-cut m-1"></span>
Clip Video --> Clip Video -->
</button> </button>
</form> </form>
{#await ae_promises[hosted_file_id]} {#await ae_promises[hosted_file_id]}
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>
<span class="highlight">Processing... This may take a few minutes.</span> <span class="highlight">Processing... This may take a few minutes.</span>
{:then} {:then}
{#if ae_promises[hosted_file_id]} {#if ae_promises[hosted_file_id]}
<span class="fas fa-download"></span> Ready to download below! <span class="fas fa-download"></span> Ready to download below!
{:else} {:else}
<!-- <p>Fill out the form and select the video file to clip.</p> --> <!-- <p>Fill out the form and select the video file to clip.</p> -->
{/if} {/if}
{/await} {/await}
</div> </div>
{/each} {/each}
<!-- <hr /> <!-- <hr />
{#await ae_promises.upload__hosted_file_obj} {#await ae_promises.upload__hosted_file_obj}
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>

View File

@@ -1,90 +1,91 @@
<script lang="ts"> <script lang="ts">
// Imports // Imports
// Import components and elements // Import components and elements
// Import storage, functions, and libraries // Import storage, functions, and libraries
import type { key_val } from '$lib/stores/ae_stores'; import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api'; import { api } from '$lib/api/api';
import { ae_util } from '$lib/ae_utils/ae_utils'; import { ae_util } from '$lib/ae_utils/ae_utils';
import { import {
ae_snip, ae_snip,
ae_loc, ae_loc,
ae_sess, ae_sess,
ae_api, ae_api,
ae_trig, ae_trig,
slct, slct,
slct_trigger slct_trigger
} from '$lib/stores/ae_stores'; } from '$lib/stores/ae_stores';
// Exports // Exports
// export let hosted_file_id_li: string[] = []; // export let hosted_file_id_li: string[] = [];
// export let hosted_file_obj_li: any[] = []; // export let hosted_file_obj_li: any[] = [];
interface Props { interface Props {
log_lvl?: number; log_lvl?: number;
// export let hosted_file_obj_kv: key_val = {}; // export let hosted_file_obj_kv: key_val = {};
video_clip_file_kv?: key_val; video_clip_file_kv?: key_val;
class_li_default?: string; class_li_default?: string;
class_li?: string; class_li?: string;
link_to_type: string; link_to_type: string;
link_to_id: string; link_to_id: string;
} }
let { let {
log_lvl = 0, log_lvl = 0,
video_clip_file_kv = $bindable({}), video_clip_file_kv = $bindable({}),
class_li_default = 'flex flex-row flex-wrap gap-2 items-center justify-center w-full max-w-2xl p-2 mx-auto my-1 border border-gray-300 rounded-lg', class_li_default = 'flex flex-row flex-wrap gap-2 items-center justify-center w-full max-w-2xl p-2 mx-auto my-1 border border-gray-300 rounded-lg',
class_li = '', class_li = '',
link_to_type, link_to_type,
link_to_id link_to_id
}: Props = $props(); }: Props = $props();
let ae_promises: key_val = $state({}); let ae_promises: key_val = $state({});
</script> </script>
<h3 class="h3">{Object.entries($ae_loc.files).length}× files clipped</h3> <h3 class="h3">{Object.entries($ae_loc.files).length}× files clipped</h3>
<div class="{class_li_default} {class_li} "> <div class="{class_li_default} {class_li} ">
{#each Object.entries(video_clip_file_kv) as [hosted_file_id, hosted_file_obj]} {#each Object.entries(video_clip_file_kv) as [hosted_file_id, hosted_file_obj]}
<button <button
type="button" type="button"
disabled={!$ae_loc.trusted_access} disabled={!$ae_loc.trusted_access}
onclick={() => { onclick={() => {
ae_promises[hosted_file_id] = api.download_hosted_file({ ae_promises[hosted_file_id] = api.download_hosted_file({
api_cfg: $ae_api, api_cfg: $ae_api,
hosted_file_id: hosted_file_id, hosted_file_id: hosted_file_id,
return_file: true, return_file: true,
filename: hosted_file_obj.filename, filename: hosted_file_obj.filename,
auto_download: true, auto_download: true,
log_lvl: log_lvl log_lvl: log_lvl
}); });
// window.postMessage({ type: 'download_event_file', hosted_file_id: idaa_archive_content_obj.hosted_file_id, filename: idaa_archive_content_obj.filename, auto_download: true }, '*'); // window.postMessage({ type: 'download_event_file', hosted_file_id: idaa_archive_content_obj.hosted_file_id, filename: idaa_archive_content_obj.filename, auto_download: true }, '*');
}} }}
class="novi_btn btn btn-sm lg:btn-md preset-tonal-primary hover:preset-filled-primary-500 min-w-72 lg:min-w-96" class="novi_btn btn btn-sm lg:btn-md preset-tonal-primary hover:preset-filled-primary-500 min-w-72 lg:min-w-96"
title={`Download this file:\n${hosted_file_obj.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}... Hosted ID: ${hosted_file_obj.hosted_file_id_random}`} title={`Download this file:\n${hosted_file_obj.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}... Hosted ID: ${hosted_file_obj.hosted_file_id_random}`}
> >
{#await ae_promises[hosted_file_id]} {#await ae_promises[hosted_file_id]}
<span class="fas fa-spinner fa-spin mx-1"></span> <span class="fas fa-spinner fa-spin mx-1"></span>
<span class=""> <span class="">
Downloading Downloading
{#if $ae_sess.api_download_kv[hosted_file_id]} {#if $ae_sess.api_download_kv[hosted_file_id]}
{$ae_sess.api_download_kv[hosted_file_id].percent_completed}% {$ae_sess.api_download_kv[hosted_file_id].percent_completed}%
{/if} {/if}
: :
</span> </span>
{:then} {:then}
<span class="fas fa-{ae_util.file_extension_icon(hosted_file_obj?.file_extension)}"></span> <span class="fas fa-{ae_util.file_extension_icon(hosted_file_obj?.file_extension)}"
{/await} ></span>
{/await}
<span class="grow"> <span class="grow">
{ae_util.shorten_filename({ filename: hosted_file_obj?.filename, max_length: 30 })} {ae_util.shorten_filename({ filename: hosted_file_obj?.filename, max_length: 30 })}
</span> </span>
<span class="shrink"> <span class="shrink">
{ae_util.format_bytes(hosted_file_obj?.size)} {ae_util.format_bytes(hosted_file_obj?.size)}
</span> </span>
</button> </button>
{/each} {/each}
</div> </div>

View File

@@ -1,408 +1,409 @@
<script lang="ts"> <script lang="ts">
export let log_lvl: number = 0; export let log_lvl: number = 0;
// Imports // Imports
// Import components and elements // Import components and elements
import Element_input_files_tbl from '$lib/elements/element_input_files_tbl.svelte'; import Element_input_files_tbl from '$lib/elements/element_input_files_tbl.svelte';
// Import storage, functions, and libraries // Import storage, functions, and libraries
import type { key_val } from '$lib/stores/ae_stores'; import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api'; import { api } from '$lib/api/api';
import { import {
ae_snip, ae_snip,
ae_loc, ae_loc,
ae_sess, ae_sess,
ae_api, ae_api,
ae_trig, ae_trig,
slct, slct,
slct_trigger slct_trigger
} from '$lib/stores/ae_stores'; } from '$lib/stores/ae_stores';
// Exports // Exports
// Expecting these for link_to_type: 'event', 'event_location', 'archive_content', etc // Expecting these for link_to_type: 'event', 'event_location', 'archive_content', etc
export let link_to_type: string; export let link_to_type: string;
export let link_to_id: string; export let link_to_id: string;
export let input_name = 'file_list'; export let input_name = 'file_list';
export let multiple: boolean = true; export let multiple: boolean = true;
export let required: boolean = true; export let required: boolean = true;
export let accept: string = export let accept: string =
'audio/*, image/*, video/*, .bak, .cfg, .css, .csv, .doc, .docx, .gz, .htm, .html, .ini, .iso, .j2, .json, .key, .keynote, .md, .pdf, .ppt, .pptx, .rar, .rtf, .sql, .svelte, ttf, .txt, .xls, .xlsx, .xz, .zip, .bin, .dmg, .exe, .js, .msi, .php, .py, .sh'; 'audio/*, image/*, video/*, .bak, .cfg, .css, .csv, .doc, .docx, .gz, .htm, .html, .ini, .iso, .j2, .json, .key, .keynote, .md, .pdf, .ppt, .pptx, .rar, .rtf, .sql, .svelte, ttf, .txt, .xls, .xlsx, .xz, .zip, .bin, .dmg, .exe, .js, .msi, .php, .py, .sh';
export let class_li_default: string = export let class_li_default: string =
'flex flex-col gap-1 items-center justify-center w-full max-w-2xl mx-auto my-1'; 'flex flex-col gap-1 items-center justify-center w-full max-w-2xl mx-auto my-1';
export let class_li: string = ''; export let class_li: string = '';
export let input_class_li: string[] = ['file_drop_area']; export let input_class_li: string[] = ['file_drop_area'];
export let table_class_li: string[] = ['table', 'table-sm', 'table-striped', '', 'text-sm']; export let table_class_li: string[] = ['table', 'table-sm', 'table-striped', '', 'text-sm'];
export let upload_complete: boolean = false; export let upload_complete: boolean = false;
export let submit_status: null | string = null; export let submit_status: null | string = null;
export let hosted_file_id_li: string[] = []; export let hosted_file_id_li: string[] = [];
export let hosted_file_obj_li: any[] = []; export let hosted_file_obj_li: any[] = [];
// Local Variables // Local Variables
let task_id = link_to_id; let task_id = link_to_id;
let input_file_list: any = null; let input_file_list: any = null;
let ae_promises: key_val = {}; // Promise<any>; let ae_promises: key_val = {}; // Promise<any>;
let ae_triggers: key_val = {}; let ae_triggers: key_val = {};
let input_element_id = 'ae_comp__hosted_files_upload__input'; let input_element_id = 'ae_comp__hosted_files_upload__input';
let form_kv: key_val = { let form_kv: key_val = {
start_time: null, start_time: null,
end_time: null, end_time: null,
reencode: null, reencode: null,
video_file: null video_file: null
}; };
let download_clip_src: string; let download_clip_src: string;
let download_clip_filename: string; let download_clip_filename: string;
// *** Functions and Logic // *** Functions and Logic
async function handle_submit_form_files(event) { async function handle_submit_form_files(event) {
console.log('*** handle_submit_form() ***'); console.log('*** handle_submit_form() ***');
$ae_sess.files.disable_submit__hosted_file_obj = true; $ae_sess.files.disable_submit__hosted_file_obj = true;
$ae_sess.files.submit_status = 'saving'; $ae_sess.files.submit_status = 'saving';
submit_status = 'saving'; submit_status = 'saving';
upload_complete = false; upload_complete = false;
hosted_file_id_li = []; hosted_file_id_li = [];
hosted_file_obj_li = []; hosted_file_obj_li = [];
let hosted_file_results; let hosted_file_results;
form_kv = { form_kv = {
start_time: event.target.start_time.value, start_time: event.target.start_time.value,
end_time: event.target.end_time.value, end_time: event.target.end_time.value,
reencode: event.target.reencode.value, reencode: event.target.reencode.value,
video_file: event.target.file_list.files[0] video_file: event.target.file_list.files[0]
}; };
// const form_data = new FormData(); // const form_data = new FormData();
// form_data.append('start_time', event.target.start_time.value); // form_data.append('start_time', event.target.start_time.value);
// form_data.append('end_time', event.target.end_time.value); // form_data.append('end_time', event.target.end_time.value);
// if (event.target.reencode.value == '1' || event.target.reencode.value == 'true') { // if (event.target.reencode.value == '1' || event.target.reencode.value == 'true') {
// form_data.append('reencode', 'true'); // form_data.append('reencode', 'true');
// } else { // } else {
// form_data.append('reencode', 'false'); // form_data.append('reencode', 'false');
// } // }
// form_data.append('reencode', event.target.reencode.value); // form_data.append('reencode', event.target.reencode.value);
// form_data.append(`video_file`, event.target.video_file.files[0]); // form_data.append(`video_file`, event.target.video_file.files[0]);
// let download_filename = `clipped_file_test.mp4`; // let download_filename = `clipped_file_test.mp4`;
// let params = null; // let params = null;
// let endpoint = '/hosted_file/clip_video'; // let endpoint = '/hosted_file/clip_video';
// console.log(form_data); // console.log(form_data);
// params = null; // params = null;
if (event.target[input_element_id].files.length > 0) { if (event.target[input_element_id].files.length > 0) {
task_id = link_to_id; // Ideally this should be the file hash, but we may be uploading multiple files at once. This should be done with a loop instead? task_id = link_to_id; // Ideally this should be the file hash, but we may be uploading multiple files at once. This should be done with a loop instead?
// Loop through each file and upload them individually in event.target[input_element_id].files // Loop through each file and upload them individually in event.target[input_element_id].files
// The task_id should be the file hash. // The task_id should be the file hash.
// processed_file_list[i] has the file hash_sha256, hash_sha256_match, warnings, uploaded, uploaded_bytes, filename, and file_size_bytes. // processed_file_list[i] has the file hash_sha256, hash_sha256_match, warnings, uploaded, uploaded_bytes, filename, and file_size_bytes.
for (let i = 0; i < event.target[input_element_id].files.length; i++) { for (let i = 0; i < event.target[input_element_id].files.length; i++) {
let tmp_file = event.target[input_element_id].files[i]; let tmp_file = event.target[input_element_id].files[i];
task_id = $ae_sess.files.processed_file_list[i].hash_sha256; task_id = $ae_sess.files.processed_file_list[i].hash_sha256;
hosted_file_results = await handle_input_upload_files([tmp_file], form_kv, task_id); hosted_file_results = await handle_input_upload_files([tmp_file], form_kv, task_id);
if (hosted_file_results) { if (hosted_file_results) {
console.log(`hosted_file_results:`, hosted_file_results); console.log(`hosted_file_results:`, hosted_file_results);
} else { } else {
console.log(`hosted_file_results:`, hosted_file_results); console.log(`hosted_file_results:`, hosted_file_results);
} }
} }
// hosted_file_results = await handle_input_upload_files(event.target[input_element_id].files, task_id); // hosted_file_results = await handle_input_upload_files(event.target[input_element_id].files, task_id);
$ae_sess.files.processed_file_list = []; $ae_sess.files.processed_file_list = [];
$ae_sess = $ae_sess; $ae_sess = $ae_sess;
event.target.reset(); event.target.reset();
// await tick(); // await tick();
if (log_lvl) { if (log_lvl) {
console.log(`hosted_file_id_li: ${hosted_file_id_li}`, hosted_file_id_li); console.log(`hosted_file_id_li: ${hosted_file_id_li}`, hosted_file_id_li);
} else if (log_lvl > 1) { } else if (log_lvl > 1) {
console.log('hosted_file_results:', hosted_file_results); console.log('hosted_file_results:', hosted_file_results);
} }
} }
$ae_sess.files.disable_submit__hosted_file_obj = false; $ae_sess.files.disable_submit__hosted_file_obj = false;
$ae_sess.files.submit_status = 'saved'; $ae_sess.files.submit_status = 'saved';
submit_status = 'saved'; submit_status = 'saved';
upload_complete = true; upload_complete = true;
} }
async function handle_input_upload_files(input_upload_files, form_kv, task_id) { async function handle_input_upload_files(input_upload_files, form_kv, task_id) {
console.log('*** handle_input_upload_files() ***'); console.log('*** handle_input_upload_files() ***');
console.log(input_upload_files); console.log(input_upload_files);
console.log(form_kv); console.log(form_kv);
const form_data = new FormData(); const form_data = new FormData();
// form_data.append('account_id', $ae_loc.account_id); // form_data.append('account_id', $ae_loc.account_id);
// form_data.append('link_to_type', link_to_type); // form_data.append('link_to_type', link_to_type);
// form_data.append('link_to_id', link_to_id); // form_data.append('link_to_id', link_to_id);
form_data.append('start_time', form_kv.start_time); form_data.append('start_time', form_kv.start_time);
form_data.append('end_time', form_kv.end_time); form_data.append('end_time', form_kv.end_time);
if (form_kv.reencode == '1' || form_kv.reencode == 'true') { if (form_kv.reencode == '1' || form_kv.reencode == 'true') {
form_data.append('reencode', 'true'); form_data.append('reencode', 'true');
} else { } else {
form_data.append('reencode', 'false'); form_data.append('reencode', 'false');
} }
// There should really only be one file uploaded at a time for now. // There should really only be one file uploaded at a time for now.
for (let i = 0; i < input_upload_files.length; i++) { for (let i = 0; i < input_upload_files.length; i++) {
form_data.append(`video_file`, input_upload_files[i]); form_data.append(`video_file`, input_upload_files[i]);
} }
// hash_sha256, uploaded, uploaded_bytes // hash_sha256, uploaded, uploaded_bytes
// $ae_sess.files.processed_file_list[i] = { // $ae_sess.files.processed_file_list[i] = {
// ...$ae_sess.files.processed_file_list[i], // ...$ae_sess.files.processed_file_list[i],
// uploaded: $ae_sess.api_upload_kv[link_to_id].percent_completed, // uploaded: $ae_sess.api_upload_kv[link_to_id].percent_completed,
// uploaded_bytes: $ae_sess.api_upload_kv[link_to_id].uploaded_bytes, // uploaded_bytes: $ae_sess.api_upload_kv[link_to_id].uploaded_bytes,
// }; // };
let params = null; let params = null;
let endpoint = '/hosted_file/clip_video'; let endpoint = '/hosted_file/clip_video';
console.log(form_data); console.log(form_data);
params = null; params = null;
// Uncomment and the post_promise is not seen by the "await" below // Uncomment and the post_promise is not seen by the "await" below
// post_promise = await api.post_object({api_cfg: $cfg.api, endpoint: endpoint, params: params, data:form_data}); // post_promise = await api.post_object({api_cfg: $cfg.api, endpoint: endpoint, params: params, data:form_data});
// Uncomment so that the post_promise is not seen by the "await" below // Uncomment so that the post_promise is not seen by the "await" below
ae_promises.upload__hosted_file_obj = api ae_promises.upload__hosted_file_obj = api
.post_object({ .post_object({
api_cfg: $ae_api, api_cfg: $ae_api,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
form_data: form_data, form_data: form_data,
return_blob: true, return_blob: true,
filename: 'clipped_video_test.mp4', filename: 'clipped_video_test.mp4',
auto_download: false, auto_download: false,
task_id: task_id, task_id: task_id,
log_lvl: log_lvl log_lvl: log_lvl
// retry_count: 1, // retry_count: 1,
}) })
.then(async function (result) { .then(async function (result) {
console.log(result); console.log(result);
let file_blob = new Blob([result.data]); let file_blob = new Blob([result.data]);
// console.log(file_blob); // console.log(file_blob);
let file_obj_url = window.URL.createObjectURL(file_blob); // The img src let file_obj_url = window.URL.createObjectURL(file_blob); // The img src
// const url = window.URL.createObjectURL(new Blob([result.data])); // const url = window.URL.createObjectURL(new Blob([result.data]));
download_clip_src = file_obj_url; download_clip_src = file_obj_url;
// download_filename = file_obj_url; // download_filename = file_obj_url;
return true; return true;
// // WARNING!!!! ONLY ONE FILE IS EXPECTED TO BE UPLOADED AT A TIME!!! // // WARNING!!!! ONLY ONE FILE IS EXPECTED TO BE UPLOADED AT A TIME!!!
// // NOTE: The /hosted_file/upload_files endpoint will always return a list of successful files uploaded. In this case we are only uploading one file and expecting a list of one item. // // NOTE: The /hosted_file/upload_files endpoint will always return a list of successful files uploaded. In this case we are only uploading one file and expecting a list of one item.
// let x = 0; // let x = 0;
// console.log(result[x]); // console.log(result[x]);
// let hosted_file_obj = result[x]; // let hosted_file_obj = result[x];
// let hosted_file_id = hosted_file_obj.hosted_file_id_random; // let hosted_file_id = hosted_file_obj.hosted_file_id_random;
// hosted_file_id_li.push(hosted_file_id); // hosted_file_id_li.push(hosted_file_id);
// hosted_file_obj_li.push(hosted_file_obj); // hosted_file_obj_li.push(hosted_file_obj);
// let hosted_file_data: key_val = {}; // let hosted_file_data: key_val = {};
// hosted_file_data['hosted_file_id_random'] = hosted_file_id; // hosted_file_data['hosted_file_id_random'] = hosted_file_id;
// hosted_file_data['for_type'] = link_to_type; // hosted_file_data['for_type'] = link_to_type;
// hosted_file_data['for_id_random'] = link_to_id; // hosted_file_data['for_id_random'] = link_to_id;
// hosted_file_data['filename'] = hosted_file_obj.filename; // hosted_file_data['filename'] = hosted_file_obj.filename;
// hosted_file_data['extension'] = hosted_file_obj.extension; // hosted_file_data['extension'] = hosted_file_obj.extension;
// hosted_file_data['enable'] = true; // hosted_file_data['enable'] = true;
// console.log(hosted_file_data); // console.log(hosted_file_data);
// return hosted_file_data; // return hosted_file_data;
// $ae_sess.files.new_upload_list[i].uploaded_bytes = 10; // fake 10 bytes at least... // $ae_sess.files.new_upload_list[i].uploaded_bytes = 10; // fake 10 bytes at least...
// let event_file_id = await events_func.create_hosted_file_obj_from_hosted_file_async({ // let event_file_id = await events_func.create_hosted_file_obj_from_hosted_file_async({
// api_cfg: $ae_api, // api_cfg: $ae_api,
// hosted_file_id: hosted_file_id, // hosted_file_id: hosted_file_id,
// data: event_file_data, // data: event_file_data,
// log_lvl: log_lvl // log_lvl: log_lvl
// }) // })
// .then(function (create_result) { // .then(function (create_result) {
// console.log(create_result); // NOTE: This should be the event_file_id string // console.log(create_result); // NOTE: This should be the event_file_id string
// // let event_file_id = create_result; // // let event_file_id = create_result;
// return create_result; // return create_result;
// }); // });
// return event_file_id; // return event_file_id;
}) })
// .then(function (hosted_file_data) { // .then(function (hosted_file_data) {
// return hosted_file_data; // return hosted_file_data;
// }) // })
.catch(function (error: any) { .catch(function (error: any) {
console.log('Something went wrong.'); console.log('Something went wrong.');
console.log(error); console.log(error);
return false; return false;
}) })
.finally(function () { .finally(function () {
// $slct_trigger = 'load__hosted_file_obj_li'; // $slct_trigger = 'load__hosted_file_obj_li';
}); });
console.log(ae_promises.upload__hosted_file_obj); console.log(ae_promises.upload__hosted_file_obj);
let hosted_file_result = ae_promises.upload__hosted_file_obj; let hosted_file_result = ae_promises.upload__hosted_file_obj;
return hosted_file_result; return hosted_file_result;
} }
</script> </script>
<div> <div>
<!-- class:hidden={!$ae_loc.trusted_access} --> <!-- class:hidden={!$ae_loc.trusted_access} -->
<form on:submit|preventDefault={handle_submit_form_files} class="{class_li_default} {class_li}"> <form on:submit|preventDefault={handle_submit_form_files} class="{class_li_default} {class_li}">
<label class="label" <label class="label"
>Start time (HH:MM:SS) <input >Start time (HH:MM:SS) <input
type="text" type="text"
name="start_time" name="start_time"
value="00:00:00" value="00:00:00"
placeholder="HH:MM:SS (00:01:30)" placeholder="HH:MM:SS (00:01:30)"
class="input w-32" class="input w-32"
/></label /></label
> >
<label class="label" <label class="label"
>End time (HH:MM:SS) <input >End time (HH:MM:SS) <input
type="text" type="text"
name="end_time" name="end_time"
value="00:01:15" value="00:01:15"
placeholder="HH:MM:SS (01:05:25)" placeholder="HH:MM:SS (01:05:25)"
class="input w-32" class="input w-32"
/></label /></label
> >
<label class="label" <label class="label"
>Re-encode (true or false) <input >Re-encode (true or false) <input
type="text" type="text"
name="reencode" name="reencode"
value="false" value="false"
placeholder="true" placeholder="true"
class="input w-32" class="input w-32"
/></label /></label
> >
{#await ae_promises.upload__hosted_file_obj} {#await ae_promises.upload__hosted_file_obj}
<div class="text-lg flex flex-row gap-1 items-center justify-center"> <div class="text-lg flex flex-row gap-1 items-center justify-center">
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>
<span class=""> <span class="">
Uploading Uploading
{#if $ae_sess.api_upload_kv[task_id]} {#if $ae_sess.api_upload_kv[task_id]}
{$ae_sess.api_upload_kv[task_id].percent_completed}% {$ae_sess.api_upload_kv[task_id].percent_completed}%
{/if} {/if}
</span> </span>
</div> </div>
{/await} {/await}
<label <label
for="ae_comp__hosted_files_upload__input" for="ae_comp__hosted_files_upload__input"
class="svelte_input_file_label text-center" class="svelte_input_file_label text-center"
class:hidden={$ae_sess.files.disable_submit__hosted_file_obj} class:hidden={$ae_sess.files.disable_submit__hosted_file_obj}
> >
<slot name="label"> <slot name="label">
<div> <div>
<span class="fas fa-upload"></span> <span class="fas fa-upload"></span>
<!-- Select files to upload --> <!-- Select files to upload -->
<!-- <span class="fas fa-file-archive"></span> --> <!-- <span class="fas fa-file-archive"></span> -->
<strong class="bg-blue-300 p-1">Upload files</strong> <strong class="bg-blue-300 p-1">Upload files</strong>
<!-- (drag and drop) --> <!-- (drag and drop) -->
</div> </div>
<span class="text-sm text-gray-600 dark:text-gray-400 italic"> <span class="text-sm text-gray-600 dark:text-gray-400 italic">
<strong>Video files only</strong><br /> <strong>Video files only</strong><br />
(mp4 or mkv) (mp4 or mkv)
</span> </span>
</slot> </slot>
</label> </label>
<input <input
id={input_element_id} id={input_element_id}
type="file" type="file"
bind:files={input_file_list} bind:files={input_file_list}
{multiple} {multiple}
{required} {required}
{accept} {accept}
name={input_name} name={input_name}
class="svelte_input_file_element file-dropzone-input block w-full text-lg text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-hidden dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 {input_class_li.join( class="svelte_input_file_element file-dropzone-input block w-full text-lg text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-hidden dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 {input_class_li.join(
' ' ' '
)}" )}"
class:hidden={$ae_sess.files.disable_submit__hosted_file_obj} class:hidden={$ae_sess.files.disable_submit__hosted_file_obj}
/> />
<Element_input_files_tbl <Element_input_files_tbl
bind:input_file_list bind:input_file_list
bind:file_list_status={$ae_sess.files.status__file_list} bind:file_list_status={$ae_sess.files.status__file_list}
bind:processed_file_list={$ae_sess.files.processed_file_list} bind:processed_file_list={$ae_sess.files.processed_file_list}
{table_class_li} {table_class_li}
/> />
<button <button
type="submit" type="submit"
class="btn btn-lg btn-primary preset-tonal-primary border border-primary-500 hover:preset-tonal-success border border-success-500 w-54" class="btn btn-lg btn-primary preset-tonal-primary border border-primary-500 hover:preset-tonal-success border border-success-500 w-54"
disabled={$ae_sess.files.disable_submit__hosted_file_obj || disabled={$ae_sess.files.disable_submit__hosted_file_obj ||
$ae_sess.files.status__file_list != 'ready'} $ae_sess.files.status__file_list != 'ready'}
> >
{#await ae_promises.upload__hosted_file_obj} {#await ae_promises.upload__hosted_file_obj}
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>
<span class=""> <span class="">
Uploading Uploading
{#if $ae_sess.api_upload_kv[task_id]} {#if $ae_sess.api_upload_kv[task_id]}
{$ae_sess.api_upload_kv[task_id].percent_completed}% {$ae_sess.api_upload_kv[task_id].percent_completed}%
{/if} {/if}
</span> </span>
{:then} {:then}
<span class="fas fa-upload m-1"></span> <span class="fas fa-upload m-1"></span>
<span class="text-sm"> Upload? </span> <span class="text-sm"> Upload? </span>
<!-- <span class="fas fa-save m-1"></span> --> <!-- <span class="fas fa-save m-1"></span> -->
<span class="grow font-bold"> <span class="grow font-bold">
{#if $ae_sess.files.processed_file_list?.length > 0} {#if $ae_sess.files.processed_file_list?.length > 0}
<!-- {#each $ae_sess.files.processed_file_list as file_obj, index} <!-- {#each $ae_sess.files.processed_file_list as file_obj, index}
<span class="text-xs"> <span class="text-xs">
{file_obj.filename} {file_obj.filename}
</span> </span>
{/each} --> {/each} -->
{$ae_sess.files.processed_file_list.length == 1 {$ae_sess.files.processed_file_list.length == 1
? `${$ae_sess.files.processed_file_list.length} file` ? `${$ae_sess.files.processed_file_list.length} file`
: `${$ae_sess.files.processed_file_list.length} files`} : `${$ae_sess.files.processed_file_list.length} files`}
{:else} {:else}
<span class="text-xs"> No files selected </span> <span class="text-xs"> No files selected </span>
{/if} {/if}
<!-- Files --> <!-- Files -->
</span> </span>
{/await} {/await}
</button> </button>
</form> </form>
<hr /> <hr />
{#await ae_promises.upload__hosted_file_obj} {#await ae_promises.upload__hosted_file_obj}
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>
<p class="highlight">Converting... This may take a few minutes.</p> <p class="highlight">Converting... This may take a few minutes.</p>
{:then} {:then}
{#if ae_promises.upload__hosted_file_obj} {#if ae_promises.upload__hosted_file_obj}
<a <a
href={download_clip_src} href={download_clip_src}
download={download_clip_filename} download={download_clip_filename}
class="ae_btn btn_lg btn_primary"><span class="fas fa-download"></span> Ready to Download</a class="ae_btn btn_lg btn_primary"
> ><span class="fas fa-download"></span> Ready to Download</a
{:else} >
<p>Fill out the form and select the video file to clip.</p> {:else}
{/if} <p>Fill out the form and select the video file to clip.</p>
{/await} {/if}
{/await}
</div> </div>

View File

@@ -1,153 +1,156 @@
<script lang="ts"> <script lang="ts">
// *** Import Svelte specific // *** Import Svelte specific
// Eventually this should use Lucide icons instead of FontAwesome // Eventually this should use Lucide icons instead of FontAwesome
// import { // import {
// ArrowDown01, ArrowDown10, ArrowDownUp, // ArrowDown01, ArrowDown10, ArrowDownUp,
// BookHeart, BriefcaseBusiness, // BookHeart, BriefcaseBusiness,
// CalendarClock, CalendarOff, Clock, CodeXml, Copy, // CalendarClock, CalendarOff, Clock, CodeXml, Copy,
// Eye, EyeOff, // Eye, EyeOff,
// Flag, FlagOff, FileX, Fingerprint, // Flag, FlagOff, FileX, Fingerprint,
// Globe, Group, // Globe, Group,
// Hash, History, // Hash, History,
// LockKeyhole, LockKeyholeOpen, // LockKeyhole, LockKeyholeOpen,
// MessageSquareWarning, Menu, Minus, // MessageSquareWarning, Menu, Minus,
// NotebookPen, NotebookText, NotepadTextDashed, // NotebookPen, NotebookText, NotepadTextDashed,
// Pencil, PenLine, Plus, // Pencil, PenLine, Plus,
// RemoveFormatting, // RemoveFormatting,
// Search, Settings, // Search, Settings,
// Shapes, Share2, ShieldCheck, ShieldMinus, Siren, Skull, // Shapes, Share2, ShieldCheck, ShieldMinus, Siren, Skull,
// SquareLibrary, // SquareLibrary,
// Tags, Trash2, TypeOutline, // Tags, Trash2, TypeOutline,
// X // X
// } from '@lucide/svelte'; // } from '@lucide/svelte';
// *** Import Aether specific variables and functions // *** Import Aether specific variables and functions
import type { key_val } from '$lib/stores/ae_stores'; import type { key_val } from '$lib/stores/ae_stores';
import { ae_util } from '$lib/ae_utils/ae_utils'; import { ae_util } from '$lib/ae_utils/ae_utils';
import { api } from '$lib/api/api'; import { api } from '$lib/api/api';
import { import {
ae_snip, ae_snip,
ae_loc, ae_loc,
ae_sess, ae_sess,
ae_api, ae_api,
ae_trig, ae_trig,
slct, slct,
slct_trigger slct_trigger
} from '$lib/stores/ae_stores'; } from '$lib/stores/ae_stores';
interface Props { interface Props {
log_lvl?: number; log_lvl?: number;
hosted_file_id: null | string; hosted_file_id: null | string;
hosted_file_obj: null | key_val; hosted_file_obj: null | key_val;
filename?: null | string; filename?: null | string;
max_length?: number; max_length?: number;
auto_download?: boolean; auto_download?: boolean;
linked_to_type?: null | string; linked_to_type?: null | string;
linked_to_id?: null | string; linked_to_id?: null | string;
download_complete?: null | boolean; download_complete?: null | boolean;
download_percent?: number; download_percent?: number;
download_status_msg?: string; download_status_msg?: string;
classes?: string; classes?: string;
} }
let { let {
log_lvl = 0, log_lvl = 0,
hosted_file_id, hosted_file_id,
hosted_file_obj, hosted_file_obj,
filename = $bindable(null), filename = $bindable(null),
max_length = $bindable(30), max_length = $bindable(30),
auto_download = true, auto_download = true,
linked_to_type = $bindable(null), linked_to_type = $bindable(null),
linked_to_id = $bindable(null), linked_to_id = $bindable(null),
download_complete = $bindable(), download_complete = $bindable(),
download_percent = $bindable(), download_percent = $bindable(),
download_status_msg = $bindable('Not started'), download_status_msg = $bindable('Not started'),
classes = 'btn btn-sm lg:btn-md preset-tonal-tertiary border border-tertiary-500 hover:preset-filled-tertiary-500 min-w-48' classes = 'btn btn-sm lg:btn-md preset-tonal-tertiary border border-tertiary-500 hover:preset-filled-tertiary-500 min-w-48'
}: Props = $props(); }: Props = $props();
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`ae_comp__hosted_files_download_button.svelte hosted_file_id=${hosted_file_id}`, `ae_comp__hosted_files_download_button.svelte hosted_file_id=${hosted_file_id}`,
hosted_file_obj hosted_file_obj
); );
} }
let ae_promises: key_val = $state({}); let ae_promises: key_val = $state({});
$effect(() => { $effect(() => {
if ($ae_sess?.api_download_kv[hosted_file_obj?.hosted_file_id_random]?.percent_completed) { if ($ae_sess?.api_download_kv[hosted_file_obj?.hosted_file_id_random]?.percent_completed) {
download_percent = download_percent =
$ae_sess.api_download_kv[hosted_file_obj?.hosted_file_id_random].percent_completed; $ae_sess.api_download_kv[hosted_file_obj?.hosted_file_id_random].percent_completed;
} }
}); });
</script> </script>
{#if hosted_file_id && hosted_file_obj} {#if hosted_file_id && hosted_file_obj}
<button <button
type="button" type="button"
disabled={!$ae_loc.trusted_access} disabled={!$ae_loc.trusted_access}
class={classes ?? 'btn'} class={classes ?? 'btn'}
onclick={() => { onclick={() => {
download_complete = false; download_complete = false;
download_status_msg = 'Downloading...'; download_status_msg = 'Downloading...';
ae_promises[hosted_file_obj.hosted_file_id_random] = api ae_promises[hosted_file_obj.hosted_file_id_random] = api
.download_hosted_file({ .download_hosted_file({
api_cfg: $ae_api, api_cfg: $ae_api,
hosted_file_id: hosted_file_obj.hosted_file_id_random, hosted_file_id: hosted_file_obj.hosted_file_id_random,
return_file: true, return_file: true,
filename: filename ?? hosted_file_obj.filename, filename: filename ?? hosted_file_obj.filename,
auto_download: auto_download, auto_download: auto_download,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then((result) => { .then((result) => {
if (result === null) { if (result === null) {
console.log('File not found (404)'); console.log('File not found (404)');
download_complete = null; download_complete = null;
download_status_msg = 'File not found'; download_status_msg = 'File not found';
} else if (result === false) { } else if (result === false) {
console.log('Possible error with API server (check network and server status)'); console.log(
download_complete = false; 'Possible error with API server (check network and server status)'
download_status_msg = 'Failed to download'; );
} else { download_complete = false;
// console.log('File found and downloaded'); download_status_msg = 'Failed to download';
download_complete = true; } else {
download_status_msg = 'File downloaded'; // console.log('File found and downloaded');
} download_complete = true;
return result; download_status_msg = 'File downloaded';
}); }
}} return result;
title={`Download this file:\n${filename ?? hosted_file_obj?.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}...\nHosted ID: ${hosted_file_obj?.hosted_file_id_random}\n Linked to: ${linked_to_type} ID: ${linked_to_id}`} });
> }}
{#await ae_promises[hosted_file_obj.hosted_file_id_random]} title={`Download this file:\n${filename ?? hosted_file_obj?.filename}\n[API] SHA256: ${hosted_file_obj?.hash_sha256?.slice(0, 10)}...\nHosted ID: ${hosted_file_obj?.hosted_file_id_random}\n Linked to: ${linked_to_type} ID: ${linked_to_id}`}
<span class="fas fa-spinner fa-spin mx-1"></span> >
<span class=""> {#await ae_promises[hosted_file_obj.hosted_file_id_random]}
Downloading <span class="fas fa-spinner fa-spin mx-1"></span>
{#if $ae_sess.api_download_kv[hosted_file_obj.hosted_file_id_random]} <span class="">
{$ae_sess.api_download_kv[hosted_file_obj.hosted_file_id_random].percent_completed}% Downloading
{/if} {#if $ae_sess.api_download_kv[hosted_file_obj.hosted_file_id_random]}
: {$ae_sess.api_download_kv[hosted_file_obj.hosted_file_id_random]
</span> .percent_completed}%
{:then} {/if}
<span class="fas fa-{ae_util.file_extension_icon(hosted_file_obj?.extension)}"></span> :
{/await} </span>
{:then}
<span class="fas fa-{ae_util.file_extension_icon(hosted_file_obj?.extension)}"></span>
{/await}
{#if download_complete === null} {#if download_complete === null}
<span class="text-red-800 dark:text-red-200">File not found</span> <span class="text-red-800 dark:text-red-200">File not found</span>
{:else if download_complete === false} {:else if download_complete === false}
<span class="text-red-800 dark:text-red-200">Failed to download!</span> <span class="text-red-800 dark:text-red-200">Failed to download!</span>
{/if} {/if}
<span class="grow"> <span class="grow">
{ae_util.shorten_filename({ {ae_util.shorten_filename({
filename: filename ?? hosted_file_obj?.filename, filename: filename ?? hosted_file_obj?.filename,
max_length: max_length max_length: max_length
})} })}
</span> </span>
</button> </button>
{:else} {:else}
<button type="button" disabled class={classes ?? 'btn'} title="No file selected"> <button type="button" disabled class={classes ?? 'btn'} title="No file selected">
<span class="fas fa-{ae_util.file_extension_icon(hosted_file_obj?.extension)}"></span> <span class="fas fa-{ae_util.file_extension_icon(hosted_file_obj?.extension)}"></span>
<span class="grow"> No file info </span> <span class="grow"> No file info </span>
</button> </button>
{/if} {/if}

View File

@@ -1,281 +1,281 @@
<script lang="ts"> <script lang="ts">
export let log_lvl: number = 0; export let log_lvl: number = 0;
// Imports // Imports
// Import components and elements // Import components and elements
import Element_input_files_tbl from '$lib/elements/element_input_files_tbl.svelte'; import Element_input_files_tbl from '$lib/elements/element_input_files_tbl.svelte';
// Import storage, functions, and libraries // Import storage, functions, and libraries
import type { key_val } from '$lib/stores/ae_stores'; import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api'; import { api } from '$lib/api/api';
import { import {
ae_snip, ae_snip,
ae_loc, ae_loc,
ae_sess, ae_sess,
ae_api, ae_api,
ae_trig, ae_trig,
slct, slct,
slct_trigger slct_trigger
} from '$lib/stores/ae_stores'; } from '$lib/stores/ae_stores';
// Exports // Exports
// Expecting these for link_to_type: 'event', 'event_location', 'archive_content', etc // Expecting these for link_to_type: 'event', 'event_location', 'archive_content', etc
export let link_to_type: string; export let link_to_type: string;
export let link_to_id: string; export let link_to_id: string;
export let input_name = 'file_list'; export let input_name = 'file_list';
export let multiple: boolean = true; export let multiple: boolean = true;
export let required: boolean = true; export let required: boolean = true;
export let accept: string = export let accept: string =
'audio/*, image/*, video/*, .bak, .cfg, .css, .csv, .doc, .docx, .gz, .htm, .html, .ini, .iso, .j2, .json, .key, .keynote, .md, .pdf, .ppt, .pptx, .rar, .rtf, .sql, .svelte, ttf, .txt, .xls, .xlsx, .xz, .zip, .bin, .dmg, .exe, .js, .msi, .php, .py, .sh'; 'audio/*, image/*, video/*, .bak, .cfg, .css, .csv, .doc, .docx, .gz, .htm, .html, .ini, .iso, .j2, .json, .key, .keynote, .md, .pdf, .ppt, .pptx, .rar, .rtf, .sql, .svelte, ttf, .txt, .xls, .xlsx, .xz, .zip, .bin, .dmg, .exe, .js, .msi, .php, .py, .sh';
export let class_li_default: string = export let class_li_default: string =
'flex flex-col gap-1 items-center justify-center w-full max-w-2xl mx-auto my-1'; 'flex flex-col gap-1 items-center justify-center w-full max-w-2xl mx-auto my-1';
export let class_li: string = ''; export let class_li: string = '';
export let input_class_li: string[] = ['file_drop_area']; export let input_class_li: string[] = ['file_drop_area'];
export let table_class_li: string[] = ['table', 'table-sm', 'table-striped', '', 'text-sm']; export let table_class_li: string[] = ['table', 'table-sm', 'table-striped', '', 'text-sm'];
export let upload_complete: boolean = false; export let upload_complete: boolean = false;
export let submit_status: null | string = null; export let submit_status: null | string = null;
export let hosted_file_id_li: string[] = []; export let hosted_file_id_li: string[] = [];
export let hosted_file_obj_li: any[] = []; export let hosted_file_obj_li: any[] = [];
export let hosted_file_obj_kv: key_val = {}; export let hosted_file_obj_kv: key_val = {};
// Local Variables // Local Variables
let task_id = link_to_id; let task_id = link_to_id;
let input_file_list: any = null; let input_file_list: any = null;
let ae_promises: key_val = {}; // Promise<any>; let ae_promises: key_val = {}; // Promise<any>;
let ae_triggers: key_val = {}; let ae_triggers: key_val = {};
let input_element_id = 'ae_comp__hosted_files_upload__input'; let input_element_id = 'ae_comp__hosted_files_upload__input';
// *** Functions and Logic // *** Functions and Logic
async function handle_submit_form_files(event: SubmitEvent) { async function handle_submit_form_files(event: SubmitEvent) {
console.log('*** handle_submit_form() ***'); console.log('*** handle_submit_form() ***');
if (!event) { if (!event) {
return; return;
} }
$ae_sess.files.disable_submit__hosted_file_obj = true; $ae_sess.files.disable_submit__hosted_file_obj = true;
$ae_sess.files.submit_status = 'saving'; $ae_sess.files.submit_status = 'saving';
submit_status = 'saving'; submit_status = 'saving';
upload_complete = false; upload_complete = false;
hosted_file_id_li = []; hosted_file_id_li = [];
hosted_file_obj_li = []; hosted_file_obj_li = [];
hosted_file_obj_kv = {}; hosted_file_obj_kv = {};
let hosted_file_results; let hosted_file_results;
const target = event.target as HTMLFormElement; const target = event.target as HTMLFormElement;
if ( if (
target && target &&
target[input_element_id] && target[input_element_id] &&
(target[input_element_id] as HTMLInputElement)?.files && (target[input_element_id] as HTMLInputElement)?.files &&
(target[input_element_id] as HTMLInputElement).files.length > 0 (target[input_element_id] as HTMLInputElement).files.length > 0
) { ) {
task_id = link_to_id; // Ideally this should be the file hash, but we may be uploading multiple files at once. This should be done with a loop instead? task_id = link_to_id; // Ideally this should be the file hash, but we may be uploading multiple files at once. This should be done with a loop instead?
// Loop through each file and upload them individually in event.target[input_element_id].files // Loop through each file and upload them individually in event.target[input_element_id].files
// The task_id should be the file hash. // The task_id should be the file hash.
// processed_file_list[i] has the file hash_sha256, hash_sha256_match, warnings, uploaded, uploaded_bytes, filename, and file_size_bytes. // processed_file_list[i] has the file hash_sha256, hash_sha256_match, warnings, uploaded, uploaded_bytes, filename, and file_size_bytes.
for (let i = 0; i < event.target[input_element_id].files.length; i++) { for (let i = 0; i < event.target[input_element_id].files.length; i++) {
let tmp_file = event.target[input_element_id].files[i]; let tmp_file = event.target[input_element_id].files[i];
task_id = $ae_sess.files.processed_file_list[i].hash_sha256; task_id = $ae_sess.files.processed_file_list[i].hash_sha256;
// hosted_file_results = await handle_input_upload_files([tmp_file], task_id); // hosted_file_results = await handle_input_upload_files([tmp_file], task_id);
hosted_file_results = await handle_input_upload_files({ hosted_file_results = await handle_input_upload_files({
input_upload_files: [tmp_file], input_upload_files: [tmp_file],
task_id: task_id task_id: task_id
}); });
if (hosted_file_results) { if (hosted_file_results) {
console.log(`hosted_file_results:`, hosted_file_results); console.log(`hosted_file_results:`, hosted_file_results);
} else { } else {
console.log(`hosted_file_results:`, hosted_file_results); console.log(`hosted_file_results:`, hosted_file_results);
} }
} }
// hosted_file_results = await handle_input_upload_files(event.target[input_element_id].files, task_id); // hosted_file_results = await handle_input_upload_files(event.target[input_element_id].files, task_id);
$ae_sess.files.processed_file_list = []; $ae_sess.files.processed_file_list = [];
$ae_sess = $ae_sess; // Is this needed? 2025-03-17 $ae_sess = $ae_sess; // Is this needed? 2025-03-17
event.target.reset(); event.target.reset();
// await tick(); // await tick();
if (log_lvl) { if (log_lvl) {
console.log(`hosted_file_id_li: ${hosted_file_id_li}`, hosted_file_id_li); console.log(`hosted_file_id_li: ${hosted_file_id_li}`, hosted_file_id_li);
} else if (log_lvl > 1) { } else if (log_lvl > 1) {
console.log('hosted_file_results:', hosted_file_results); console.log('hosted_file_results:', hosted_file_results);
} }
} }
$ae_sess.files.disable_submit__hosted_file_obj = false; $ae_sess.files.disable_submit__hosted_file_obj = false;
$ae_sess.files.submit_status = 'saved'; $ae_sess.files.submit_status = 'saved';
submit_status = 'saved'; submit_status = 'saved';
upload_complete = true; upload_complete = true;
} }
async function handle_input_upload_files({ async function handle_input_upload_files({
input_upload_files, input_upload_files,
task_id task_id
}: { }: {
input_upload_files: any[]; input_upload_files: any[];
task_id: string; task_id: string;
}) { }) {
console.log('*** handle_input_upload_files() ***'); console.log('*** handle_input_upload_files() ***');
const form_data = new FormData(); const form_data = new FormData();
form_data.append('account_id', $ae_loc.account_id); form_data.append('account_id', $ae_loc.account_id);
form_data.append('link_to_type', link_to_type); form_data.append('link_to_type', link_to_type);
form_data.append('link_to_id', link_to_id); form_data.append('link_to_id', link_to_id);
for (let i = 0; i < input_upload_files.length; i++) { for (let i = 0; i < input_upload_files.length; i++) {
form_data.append(`file_list`, input_upload_files[i]); form_data.append(`file_list`, input_upload_files[i]);
} }
// hash_sha256, uploaded, uploaded_bytes // hash_sha256, uploaded, uploaded_bytes
// $ae_sess.files.processed_file_list[i] = { // $ae_sess.files.processed_file_list[i] = {
// ...$ae_sess.files.processed_file_list[i], // ...$ae_sess.files.processed_file_list[i],
// uploaded: $ae_sess.api_upload_kv[link_to_id].percent_completed, // uploaded: $ae_sess.api_upload_kv[link_to_id].percent_completed,
// uploaded_bytes: $ae_sess.api_upload_kv[link_to_id].uploaded_bytes, // uploaded_bytes: $ae_sess.api_upload_kv[link_to_id].uploaded_bytes,
// }; // };
let params = null; let params = null;
let endpoint = '/hosted_file/upload_files'; let endpoint = '/hosted_file/upload_files';
console.log(form_data); console.log(form_data);
params = null; params = null;
// Uncomment and the post_promise is not seen by the "await" below // Uncomment and the post_promise is not seen by the "await" below
// post_promise = await api.post_object({api_cfg: $cfg.api, endpoint: endpoint, params: params, data:form_data}); // post_promise = await api.post_object({api_cfg: $cfg.api, endpoint: endpoint, params: params, data:form_data});
// Uncomment so that the post_promise is not seen by the "await" below // Uncomment so that the post_promise is not seen by the "await" below
ae_promises.upload__hosted_file_obj = api ae_promises.upload__hosted_file_obj = api
.post_object({ .post_object({
api_cfg: $ae_api, api_cfg: $ae_api,
endpoint: endpoint, endpoint: endpoint,
// params: params, // params: params,
form_data: form_data, form_data: form_data,
task_id: task_id, task_id: task_id,
log_lvl: log_lvl log_lvl: log_lvl
// retry_count: 1, // retry_count: 1,
}) })
.then(async function (result) { .then(async function (result) {
// WARNING!!!! ONLY ONE FILE IS EXPECTED TO BE UPLOADED AT A TIME!!! // WARNING!!!! ONLY ONE FILE IS EXPECTED TO BE UPLOADED AT A TIME!!!
// NOTE: The /hosted_file/upload_files endpoint will always return a list of successful files uploaded. In this case we are only uploading one file and expecting a list of one item. // NOTE: The /hosted_file/upload_files endpoint will always return a list of successful files uploaded. In this case we are only uploading one file and expecting a list of one item.
let x = 0; let x = 0;
console.log(result[x]); console.log(result[x]);
let hosted_file_obj = result[x]; let hosted_file_obj = result[x];
let hosted_file_id = hosted_file_obj.hosted_file_id_random; let hosted_file_id = hosted_file_obj.hosted_file_id_random;
hosted_file_id_li.push(hosted_file_id); hosted_file_id_li.push(hosted_file_id);
hosted_file_obj_li.push(hosted_file_obj); hosted_file_obj_li.push(hosted_file_obj);
let hosted_file_data: key_val = {}; let hosted_file_data: key_val = {};
hosted_file_data['id'] = hosted_file_id; hosted_file_data['id'] = hosted_file_id;
hosted_file_data['hosted_file_id'] = hosted_file_id; hosted_file_data['hosted_file_id'] = hosted_file_id;
hosted_file_data['hosted_file_id_random'] = hosted_file_id; hosted_file_data['hosted_file_id_random'] = hosted_file_id;
hosted_file_data['for_type'] = link_to_type; hosted_file_data['for_type'] = link_to_type;
hosted_file_data['for_id'] = link_to_id; hosted_file_data['for_id'] = link_to_id;
hosted_file_data['for_id_random'] = link_to_id; hosted_file_data['for_id_random'] = link_to_id;
hosted_file_data['hash_sha256'] = hosted_file_obj.hash_sha256; hosted_file_data['hash_sha256'] = hosted_file_obj.hash_sha256;
hosted_file_data['filename'] = hosted_file_obj.filename; hosted_file_data['filename'] = hosted_file_obj.filename;
hosted_file_data['extension'] = hosted_file_obj.extension; hosted_file_data['extension'] = hosted_file_obj.extension;
hosted_file_data['content_type'] = hosted_file_obj.content_type; hosted_file_data['content_type'] = hosted_file_obj.content_type;
hosted_file_data['size'] = hosted_file_obj.size; hosted_file_data['size'] = hosted_file_obj.size;
hosted_file_data['enable'] = true; hosted_file_data['enable'] = true;
hosted_file_data['created_on'] = hosted_file_obj.created_on; hosted_file_data['created_on'] = hosted_file_obj.created_on;
hosted_file_data['updated_on'] = hosted_file_obj.updated_on; hosted_file_data['updated_on'] = hosted_file_obj.updated_on;
console.log(hosted_file_data); console.log(hosted_file_data);
hosted_file_obj_kv[hosted_file_id] = hosted_file_data; hosted_file_obj_kv[hosted_file_id] = hosted_file_data;
return hosted_file_data; return hosted_file_data;
// $ae_sess.files.new_upload_list[i].uploaded_bytes = 10; // fake 10 bytes at least... // $ae_sess.files.new_upload_list[i].uploaded_bytes = 10; // fake 10 bytes at least...
// let event_file_id = await events_func.create_hosted_file_obj_from_hosted_file_async({ // let event_file_id = await events_func.create_hosted_file_obj_from_hosted_file_async({
// api_cfg: $ae_api, // api_cfg: $ae_api,
// hosted_file_id: hosted_file_id, // hosted_file_id: hosted_file_id,
// data: event_file_data, // data: event_file_data,
// log_lvl: log_lvl // log_lvl: log_lvl
// }) // })
// .then(function (create_result) { // .then(function (create_result) {
// console.log(create_result); // NOTE: This should be the event_file_id string // console.log(create_result); // NOTE: This should be the event_file_id string
// // let event_file_id = create_result; // // let event_file_id = create_result;
// return create_result; // return create_result;
// }); // });
// return event_file_id; // return event_file_id;
}) })
.then(function (hosted_file_data) { .then(function (hosted_file_data) {
return hosted_file_data; return hosted_file_data;
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('Something went wrong.'); console.log('Something went wrong.');
console.log(error); console.log(error);
return false; return false;
}) })
.finally(function () { .finally(function () {
$slct_trigger = 'load__hosted_file_obj_li'; $slct_trigger = 'load__hosted_file_obj_li';
}); });
console.log(ae_promises.upload__hosted_file_obj); console.log(ae_promises.upload__hosted_file_obj);
let hosted_file_result = ae_promises.upload__hosted_file_obj; let hosted_file_result = ae_promises.upload__hosted_file_obj;
return hosted_file_result; return hosted_file_result;
} }
</script> </script>
<!-- class:hidden={!$ae_loc.trusted_access} --> <!-- class:hidden={!$ae_loc.trusted_access} -->
<form on:submit|preventDefault={handle_submit_form_files} class="{class_li_default} {class_li}"> <form on:submit|preventDefault={handle_submit_form_files} class="{class_li_default} {class_li}">
{#await ae_promises.upload__hosted_file_obj} {#await ae_promises.upload__hosted_file_obj}
<div class="text-lg flex flex-row gap-1 items-center justify-center"> <div class="text-lg flex flex-row gap-1 items-center justify-center">
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>
<span class=""> <span class="">
Uploading Uploading
{#if $ae_sess.api_upload_kv[task_id]} {#if $ae_sess.api_upload_kv[task_id]}
{$ae_sess.api_upload_kv[task_id].percent_completed}% {$ae_sess.api_upload_kv[task_id].percent_completed}%
{/if} {/if}
</span> </span>
</div> </div>
{/await} {/await}
<label <label
for="ae_comp__hosted_files_upload__input" for="ae_comp__hosted_files_upload__input"
class="svelte_input_file_label text-center" class="svelte_input_file_label text-center"
class:hidden={$ae_sess.files.disable_submit__hosted_file_obj} class:hidden={$ae_sess.files.disable_submit__hosted_file_obj}
> >
<slot name="label"> <slot name="label">
<div> <div>
<span class="fas fa-upload"></span> <span class="fas fa-upload"></span>
<!-- Select files to upload --> <!-- Select files to upload -->
<!-- <span class="fas fa-file-archive"></span> --> <!-- <span class="fas fa-file-archive"></span> -->
<strong class="bg-blue-300 p-1">Upload files</strong> <strong class="bg-blue-300 p-1">Upload files</strong>
<!-- (drag and drop) --> <!-- (drag and drop) -->
</div> </div>
<span class="text-sm text-gray-600 dark:text-gray-400 italic"> <span class="text-sm text-gray-600 dark:text-gray-400 italic">
<strong>Presentation related files only</strong><br /> <strong>Presentation related files only</strong><br />
(PowerPoint, Keynote, PDF, mp4, Word Doc, Excel, txt, etc) (PowerPoint, Keynote, PDF, mp4, Word Doc, Excel, txt, etc)
</span> </span>
</slot> </slot>
</label> </label>
<input <input
id={input_element_id} id={input_element_id}
type="file" type="file"
bind:files={input_file_list} bind:files={input_file_list}
{multiple} {multiple}
{required} {required}
{accept} {accept}
name={input_name} name={input_name}
class=" class="
svelte_input_file_element svelte_input_file_element
file-dropzone-input file-dropzone-input
px-1 px-1
@@ -286,49 +286,49 @@
g-gray-50 dark:text-gray-400 focus:outline-hidden dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 g-gray-50 dark:text-gray-400 focus:outline-hidden dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400
{input_class_li.join(' ')} {input_class_li.join(' ')}
" "
class:hidden={$ae_sess.files.disable_submit__hosted_file_obj} class:hidden={$ae_sess.files.disable_submit__hosted_file_obj}
/> />
<Element_input_files_tbl <Element_input_files_tbl
bind:input_file_list bind:input_file_list
bind:file_list_status={$ae_sess.files.status__file_list} bind:file_list_status={$ae_sess.files.status__file_list}
bind:processed_file_list={$ae_sess.files.processed_file_list} bind:processed_file_list={$ae_sess.files.processed_file_list}
{table_class_li} {table_class_li}
/> />
<button <button
type="submit" type="submit"
class="btn btn-lg btn-primary preset-tonal-primary border border-primary-500 hover:preset-tonal-success border border-success-500 w-54" class="btn btn-lg btn-primary preset-tonal-primary border border-primary-500 hover:preset-tonal-success border border-success-500 w-54"
disabled={$ae_sess.files.disable_submit__hosted_file_obj || disabled={$ae_sess.files.disable_submit__hosted_file_obj ||
$ae_sess.files.status__file_list != 'ready'} $ae_sess.files.status__file_list != 'ready'}
> >
{#await ae_promises.upload__hosted_file_obj} {#await ae_promises.upload__hosted_file_obj}
<span class="fas fa-spinner fa-spin m-1"></span> <span class="fas fa-spinner fa-spin m-1"></span>
<span class=""> <span class="">
Uploading Uploading
{#if $ae_sess.api_upload_kv[task_id]} {#if $ae_sess.api_upload_kv[task_id]}
{$ae_sess.api_upload_kv[task_id].percent_completed}% {$ae_sess.api_upload_kv[task_id].percent_completed}%
{/if} {/if}
</span> </span>
{:then} {:then}
<span class="fas fa-upload m-1"></span> <span class="fas fa-upload m-1"></span>
<span class="text-sm"> Upload? </span> <span class="text-sm"> Upload? </span>
<!-- <span class="fas fa-save m-1"></span> --> <!-- <span class="fas fa-save m-1"></span> -->
<span class="grow font-bold"> <span class="grow font-bold">
{#if $ae_sess.files.processed_file_list?.length > 0} {#if $ae_sess.files.processed_file_list?.length > 0}
<!-- {#each $ae_sess.files.processed_file_list as file_obj, index} <!-- {#each $ae_sess.files.processed_file_list as file_obj, index}
<span class="text-xs"> <span class="text-xs">
{file_obj.filename} {file_obj.filename}
</span> </span>
{/each} --> {/each} -->
{$ae_sess.files.processed_file_list.length == 1 {$ae_sess.files.processed_file_list.length == 1
? `${$ae_sess.files.processed_file_list.length} file` ? `${$ae_sess.files.processed_file_list.length} file`
: `${$ae_sess.files.processed_file_list.length} files`} : `${$ae_sess.files.processed_file_list.length} files`}
{:else} {:else}
<span class="text-xs"> No files selected </span> <span class="text-xs"> No files selected </span>
{/if} {/if}
<!-- Files --> <!-- Files -->
</span> </span>
{/await} {/await}
</button> </button>
</form> </form>

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,23 @@
export interface Account { export interface Account {
id: string; id: string;
// id_random: string; // id_random: string;
account_id: string; account_id: string;
account_id_random: string; account_id_random: string;
code?: string; code?: string;
name: string; name: string;
short_name?: null | string; short_name?: null | string;
description?: null | string; description?: null | string;
enable: null | boolean; enable: null | boolean;
enable_from?: null | Date; enable_from?: null | Date;
enable_to?: null | Date; enable_to?: null | Date;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
} }

View File

@@ -5,360 +5,368 @@ const ae_promises: key_val = {};
// Updated 2024-10-23 // Updated 2024-10-23
export async function load_ae_obj_id__activity_log({ export async function load_ae_obj_id__activity_log({
api_cfg, api_cfg,
activity_log_id, activity_log_id,
// inc_other_li = false, // inc_other_li = false,
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
activity_log_id: string; activity_log_id: string;
// inc_other_li?: boolean, // inc_other_li?: boolean,
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
console.log(`*** load_ae_obj_id__activity_log() *** activity_log_id=${activity_log_id}`); console.log(`*** load_ae_obj_id__activity_log() *** activity_log_id=${activity_log_id}`);
const params = {}; const params = {};
ae_promises.load__activity_log_obj = await api ae_promises.load__activity_log_obj = await api
.get_ae_obj_id_crud({ .get_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'activity_log', obj_type: 'activity_log',
obj_id: activity_log_id, // NOTE: This is the FQDN, not normally the ID. obj_id: activity_log_id, // NOTE: This is the FQDN, not normally the ID.
use_alt_table: true, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config. use_alt_table: true, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config.
use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value in the API config. use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value in the API config.
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (activity_log_obj_get_result) { .then(function (activity_log_obj_get_result) {
if (activity_log_obj_get_result) { if (activity_log_obj_get_result) {
// if (try_cache) { // if (try_cache) {
// // This is expecting a list // // This is expecting a list
// db_save_ae_obj_li__activity_log({ // db_save_ae_obj_li__activity_log({
// obj_type: 'activity_log', // obj_type: 'activity_log',
// obj_li: [activity_log_obj_get_result] // obj_li: [activity_log_obj_get_result]
// }); // });
// } // }
return activity_log_obj_get_result; return activity_log_obj_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__activity_log_obj:', ae_promises.load__activity_log_obj); console.log('ae_promises.load__activity_log_obj:', ae_promises.load__activity_log_obj);
} }
return ae_promises.load__activity_log_obj; return ae_promises.load__activity_log_obj;
} }
// Updated 2024-10-23 // Updated 2024-10-23
export async function load_ae_obj_li__activity_log({ export async function load_ae_obj_li__activity_log({
api_cfg, api_cfg,
for_obj_type = 'account', for_obj_type = 'account',
for_obj_id, for_obj_id,
// inc_other_li = false, // inc_other_li = false,
order_by_li = { order_by_li = {
priority: 'DESC', priority: 'DESC',
sort: 'DESC', sort: 'DESC',
name: 'ASC', name: 'ASC',
updated_on: 'DESC', updated_on: 'DESC',
created_on: 'DESC' created_on: 'DESC'
}, },
params = {}, params = {},
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
for_obj_type: string; for_obj_type: string;
for_obj_id: string; for_obj_id: string;
// inc_other_li?: boolean, // inc_other_li?: boolean,
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
console.log( console.log(
`*** load_ae_obj_li__activity_log() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}` `*** load_ae_obj_li__activity_log() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}`
); );
const enabled: string = params.qry__enabled ?? 'enabled'; // all, disabled, enabled const enabled: string = params.qry__enabled ?? 'enabled'; // all, disabled, enabled
const hidden: string = params.qry__hidden ?? 'not_hidden'; // all, hidden, not_hidden const hidden: string = params.qry__hidden ?? 'not_hidden'; // all, hidden, not_hidden
const limit: number = params.qry__limit ?? 99; // 99 const limit: number = params.qry__limit ?? 99; // 99
const offset: number = params.qry__offset ?? 0; // 0 const offset: number = params.qry__offset ?? 0; // 0
const params_json: key_val = {}; const params_json: key_val = {};
// console.log('params_json:', params_json); // console.log('params_json:', params_json);
ae_promises.load__activity_log_obj_li = await api ae_promises.load__activity_log_obj_li = await api
.get_ae_obj_li_for_obj_id_crud({ .get_ae_obj_li_for_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'activity_log', obj_type: 'activity_log',
for_obj_type: for_obj_type, for_obj_type: for_obj_type,
for_obj_id: for_obj_id, for_obj_id: for_obj_id,
use_alt_table: true, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config. use_alt_table: true, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config.
use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (activity_log_obj_li_get_result) { .then(function (activity_log_obj_li_get_result) {
if (activity_log_obj_li_get_result) { if (activity_log_obj_li_get_result) {
// if (try_cache) { // if (try_cache) {
// db_save_ae_obj_li__activity_log({ // db_save_ae_obj_li__activity_log({
// obj_type: 'activity_log', // obj_type: 'activity_log',
// obj_li: activity_log_obj_li_get_result // obj_li: activity_log_obj_li_get_result
// }); // });
// } // }
return activity_log_obj_li_get_result; return activity_log_obj_li_get_result;
} else { } else {
return []; return [];
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__activity_log_obj_li:', ae_promises.load__activity_log_obj_li); console.log(
} 'ae_promises.load__activity_log_obj_li:',
ae_promises.load__activity_log_obj_li
);
}
return ae_promises.load__activity_log_obj_li; return ae_promises.load__activity_log_obj_li;
} }
// Updated 2024-10-23 // Updated 2024-10-23
export async function create_ae_obj__activity_log({ export async function create_ae_obj__activity_log({
api_cfg, api_cfg,
account_id, account_id,
data_kv, data_kv,
params = {}, params = {},
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
data_kv: key_val; data_kv: key_val;
params?: key_val; params?: key_val;
log_lvl?: number; log_lvl?: number;
}) { }) {
console.log(`*** create_ae_obj__activity_log() *** account_id=${account_id}`); console.log(`*** create_ae_obj__activity_log() *** account_id=${account_id}`);
ae_promises.create__activity_log = await api ae_promises.create__activity_log = await api
.create_ae_obj_crud({ .create_ae_obj_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'activity_log', obj_type: 'activity_log',
fields: { fields: {
account_id_random: account_id, account_id_random: account_id,
...data_kv ...data_kv
}, },
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: params, params: params,
return_obj: true, return_obj: true,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (activity_log_obj_create_result) { .then(function (activity_log_obj_create_result) {
if (activity_log_obj_create_result) { if (activity_log_obj_create_result) {
// db_save_ae_obj_li__activity_log( // db_save_ae_obj_li__activity_log(
// { // {
// obj_type: 'activity_log', // obj_type: 'activity_log',
// obj_li: [activity_log_obj_create_result] // obj_li: [activity_log_obj_create_result]
// }); // });
return activity_log_obj_create_result; return activity_log_obj_create_result;
} else { } else {
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}) })
.finally(function () {}); .finally(function () {});
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.create__activity_log:', ae_promises.create__activity_log); console.log('ae_promises.create__activity_log:', ae_promises.create__activity_log);
} }
return ae_promises.create__activity_log; return ae_promises.create__activity_log;
} }
// Updated 2024-10-23 // Updated 2024-10-23
export async function update_ae_obj__activity_log({ export async function update_ae_obj__activity_log({
api_cfg, api_cfg,
activity_log_id, activity_log_id,
data_kv, data_kv,
params = {}, params = {},
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
activity_log_id: string; activity_log_id: string;
data_kv: key_val; data_kv: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** update_ae_obj__activity_log() *** activity_log_id=${activity_log_id}`, `*** update_ae_obj__activity_log() *** activity_log_id=${activity_log_id}`,
data_kv data_kv
); );
} }
ae_promises.update__activity_log_obj = await api ae_promises.update__activity_log_obj = await api
.update_ae_obj_id_crud({ .update_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'activity_log', obj_type: 'activity_log',
obj_id: activity_log_id, obj_id: activity_log_id,
fields: data_kv, fields: data_kv,
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: params, params: params,
return_obj: true, return_obj: true,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (activity_log_obj_update_result) { .then(function (activity_log_obj_update_result) {
if (activity_log_obj_update_result) { if (activity_log_obj_update_result) {
// if (try_cache) { // if (try_cache) {
// db_save_ae_obj_li__activity_log({ // db_save_ae_obj_li__activity_log({
// obj_type: 'activity_log', obj_li: [activity_log_obj_update_result] // obj_type: 'activity_log', obj_li: [activity_log_obj_update_result]
// }); // });
// } // }
return activity_log_obj_update_result; return activity_log_obj_update_result;
} else { } else {
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}) })
.finally(function () {}); .finally(function () {});
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.update__activity_log_obj:', ae_promises.update__activity_log_obj); console.log('ae_promises.update__activity_log_obj:', ae_promises.update__activity_log_obj);
} }
return ae_promises.update__activity_log_obj; return ae_promises.update__activity_log_obj;
} }
// This new function is using CRUD v2. This should allow for more flexibility in the queries. // This new function is using CRUD v2. This should allow for more flexibility in the queries.
// Updated 2024-10-23 // Updated 2024-10-23
export async function qry__activity_log({ export async function qry__activity_log({
api_cfg, api_cfg,
activity_log_id, activity_log_id,
qry_str, qry_str,
qry_files, qry_files,
qry_start_datetime, // Example greater than: '2024-10-24' qry_start_datetime, // Example greater than: '2024-10-24'
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 50, limit = 50,
offset = 0, offset = 0,
params = {}, params = {},
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
activity_log_id: any; activity_log_id: any;
qry_str?: string; qry_str?: string;
qry_files?: null | boolean; qry_files?: null | boolean;
qry_start_datetime?: null | string; // Greater than this datetime qry_start_datetime?: null | string; // Greater than this datetime
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; // all, disabled, enabled enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; // all, disabled, enabled
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; // all, hidden, not_hidden hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; // all, hidden, not_hidden
limit?: number; limit?: number;
offset?: number; offset?: number;
params?: any; params?: any;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
console.log(`*** qry__activity_log() *** activity_log_id=${activity_log_id} qry_str=${qry_str}`); console.log(
`*** qry__activity_log() *** activity_log_id=${activity_log_id} qry_str=${qry_str}`
);
// let enabled: string = (params.qry__enabled ?? 'enabled'); // all, disabled, enabled // let enabled: string = (params.qry__enabled ?? 'enabled'); // all, disabled, enabled
// let hidden: string = (params.qry__hidden ?? 'not_hidden'); // all, hidden, not_hidden // let hidden: string = (params.qry__hidden ?? 'not_hidden'); // all, hidden, not_hidden
// let limit: number = (params.qry__limit ?? 25); // 99 // let limit: number = (params.qry__limit ?? 25); // 99
// let offset: number = (params.qry__offset ?? 0); // 0 // let offset: number = (params.qry__offset ?? 0); // 0
const params_json: key_val = {}; const params_json: key_val = {};
// if (qry_str && qry_str.length > 2) { // if (qry_str && qry_str.length > 2) {
// params_json['ft_qry'] = {}; // params_json['ft_qry'] = {};
// params_json['ft_qry']['default_qry_str'] = qry_str; // params_json['ft_qry']['default_qry_str'] = qry_str;
// } // }
params_json['qry'] = []; params_json['qry'] = [];
if (qry_files === true) { if (qry_files === true) {
const qry_param = { const qry_param = {
type: 'AND', type: 'AND',
field: 'file_count_all', field: 'file_count_all',
operator: '>', operator: '>',
value: 0 value: 0
}; };
params_json['qry'].push(qry_param); params_json['qry'].push(qry_param);
} else if (qry_files === false) { } else if (qry_files === false) {
const qry_param = { const qry_param = {
type: 'AND', type: 'AND',
field: 'file_count_all', field: 'file_count_all',
operator: 'IS', operator: 'IS',
value: null value: null
}; };
params_json['qry'].push(qry_param); params_json['qry'].push(qry_param);
} }
if (qry_start_datetime) { if (qry_start_datetime) {
const qry_param = { const qry_param = {
type: 'AND', type: 'AND',
field: 'start_datetime', field: 'start_datetime',
operator: '>', operator: '>',
value: qry_start_datetime value: qry_start_datetime
}; };
params_json['qry'].push(qry_param); params_json['qry'].push(qry_param);
} }
const order_by_li: { [key: string]: 'ASC' | 'DESC' }[] = [ const order_by_li: { [key: string]: 'ASC' | 'DESC' }[] = [
{ priority: 'DESC' }, { priority: 'DESC' },
{ sort: 'DESC' }, { sort: 'DESC' },
{ start_datetime: 'ASC' }, { start_datetime: 'ASC' },
{ name: 'ASC' }, { name: 'ASC' },
{ updated_on: 'DESC' }, { updated_on: 'DESC' },
{ created_on: 'DESC' } { created_on: 'DESC' }
]; ];
ae_promises.load__activity_log_obj_li = await api ae_promises.load__activity_log_obj_li = await api
.get_ae_obj_li_for_obj_id_crud_v2({ .get_ae_obj_li_for_obj_id_crud_v2({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'activity_log', obj_type: 'activity_log',
for_obj_type: 'account', for_obj_type: 'account',
for_obj_id: activity_log_id, for_obj_id: activity_log_id,
use_alt_tbl: true, // NOTE: We want to use the alt table for activity_log searching use_alt_tbl: true, // NOTE: We want to use the alt table for activity_log searching
use_alt_mdl: false, use_alt_mdl: false,
use_alt_exp: false, use_alt_exp: false,
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (activity_log_obj_li_get_result) { .then(function (activity_log_obj_li_get_result) {
if (activity_log_obj_li_get_result) { if (activity_log_obj_li_get_result) {
// db_save_ae_obj_li__activity_log({ // db_save_ae_obj_li__activity_log({
// obj_type: 'activity_log', // obj_type: 'activity_log',
// obj_li: activity_log_obj_li_get_result // obj_li: activity_log_obj_li_get_result
// }); // });
return activity_log_obj_li_get_result; return activity_log_obj_li_get_result;
} else { } else {
return []; return [];
} }
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__activity_log_obj_li:', ae_promises.load__activity_log_obj_li); console.log(
} 'ae_promises.load__activity_log_obj_li:',
return ae_promises.load__activity_log_obj_li; ae_promises.load__activity_log_obj_li
);
}
return ae_promises.load__activity_log_obj_li;
} }

View File

@@ -2,56 +2,56 @@ import type { key_val } from '$lib/stores/ae_stores';
// Updated 2025-01-28 // Updated 2025-01-28
export function add_url_params({ export function add_url_params({
base_url = '', base_url = '',
endpoint, endpoint,
params, params,
log_lvl = 0 log_lvl = 0
}: { }: {
base_url?: string; base_url?: string;
endpoint: string; endpoint: string;
params: key_val; params: key_val;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** add_url_params() *** base_url=${base_url} endpoint=${endpoint}`, params); console.log(`*** add_url_params() *** base_url=${base_url} endpoint=${endpoint}`, params);
} }
const url_obj = new URL(endpoint, base_url); const url_obj = new URL(endpoint, base_url);
Object.keys(params).forEach((key) => url_obj.searchParams.append(key, params[key])); Object.keys(params).forEach((key) => url_obj.searchParams.append(key, params[key]));
if (log_lvl) { if (log_lvl) {
console.log('New URL:', url_obj.toString()); console.log('New URL:', url_obj.toString());
} }
return url_obj.toString(); return url_obj.toString();
// return 'test'; // return 'test';
} }
// This is used to clean the header property names. Not underscores allowed in the header names. // This is used to clean the header property names. Not underscores allowed in the header names.
// Updated 2025-01-28 // Updated 2025-01-28
export function clean_headers({ headers, log_lvl = 0 }: { headers: any; log_lvl?: number }) { export function clean_headers({ headers, log_lvl = 0 }: { headers: any; log_lvl?: number }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** clean_headers() ***`, headers); console.log(`*** clean_headers() ***`, headers);
} }
const headers_cleaned: key_val = {}; const headers_cleaned: key_val = {};
for (const prop in headers) { for (const prop in headers) {
const prop_cleaned = prop.replaceAll('_', '-'); const prop_cleaned = prop.replaceAll('_', '-');
if (typeof headers[prop] != 'string') { if (typeof headers[prop] != 'string') {
headers[prop] = JSON.stringify(headers[prop]); headers[prop] = JSON.stringify(headers[prop]);
} }
headers_cleaned[prop_cleaned] = headers[prop]; headers_cleaned[prop_cleaned] = headers[prop];
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`${prop_cleaned}: ${headers_cleaned[prop_cleaned]}`); console.log(`${prop_cleaned}: ${headers_cleaned[prop_cleaned]}`);
} }
} }
// Object.keys(headers).forEach(key => { // Object.keys(headers).forEach(key => {
// if (headers[key]) { // if (headers[key]) {
// headers_cleaned[key] = headers[key]; // headers_cleaned[key] = headers[key];
// } // }
// }); // });
return headers_cleaned; return headers_cleaned;
} }

View File

@@ -3,32 +3,32 @@ import { api } from '$lib/api/api';
// Updated 2024-10-02 // Updated 2024-10-02
export async function check_hosted_file_obj_w_hash({ export async function check_hosted_file_obj_w_hash({
api_cfg, api_cfg,
hosted_file_hash, hosted_file_hash,
check_for_local = true, // Forces a check on the host server for the file. check_for_local = true, // Forces a check on the host server for the file.
params = {}, params = {},
return_meta = false, return_meta = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
hosted_file_hash: string; hosted_file_hash: string;
check_for_local?: boolean; check_for_local?: boolean;
params?: key_val; params?: key_val;
return_meta?: boolean; return_meta?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
console.log('*** stores_event_api.js: check_hosted_file_obj_w_hash() ***'); console.log('*** stores_event_api.js: check_hosted_file_obj_w_hash() ***');
const endpoint = `/hosted_file/hash/${hosted_file_hash}`; const endpoint = `/hosted_file/hash/${hosted_file_hash}`;
if (check_for_local) { if (check_for_local) {
params['check_for_local'] = true; params['check_for_local'] = true;
} }
const check_hosted_file_obj_w_hash_get_promise = await api.get_object({ const check_hosted_file_obj_w_hash_get_promise = await api.get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
return_meta: return_meta, return_meta: return_meta,
log_lvl: log_lvl log_lvl: log_lvl
}); });
return check_hosted_file_obj_w_hash_get_promise; return check_hosted_file_obj_w_hash_get_promise;
} }

View File

@@ -7,65 +7,65 @@ const ae_promises: key_val = {};
// Updated 2024-10-14 // Updated 2024-10-14
export async function load_ae_obj_li__country({ export async function load_ae_obj_li__country({
api_cfg, api_cfg,
// account_id, // account_id,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 299, limit = 299,
offset = 0, offset = 0,
order_by_li = { sort: 'DESC', english_short_name: 'ASC', alpha_2_code: 'ASC' }, order_by_li = { sort: 'DESC', english_short_name: 'ASC', alpha_2_code: 'ASC' },
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
// account_id: string, // account_id: string,
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_li__country() ***`); console.log(`*** load_ae_obj_li__country() ***`);
} }
const params_json: key_val = {}; const params_json: key_val = {};
// console.log('params_json:', params_json); // console.log('params_json:', params_json);
ae_promises.load__country_li = await api ae_promises.load__country_li = await api
.get_ae_obj_li_for_obj_id_crud_v2({ .get_ae_obj_li_for_obj_id_crud_v2({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'lu', obj_type: 'lu',
for_obj_type: 'country', for_obj_type: 'country',
// for_obj_id: account_id, // for_obj_id: account_id,
use_alt_tbl: false, use_alt_tbl: false,
use_alt_mdl: false, use_alt_mdl: false,
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (country_li_get_result) { .then(function (country_li_get_result) {
if (country_li_get_result) { if (country_li_get_result) {
// handle_db_save_ae_obj_li__country({obj_type: 'country', obj_li: country_li_get_result}); // handle_db_save_ae_obj_li__country({obj_type: 'country', obj_li: country_li_get_result});
return country_li_get_result; return country_li_get_result;
} else { } else {
return []; return [];
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
console.log('ae_promises.load__country_li:', ae_promises.load__country_li); console.log('ae_promises.load__country_li:', ae_promises.load__country_li);
return ae_promises.load__country_li; return ae_promises.load__country_li;
} }

View File

@@ -7,68 +7,68 @@ const ae_promises: key_val = {};
// Updated 2024-10-14 // Updated 2024-10-14
export async function load_ae_obj_li__country_subdivision({ export async function load_ae_obj_li__country_subdivision({
api_cfg, api_cfg,
// account_id, // account_id,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 399, limit = 399,
offset = 0, offset = 0,
order_by_li = { sort: 'DESC', name: 'ASC', code: 'ASC' }, order_by_li = { sort: 'DESC', name: 'ASC', code: 'ASC' },
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
// account_id: string, // account_id: string,
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_li__country_subdivision() ***`); console.log(`*** load_ae_obj_li__country_subdivision() ***`);
} }
const params_json: key_val = {}; const params_json: key_val = {};
// console.log('params_json:', params_json); // console.log('params_json:', params_json);
ae_promises.load__country_subdivision_li = await api ae_promises.load__country_subdivision_li = await api
.get_ae_obj_li_for_obj_id_crud_v2({ .get_ae_obj_li_for_obj_id_crud_v2({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'lu', obj_type: 'lu',
for_obj_type: 'country_subdivision', for_obj_type: 'country_subdivision',
// for_obj_id: account_id, // for_obj_id: account_id,
use_alt_tbl: false, use_alt_tbl: false,
use_alt_mdl: false, use_alt_mdl: false,
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (country_subdivision_li_get_result) { .then(function (country_subdivision_li_get_result) {
if (country_subdivision_li_get_result) { if (country_subdivision_li_get_result) {
// handle_db_save_ae_obj_li__country_subdivision({obj_type: 'country_subdivision', obj_li: country_subdivision_li_get_result}); // handle_db_save_ae_obj_li__country_subdivision({obj_type: 'country_subdivision', obj_li: country_subdivision_li_get_result});
return country_subdivision_li_get_result; return country_subdivision_li_get_result;
} else { } else {
return []; return [];
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
console.log( console.log(
'ae_promises.load__country_subdivision_li:', 'ae_promises.load__country_subdivision_li:',
ae_promises.load__country_subdivision_li ae_promises.load__country_subdivision_li
); );
return ae_promises.load__country_subdivision_li; return ae_promises.load__country_subdivision_li;
} }

View File

@@ -7,172 +7,172 @@ import { db_save_ae_obj_li__ae_obj } from '$lib/ae_core/core__idb_dexie';
// Define generic CRUD args // Define generic CRUD args
export interface GenericCrudArgs { export interface GenericCrudArgs {
api_cfg: any; api_cfg: any;
obj_type: string; obj_type: string;
obj_id?: string; obj_id?: string;
for_obj_type?: string; for_obj_type?: string;
for_obj_id?: string; for_obj_id?: string;
db_instance?: any; // Optional DB instance for caching db_instance?: any; // Optional DB instance for caching
db_field_li?: string[]; // Optional list of fields to save in DB db_field_li?: string[]; // Optional list of fields to save in DB
// Flags to include related core object models // Flags to include related core object models
inc_account_li?: boolean; inc_account_li?: boolean;
inc_address_li?: boolean; inc_address_li?: boolean;
inc_contact_li?: boolean; inc_contact_li?: boolean;
inc_person_li?: boolean; inc_person_li?: boolean;
inc_site_li?: boolean; inc_site_li?: boolean;
inc_site_domain_li?: boolean; inc_site_domain_li?: boolean;
inc_user_li?: boolean; inc_user_li?: boolean;
// Flags to include related other object models // Flags to include related other object models
inc_archive_li?: boolean; inc_archive_li?: boolean;
inc_archive_entry_li?: boolean; inc_archive_entry_li?: boolean;
inc_event_li?: boolean; inc_event_li?: boolean;
inc_event_session_li?: boolean; inc_event_session_li?: boolean;
inc_post_li?: boolean; inc_post_li?: boolean;
inc_post_comment_li?: boolean; inc_post_comment_li?: boolean;
inc_journal_li?: boolean; inc_journal_li?: boolean;
inc_journal_entry_li?: boolean; inc_journal_entry_li?: boolean;
inc_obj_type_li?: string[]; // Optional list of object types to include inc_obj_type_li?: string[]; // Optional list of object types to include
data_kv?: key_val; data_kv?: key_val;
enabled?: 'enabled' | 'disabled' | 'all'; enabled?: 'enabled' | 'disabled' | 'all';
hidden?: 'not_hidden' | 'hidden' | 'all'; hidden?: 'not_hidden' | 'hidden' | 'all';
limit?: number; limit?: number;
offset?: number; offset?: number;
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
} }
// Generic function: Load single object by ID // Generic function: Load single object by ID
export async function load_ae_obj_id(args: GenericCrudArgs): Promise<any> { export async function load_ae_obj_id(args: GenericCrudArgs): Promise<any> {
const { api_cfg, obj_type, obj_id, log_lvl = 0 } = args; const { api_cfg, obj_type, obj_id, log_lvl = 0 } = args;
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`); console.log(`*** load_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`);
} }
const result = await api.get_ae_obj_id_crud({ const result = await api.get_ae_obj_id_crud({
api_cfg, api_cfg,
obj_type, obj_type,
obj_id, obj_id,
params: {}, params: {},
log_lvl log_lvl
}); });
return result; return result;
} }
// Generic function: Load list of objects // Generic function: Load list of objects
export async function load_ae_obj_li(args: GenericCrudArgs): Promise<any> { export async function load_ae_obj_li(args: GenericCrudArgs): Promise<any> {
const { const {
api_cfg, api_cfg,
obj_type, obj_type,
for_obj_type = '', for_obj_type = '',
for_obj_id, for_obj_id,
inc_obj_type_li, inc_obj_type_li,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 99, limit = 99,
offset = 0, offset = 0,
order_by_li = {}, order_by_li = {},
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
} = args; } = args;
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** load_ae_obj_li() *** obj_type=${obj_type} for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}` `*** 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 params_json: key_val = {};
const result = await api.get_ae_obj_li_for_obj_id_crud_v2({ const result = await api.get_ae_obj_li_for_obj_id_crud_v2({
api_cfg, api_cfg,
obj_type, obj_type,
for_obj_type, for_obj_type,
for_obj_id, for_obj_id,
enabled, enabled,
hidden, hidden,
order_by_li, order_by_li,
limit, limit,
offset, offset,
params_json: {}, params_json: {},
params, params,
log_lvl log_lvl
}); });
return result; return result;
} }
// Generic function: Create object // Generic function: Create object
export async function create_ae_obj(args: GenericCrudArgs): Promise<any> { export async function create_ae_obj(args: GenericCrudArgs): Promise<any> {
const { api_cfg, obj_type, data_kv, log_lvl = 0 } = args; const { api_cfg, obj_type, data_kv, log_lvl = 0 } = args;
if (log_lvl) { if (log_lvl) {
console.log(`*** create_ae_obj() *** obj_type=${obj_type}`, data_kv); console.log(`*** create_ae_obj() *** obj_type=${obj_type}`, data_kv);
} }
const result = await api.create_ae_obj_crud({ const result = await api.create_ae_obj_crud({
api_cfg, api_cfg,
obj_type, obj_type,
fields: data_kv, fields: data_kv,
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: {}, params: {},
return_obj: true, return_obj: true,
log_lvl log_lvl
}); });
return result; return result;
} }
// Generic function: Update object // Generic function: Update object
export async function update_ae_obj(args: GenericCrudArgs): Promise<any> { export async function update_ae_obj(args: GenericCrudArgs): Promise<any> {
const { api_cfg, obj_type, obj_id, data_kv, log_lvl = 0 } = args; const { api_cfg, obj_type, obj_id, data_kv, log_lvl = 0 } = args;
if (log_lvl) { if (log_lvl) {
console.log(`*** update_ae_obj() *** obj_type=${obj_type} obj_id=${obj_id}`, data_kv); console.log(`*** update_ae_obj() *** obj_type=${obj_type} obj_id=${obj_id}`, data_kv);
} }
const result = await api.update_ae_obj_id_crud({ const result = await api.update_ae_obj_id_crud({
api_cfg, api_cfg,
obj_type, obj_type,
obj_id, obj_id,
fields: data_kv, fields: data_kv,
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: {}, params: {},
return_obj: true, return_obj: true,
log_lvl log_lvl
}); });
return result; return result;
} }
// Generic function: Delete object // Generic function: Delete object
export async function delete_ae_obj_id(args: GenericCrudArgs): Promise<any> { export async function delete_ae_obj_id(args: GenericCrudArgs): Promise<any> {
const { api_cfg, obj_type, obj_id, method = 'delete', log_lvl = 0 } = args; const { api_cfg, obj_type, obj_id, method = 'delete', log_lvl = 0 } = args;
if (log_lvl) { if (log_lvl) {
console.log(`*** delete_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`); console.log(`*** delete_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`);
} }
const result = await api.delete_ae_obj_id_crud({ const result = await api.delete_ae_obj_id_crud({
api_cfg, api_cfg,
obj_type, obj_type,
obj_id, obj_id,
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: {}, params: {},
method, method,
log_lvl log_lvl
}); });
return result; return result;
} }
// Additional Modules that might be needed for reloads // Additional Modules that might be needed for reloads
@@ -192,144 +192,144 @@ import { load_ae_obj_id__post_comment } from '$lib/ae_posts/ae_posts__post_comme
import { load_ae_obj_id__person } from '$lib/ae_core/core__person'; import { load_ae_obj_id__person } from '$lib/ae_core/core__person';
export async function update_ae_obj_id_crud_v2({ export async function update_ae_obj_id_crud_v2({
api_cfg, api_cfg,
object_type, object_type,
object_id, object_id,
object_reload = false, object_reload = false,
field_name, field_name,
new_field_value, new_field_value,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
object_type: string; object_type: string;
object_id: string; object_id: string;
object_reload?: boolean; object_reload?: boolean;
field_name: string; field_name: string;
new_field_value: any; new_field_value: any;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( 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=`, `*** 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 new_field_value
); );
} }
try { try {
const results = await api.update_ae_obj_id_crud({ const results = await api.update_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: object_type, obj_type: object_type,
obj_id: object_id, obj_id: object_id,
field_name: field_name, field_name: field_name,
field_value: new_field_value, field_value: new_field_value,
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (!results) { if (!results) {
console.log( console.log(
`Not Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}; Account ID: ${api_cfg.account_id}` `Not Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}; Account ID: ${api_cfg.account_id}`
); );
return false; return false;
} }
console.log(`Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}`); console.log(`Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}`);
if (object_reload) { if (object_reload) {
if (log_lvl) console.log(`Reloading the object after patching...`); if (log_lvl) console.log(`Reloading the object after patching...`);
const reload_fns: { [key: string]: (args: any) => Promise<any> } = { const reload_fns: { [key: string]: (args: any) => Promise<any> } = {
person: load_ae_obj_id__person, person: load_ae_obj_id__person,
archive: load_ae_obj_id__archive, archive: load_ae_obj_id__archive,
archive_content: load_ae_obj_id__archive_content, archive_content: load_ae_obj_id__archive_content,
journal: load_ae_obj_id__journal, journal: load_ae_obj_id__journal,
journal_entry: load_ae_obj_id__journal_entry, journal_entry: load_ae_obj_id__journal_entry,
event: load_ae_obj_id__event, event: load_ae_obj_id__event,
event_device: load_ae_obj_id__event_device, event_device: load_ae_obj_id__event_device,
event_file: load_ae_obj_id__event_file, event_file: load_ae_obj_id__event_file,
event_location: load_ae_obj_id__event_location, event_location: load_ae_obj_id__event_location,
event_presentation: load_ae_obj_id__event_presentation, event_presentation: load_ae_obj_id__event_presentation,
event_presenter: load_ae_obj_id__event_presenter, event_presenter: load_ae_obj_id__event_presenter,
event_session: load_ae_obj_id__event_session, event_session: load_ae_obj_id__event_session,
post: load_ae_obj_id__post, post: load_ae_obj_id__post,
post_comment: load_ae_obj_id__post_comment post_comment: load_ae_obj_id__post_comment
}; };
const reload_fn = reload_fns[object_type]; const reload_fn = reload_fns[object_type];
if (reload_fn) { if (reload_fn) {
const id_key = `${object_type}_id`; const id_key = `${object_type}_id`;
return await reload_fn({ api_cfg, [id_key]: object_id, log_lvl }); return await reload_fn({ api_cfg, [id_key]: object_id, log_lvl });
} }
} }
return true; return true;
} catch (error) { } catch (error) {
console.log('Something went wrong patching the record.', error); console.log('Something went wrong patching the record.', error);
return false; return false;
} }
} }
export async function download_export_li({ export async function download_export_li({
api_cfg, api_cfg,
get_obj_type, get_obj_type,
for_obj_type, for_obj_type,
for_obj_id, for_obj_id,
exp_alt = null, exp_alt = null,
file_type = 'CSV', file_type = 'CSV',
return_file = true, return_file = true,
filename = 'no_filename.csv', filename = 'no_filename.csv',
auto_download = false, auto_download = false,
limit = 5000, limit = 5000,
params = {}, params = {},
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
get_obj_type: string; get_obj_type: string;
for_obj_type: string; for_obj_type: string;
for_obj_id: string; for_obj_id: string;
exp_alt?: null | string; exp_alt?: null | string;
file_type?: string; file_type?: string;
return_file?: boolean; return_file?: boolean;
filename?: string; filename?: string;
auto_download?: boolean; auto_download?: boolean;
limit?: number; limit?: number;
params?: key_val; params?: key_val;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) console.log('*** download_export_li() ***'); if (log_lvl) console.log('*** download_export_li() ***');
const endpoint = `/v2/crud/${get_obj_type}/list`; const endpoint = `/v2/crud/${get_obj_type}/list`;
params['for_obj_type'] = for_obj_type; params['for_obj_type'] = for_obj_type;
params['for_obj_id'] = for_obj_id; params['for_obj_id'] = for_obj_id;
if (file_type === 'CSV' || file_type === 'Excel') { if (file_type === 'CSV' || file_type === 'Excel') {
params['file_type'] = file_type; params['file_type'] = file_type;
} }
params['return_file'] = true; params['return_file'] = true;
params['mdl_alt'] = 'out'; params['mdl_alt'] = 'out';
if (exp_alt) { if (exp_alt) {
params['exp_alt'] = exp_alt; params['exp_alt'] = exp_alt;
} }
const clean_filename = filename.replace(/[^a-zA-Z0-9\[\]-_.]/gi, '_'); const clean_filename = filename.replace(/[^a-zA-Z0-9\[\]-_.]/gi, '_');
if (limit >= 0) { if (limit >= 0) {
params['limit'] = limit; params['limit'] = limit;
} }
const download_result = await api.get_object({ const download_result = await api.get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
timeout: 90000, timeout: 90000,
return_blob: return_file, return_blob: return_file,
filename: clean_filename, filename: clean_filename,
auto_download: auto_download, auto_download: auto_download,
task_id: for_obj_id, task_id: for_obj_id,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) console.log('download_result:', download_result); if (log_lvl) console.log('download_result:', download_result);
return download_result; return download_result;
} }

View File

@@ -3,23 +3,23 @@ import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api'; import { api } from '$lib/api/api';
export interface Data_Store { export interface Data_Store {
id: string; id: string;
account_id: string; account_id: string;
code: string; code: string;
name: string; name: string;
type: string; type: string;
for_type?: string | null; for_type?: string | null;
for_id?: string | null; for_id?: string | null;
access_read?: string | null; access_read?: string | null;
access_write?: string | null; access_write?: string | null;
access_delete?: string | null; access_delete?: string | null;
html?: string | null; html?: string | null;
json?: key_val | null; json?: key_val | null;
md?: string | null; md?: string | null;
text?: string | null; text?: string | null;
updated_on?: string | null; updated_on?: string | null;
chk_account_id?: string; chk_account_id?: string;
loaded_on?: string; loaded_on?: string;
} }
/** /**
@@ -34,79 +34,79 @@ export interface Data_Store {
* @returns The data from the data store (e.g., text content or JSON object). * @returns The data from the data store (e.g., text content or JSON object).
*/ */
export async function load_ae_obj_by_code__data_store({ export async function load_ae_obj_by_code__data_store({
api_cfg, api_cfg,
code, code,
data_type = 'text', data_type = 'text',
save_idb = false, save_idb = false,
timeout = 9000, timeout = 9000,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
code: string; code: string;
data_type?: string; data_type?: string;
save_idb?: boolean; save_idb?: boolean;
timeout?: number; timeout?: number;
log_lvl?: number; log_lvl?: number;
}): Promise<any> { }): Promise<any> {
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_by_code__data_store() *** code=${code}`); console.log(`*** load_ae_obj_by_code__data_store() *** code=${code}`);
} }
if (!code) { if (!code) {
console.log(`*ae_func* No code provided!`); console.log(`*ae_func* No code provided!`);
return null; return null;
} }
if (!api_cfg.account_id) { if (!api_cfg.account_id) {
console.log(`*ae_func* No account_id found in API config!`); console.log(`*ae_func* No account_id found in API config!`);
return null; return null;
} }
try { try {
const get_ds_result = await api.get_data_store_obj_w_code({ const get_ds_result = await api.get_data_store_obj_w_code({
api_cfg: api_cfg, api_cfg: api_cfg,
data_store_code: code, data_store_code: code,
data_type: data_type, data_type: data_type,
timeout: timeout, timeout: timeout,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (!get_ds_result) { if (!get_ds_result) {
console.log('*ae_func* No results returned.'); console.log('*ae_func* No results returned.');
return null; return null;
} }
if (log_lvl) { if (log_lvl) {
console.log(`*ae_func* Got a result for code ${code}`); console.log(`*ae_func* Got a result for code ${code}`);
} }
if (!get_ds_result.data_store_id_random) { if (!get_ds_result.data_store_id_random) {
console.log('*ae_func* Something went wrong? No data store ID found.'); console.log('*ae_func* Something went wrong? No data store ID found.');
return null; return null;
} }
let return_this: any = null; let return_this: any = null;
// Simplified data extraction // Simplified data extraction
if (data_type === 'html') { if (data_type === 'html') {
return_this = get_ds_result.html; return_this = get_ds_result.html;
} else if (data_type === 'json') { } else if (data_type === 'json') {
return_this = get_ds_result.json; return_this = get_ds_result.json;
} else { } else {
return_this = get_ds_result.text; return_this = get_ds_result.text;
} }
if (save_idb && browser) { if (save_idb && browser) {
const key_prefix = 'ae_ds__'; const key_prefix = 'ae_ds__';
if (log_lvl) { if (log_lvl) {
console.log(`*ae_func* localStorage key: ${code}, value:`, get_ds_result); console.log(`*ae_func* localStorage key: ${code}, value:`, get_ds_result);
} }
localStorage.setItem(`${key_prefix}${code}`, JSON.stringify(get_ds_result)); localStorage.setItem(`${key_prefix}${code}`, JSON.stringify(get_ds_result));
} }
return return_this; return return_this;
} catch (error) { } catch (error) {
console.log('*ae_func* No results returned or failed.', error); console.log('*ae_func* No results returned or failed.', error);
return null; return null;
} }
} }

View File

@@ -7,354 +7,356 @@ const ae_promises: key_val = {};
// Updated 2024-06-14 // Updated 2024-06-14
export async function load_ae_obj_id__hosted_file({ export async function load_ae_obj_id__hosted_file({
api_cfg, api_cfg,
hosted_file_id, hosted_file_id,
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
hosted_file_id: string; hosted_file_id: string;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_id__hosted_file() *** hosted_file_id=${hosted_file_id}`); console.log(`*** load_ae_obj_id__hosted_file() *** hosted_file_id=${hosted_file_id}`);
} }
const params = {}; const params = {};
ae_promises.load__hosted_file_obj = await api ae_promises.load__hosted_file_obj = await api
.get_ae_obj_id_crud({ .get_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'hosted_file', obj_type: 'hosted_file',
obj_id: hosted_file_id, // NOTE: This is the FQDN, not normally the ID. obj_id: hosted_file_id, // NOTE: This is the FQDN, not normally the ID.
use_alt_table: false, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config. use_alt_table: false, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config.
use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (hosted_file_obj_get_result) { .then(function (hosted_file_obj_get_result) {
if (hosted_file_obj_get_result) { if (hosted_file_obj_get_result) {
// This is expecting a list // This is expecting a list
db_save_ae_obj_li__hosted_file({ db_save_ae_obj_li__hosted_file({
obj_type: 'hosted_file', obj_type: 'hosted_file',
obj_li: [hosted_file_obj_get_result] obj_li: [hosted_file_obj_get_result]
}); });
return hosted_file_obj_get_result; return hosted_file_obj_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
return ae_promises.load__hosted_file_obj; return ae_promises.load__hosted_file_obj;
} }
// Updated 2024-07-03 // Updated 2024-07-03
export async function load_ae_obj_li__hosted_file({ export async function load_ae_obj_li__hosted_file({
api_cfg, api_cfg,
for_obj_type, for_obj_type,
for_obj_id, for_obj_id,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 99, limit = 99,
offset = 0, offset = 0,
order_by_li = { priority: 'DESC', sort: 'DESC', updated_on: 'DESC', created_on: 'DESC' }, order_by_li = { priority: 'DESC', sort: 'DESC', updated_on: 'DESC', created_on: 'DESC' },
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
for_obj_type: string; for_obj_type: string;
for_obj_id: string; for_obj_id: string;
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** load_ae_obj_li__hosted_file() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}` `*** load_ae_obj_li__hosted_file() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}`
); );
} }
// Check if for_obj_type is in the list of valid Aether object types: // Check if for_obj_type is in the list of valid Aether object types:
const valid_for_obj_types = [ const valid_for_obj_types = [
'account', 'account',
'archive', 'archive',
'archive_content', 'archive_content',
'event', 'event',
'event_session', 'event_session',
'event_presentation', 'event_presentation',
'event_presenter', 'event_presenter',
'event_location', 'event_location',
'journal', 'journal',
'journal_entry', 'journal_entry',
'post', 'post',
'post_comment' 'post_comment'
]; ];
if (!valid_for_obj_types.includes(for_obj_type)) { if (!valid_for_obj_types.includes(for_obj_type)) {
console.log(`Invalid for_obj_type: ${for_obj_type}`); console.log(`Invalid for_obj_type: ${for_obj_type}`);
return []; return [];
} }
// let enabled: string = (params.qry__enabled ?? 'enabled'); // all, disabled, enabled // let enabled: string = (params.qry__enabled ?? 'enabled'); // all, disabled, enabled
// let hidden: string = (params.qry__hidden ?? 'all'); // all, hidden, not_hidden // let hidden: string = (params.qry__hidden ?? 'all'); // all, hidden, not_hidden
// let limit: number = (params.qry__limit ?? 99); // 99 // let limit: number = (params.qry__limit ?? 99); // 99
// let offset: number = (params.qry__offset ?? 0); // 0 // let offset: number = (params.qry__offset ?? 0); // 0
const params_json: key_val = {}; const params_json: key_val = {};
// console.log('params_json:', params_json); // console.log('params_json:', params_json);
ae_promises.load__hosted_file_obj_li = await api ae_promises.load__hosted_file_obj_li = await api
.get_ae_obj_li_for_obj_id_crud_v2({ .get_ae_obj_li_for_obj_id_crud_v2({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'hosted_file', obj_type: 'hosted_file',
for_obj_type: for_obj_type, for_obj_type: for_obj_type,
for_obj_id: for_obj_id, for_obj_id: for_obj_id,
use_alt_tbl: false, use_alt_tbl: false,
use_alt_mdl: false, use_alt_mdl: false,
use_alt_exp: false, use_alt_exp: false,
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (hosted_file_obj_li_get_result) { .then(function (hosted_file_obj_li_get_result) {
if (hosted_file_obj_li_get_result) { if (hosted_file_obj_li_get_result) {
if (try_cache) { if (try_cache) {
db_save_ae_obj_li__hosted_file({ db_save_ae_obj_li__hosted_file({
obj_type: 'hosted_file', obj_type: 'hosted_file',
obj_li: hosted_file_obj_li_get_result, obj_li: hosted_file_obj_li_get_result,
log_lvl: log_lvl log_lvl: log_lvl
}); });
} }
return hosted_file_obj_li_get_result; return hosted_file_obj_li_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return []; return [];
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__hosted_file_obj_li:', ae_promises.load__hosted_file_obj_li); console.log('ae_promises.load__hosted_file_obj_li:', ae_promises.load__hosted_file_obj_li);
} }
return ae_promises.load__hosted_file_obj_li; return ae_promises.load__hosted_file_obj_li;
} }
// Updated 2024-11-07 // Updated 2024-11-07
export async function delete_ae_obj_id__hosted_file({ export async function delete_ae_obj_id__hosted_file({
api_cfg, api_cfg,
hosted_file_id, hosted_file_id,
link_to_type, // Ideally this should be required... link_to_type, // Ideally this should be required...
link_to_id, // Ideally this should be required... link_to_id, // Ideally this should be required...
rm_orphan = false, rm_orphan = false,
fake_delete = false, // Fake the delete result to "true" fake_delete = false, // Fake the delete result to "true"
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
hosted_file_id: string; hosted_file_id: string;
link_to_type: string; link_to_type: string;
link_to_id: string; link_to_id: string;
rm_orphan?: boolean; rm_orphan?: boolean;
fake_delete?: boolean; fake_delete?: boolean;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** delete_ae_obj_id__hosted_file() *** hosted_file_id=${hosted_file_id}`); console.log(`*** delete_ae_obj_id__hosted_file() *** hosted_file_id=${hosted_file_id}`);
} }
const endpoint = `/hosted_file/${hosted_file_id}`; const endpoint = `/hosted_file/${hosted_file_id}`;
params['link_to_type'] = link_to_type; params['link_to_type'] = link_to_type;
params['link_to_id'] = link_to_id; params['link_to_id'] = link_to_id;
params['rm_orphan'] = rm_orphan; // This is what actually allows the hosted file to be deleted from the server. params['rm_orphan'] = rm_orphan; // This is what actually allows the hosted file to be deleted from the server.
if (log_lvl) { if (log_lvl) {
console.log(`delete_ae_obj_id__hosted_file() params=`, params); console.log(`delete_ae_obj_id__hosted_file() params=`, params);
} }
if (fake_delete) { if (fake_delete) {
console.log(`*** FAKE DELETE!!! ***`); console.log(`*** FAKE DELETE!!! ***`);
ae_promises.delete__hosted_file_obj = true; ae_promises.delete__hosted_file_obj = true;
return ae_promises.delete__hosted_file_obj; return ae_promises.delete__hosted_file_obj;
} }
ae_promises.delete__hosted_file_obj = await api ae_promises.delete__hosted_file_obj = await api
.delete_object({ .delete_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
// return_meta: return_meta, // return_meta: return_meta,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (hosted_file_obj_li_get_result) { .then(function (hosted_file_obj_li_get_result) {
if (hosted_file_obj_li_get_result) { if (hosted_file_obj_li_get_result) {
if (try_cache) { if (try_cache) {
if (log_lvl) { if (log_lvl) {
console.log(`Attempting to remove IDB entry for hosted_file_id=${hosted_file_id}`); console.log(
} `Attempting to remove IDB entry for hosted_file_id=${hosted_file_id}`
db_core.file.delete(hosted_file_id); // Delete from the DB no matter what. );
} }
return hosted_file_obj_li_get_result; db_core.file.delete(hosted_file_id); // Delete from the DB no matter what.
} else { }
console.log('No results returned.'); return hosted_file_obj_li_get_result;
return []; } else {
} console.log('No results returned.');
}) return [];
.catch(function (error: any) { }
console.log('No results returned or failed.', error); })
}); .catch(function (error: any) {
console.log('No results returned or failed.', error);
});
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.delete__hosted_file_obj:', ae_promises.delete__hosted_file_obj); console.log('ae_promises.delete__hosted_file_obj:', ae_promises.delete__hosted_file_obj);
} }
return ae_promises.delete__hosted_file_obj; return ae_promises.delete__hosted_file_obj;
} }
// This function will loop through the hosted_file_obj_li and save each one to the DB. // This function will loop through the hosted_file_obj_li and save each one to the DB.
// Updated 2025-01-07 // Updated 2025-01-07
export function db_save_ae_obj_li__hosted_file({ export function db_save_ae_obj_li__hosted_file({
obj_type, obj_type,
obj_li, obj_li,
log_lvl = 0 log_lvl = 0
}: { }: {
obj_type: string; obj_type: string;
obj_li: any; obj_li: any;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** db_save_ae_obj_li__hosted_file() ***`); console.log(`*** db_save_ae_obj_li__hosted_file() ***`);
} }
if (obj_li && obj_li.length) { if (obj_li && obj_li.length) {
obj_li.forEach(async function (obj: any) { obj_li.forEach(async function (obj: any) {
if (log_lvl) { if (log_lvl) {
console.log(`ae_obj ${obj_type}:`, obj); console.log(`ae_obj ${obj_type}:`, obj);
} }
try { try {
const id_random = await db_core.file.put({ const id_random = await db_core.file.put({
id: obj.hosted_file_id_random, id: obj.hosted_file_id_random,
id_random: obj.hosted_file_id_random, id_random: obj.hosted_file_id_random,
hosted_file_id: obj.hosted_file_id_random, hosted_file_id: obj.hosted_file_id_random,
hosted_file_id_random: obj.hosted_file_id_random, hosted_file_id_random: obj.hosted_file_id_random,
hash_sha256: obj.hash_sha256, // Renamed with alias in FastAPI model hash_sha256: obj.hash_sha256, // Renamed with alias in FastAPI model
for_type: obj.for_type, for_type: obj.for_type,
for_id: obj.for_id_id_random, for_id: obj.for_id_id_random,
for_id_random: obj.for_id_random, for_id_random: obj.for_id_random,
account_id: obj.account_id_random, account_id: obj.account_id_random,
filename: obj.filename, filename: obj.filename,
extension: obj.extension, extension: obj.extension,
content_type: obj.content_type, content_type: obj.content_type,
size: obj.size, size: obj.size,
enable: obj.enable, enable: obj.enable,
hide: obj.hide, hide: obj.hide,
// priority: obj.priority, // priority: obj.priority,
// sort: obj.sort, // sort: obj.sort,
group: obj.group, group: obj.group,
notes: obj.notes, notes: obj.notes,
created_on: obj.created_on, created_on: obj.created_on,
updated_on: obj.updated_on, updated_on: obj.updated_on,
filename_no_ext: obj.filename_no_ext, filename_no_ext: obj.filename_no_ext,
filename_w_ext: obj.filename_w_ext filename_w_ext: obj.filename_w_ext
}); });
// console.log(`Put obj with ID: ${obj.hosted_file_id_random} or ${id_random}`); // console.log(`Put obj with ID: ${obj.hosted_file_id_random} or ${id_random}`);
} catch (error) { } catch (error) {
const status = `Failed to put ${obj.hosted_file_id_random}: ${error}`; const status = `Failed to put ${obj.hosted_file_id_random}: ${error}`;
console.log(status); console.log(status);
} }
// const id_random = await db_core.file.put(obj); // const id_random = await db_core.file.put(obj);
// console.log(`Put obj with ID: ${obj.hosted_file_id_random}`); // console.log(`Put obj with ID: ${obj.hosted_file_id_random}`);
}); });
return true; return true;
} }
return false; return false;
} }
// Updated 2025-01-07 // Updated 2025-01-07
export function db_update_ae_obj_id__hosted_file({ export function db_update_ae_obj_id__hosted_file({
obj_type, obj_type,
obj_id, obj_id,
data_kv, data_kv,
log_lvl = 0 log_lvl = 0
}: { }: {
obj_type: string; obj_type: string;
obj_id: string; obj_id: string;
data_kv: key_val; data_kv: key_val;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** db_update_ae_obj_id__hosted_file() ***`); console.log(`*** db_update_ae_obj_id__hosted_file() ***`);
} }
if (obj_id) { if (obj_id) {
console.log(`ae_obj ${obj_type}:`, obj_id); console.log(`ae_obj ${obj_type}:`, obj_id);
try { try {
// db_core.file.update(obj_id, data_kv); // db_core.file.update(obj_id, data_kv);
db_core.file.update(obj_id, { db_core.file.update(obj_id, {
// for_type: data_kv.for_type, // for_type: data_kv.for_type,
// for_id: data_kv.for_id_id_random, // for_id: data_kv.for_id_id_random,
// for_id_random: data_kv.for_id_random, // for_id_random: data_kv.for_id_random,
filename: data_kv.filename, filename: data_kv.filename,
extension: data_kv.extension, extension: data_kv.extension,
content_type: data_kv.content_type, content_type: data_kv.content_type,
size: data_kv.size, size: data_kv.size,
// enable: data_kv.enable, // enable: data_kv.enable,
// hide: data_kv.hide, // hide: data_kv.hide,
// priority: data_kv.priority, // priority: data_kv.priority,
// sort: data_kv.sort, // sort: data_kv.sort,
// group: data_kv.group, // group: data_kv.group,
// notes: data_kv.notes, // notes: data_kv.notes,
// created_on: data_kv.created_on, // created_on: data_kv.created_on,
// updated_on: data_kv.updated_on, // updated_on: data_kv.updated_on,
filename_no_ext: data_kv.filename_no_ext, filename_no_ext: data_kv.filename_no_ext,
filename_w_ext: data_kv.filename_w_ext filename_w_ext: data_kv.filename_w_ext
// hosted_file_content_type: data_kv.hosted_file_content_type, // hosted_file_content_type: data_kv.hosted_file_content_type,
// file_size: data_kv.file_size, // file_size: data_kv.file_size,
// hosted_file_size: data_kv.hosted_file_size, // hosted_file_size: data_kv.hosted_file_size,
}); });
console.log(`Update obj with ID: ${obj_id}`); console.log(`Update obj with ID: ${obj_id}`);
} catch (error) { } catch (error) {
const status = `Failed to update ${obj_id}: ${error}`; const status = `Failed to update ${obj_id}: ${error}`;
console.log(status); console.log(status);
} }
// const id_random = await db_core.file.put(obj); // const id_random = await db_core.file.put(obj);
// console.log(`Put obj with ID: ${data_kv.hosted_file_id_random}`); // console.log(`Put obj with ID: ${data_kv.hosted_file_id_random}`);
return true; return true;
} }
return false; return false;
} }

View File

@@ -8,26 +8,29 @@ import type { Dexie, Table } from 'dexie';
* @returns The found ID, or undefined if no ID could be found. * @returns The found ID, or undefined if no ID could be found.
*/ */
function find_object_id( function find_object_id(
obj: any, obj: any,
table_name: string, table_name: string,
log_lvl: number log_lvl: number
): string | number | undefined { ): string | number | undefined {
const potential_keys = ['id', `${table_name}_id`, `${table_name}_id_random`]; const potential_keys = ['id', `${table_name}_id`, `${table_name}_id_random`];
for (const key of potential_keys) { for (const key of potential_keys) {
if (obj[key]) { if (obj[key]) {
if (key !== 'id' && log_lvl > 0) { if (key !== 'id' && log_lvl > 0) {
console.warn( console.warn(
`Found legacy ID key "${key}" for table "${table_name}". Consider standardizing to "id".`, `Found legacy ID key "${key}" for table "${table_name}". Consider standardizing to "id".`,
obj obj
); );
} }
return obj[key]; return obj[key];
} }
} }
console.error(`Object is missing a valid ID for table "${table_name}". It will be skipped.`, obj); console.error(
return undefined; `Object is missing a valid ID for table "${table_name}". It will be skipped.`,
obj
);
return undefined;
} }
/** /**
@@ -46,74 +49,74 @@ function find_object_id(
* @since 2025-11-13 * @since 2025-11-13
*/ */
export async function db_save_ae_obj_li__ae_obj<T extends Record<string, any>>({ export async function db_save_ae_obj_li__ae_obj<T extends Record<string, any>>({
db_instance, db_instance,
table_name, table_name,
obj_li, obj_li,
properties_to_save, properties_to_save,
log_lvl = 0 log_lvl = 0
}: { }: {
db_instance: Dexie; db_instance: Dexie;
table_name: string; table_name: string;
obj_li: T[]; obj_li: T[];
properties_to_save: (keyof T)[]; properties_to_save: (keyof T)[];
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl > 0) { if (log_lvl > 0) {
console.log( console.log(
`*** db_save_ae_obj_li__ae_obj: Attempting to save ${obj_li.length} objects to table "${table_name}" ***` `*** db_save_ae_obj_li__ae_obj: Attempting to save ${obj_li.length} objects to table "${table_name}" ***`
); );
} }
if (!obj_li || obj_li.length === 0) { if (!obj_li || obj_li.length === 0) {
if (log_lvl > 0) console.log('No objects to save.'); if (log_lvl > 0) console.log('No objects to save.');
return []; return [];
} }
const db_table: Table<T> = db_instance.table(table_name); const db_table: Table<T> = db_instance.table(table_name);
if (!db_table) { if (!db_table) {
const error_msg = `Table not found in Dexie instance: ${table_name}`; const error_msg = `Table not found in Dexie instance: ${table_name}`;
console.error(error_msg); console.error(error_msg);
throw new Error(error_msg); throw new Error(error_msg);
} }
const data_to_save = obj_li const data_to_save = obj_li
.map((obj) => { .map((obj) => {
const record: Partial<T> = {}; const record: Partial<T> = {};
// Extract only the specified properties to save. // Extract only the specified properties to save.
for (const prop of properties_to_save) { for (const prop of properties_to_save) {
record[prop] = obj[prop]; record[prop] = obj[prop];
} }
// Ensure the primary key is included, attempting to find it from various legacy keys. // Ensure the primary key is included, attempting to find it from various legacy keys.
const id = find_object_id(obj, table_name, log_lvl); const id = find_object_id(obj, table_name, log_lvl);
if (id === undefined) { if (id === undefined) {
return null; // Skip objects without a valid ID. return null; // Skip objects without a valid ID.
} }
(record as any).id = id; (record as any).id = id;
return record; return record;
}) })
.filter(Boolean) as T[]; .filter(Boolean) as T[];
if (data_to_save.length === 0) { if (data_to_save.length === 0) {
if (log_lvl > 0) { if (log_lvl > 0) {
console.warn('All objects were skipped, likely due to missing IDs.'); console.warn('All objects were skipped, likely due to missing IDs.');
} }
return []; return [];
} }
try { try {
// bulkPut efficiently handles both inserts and updates. // bulkPut efficiently handles both inserts and updates.
const keys = await db_table.bulkPut(data_to_save); const keys = await db_table.bulkPut(data_to_save);
if (log_lvl > 0) { if (log_lvl > 0) {
console.log(`Successfully saved ${keys.length} objects to "${table_name}".`); console.log(`Successfully saved ${keys.length} objects to "${table_name}".`);
} }
return keys; return keys;
} catch (error) { } catch (error) {
console.error(`Failed to save objects to "${table_name}":`, error); console.error(`Failed to save objects to "${table_name}":`, error);
// Re-throw the error to let the caller handle it. // Re-throw the error to let the caller handle it.
throw error; throw error;
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -10,138 +10,138 @@ const ae_promises: key_val = {};
// I recently made significant updates to this with the help of Copilot. I think it is correct. // I recently made significant updates to this with the help of Copilot. I think it is correct.
// Updated 2025-10-03 // Updated 2025-10-03
export async function generate_qr_code({ export async function generate_qr_code({
api_cfg, api_cfg,
account_id, account_id,
qr_type, // mecard, obj, str, vcard qr_type, // mecard, obj, str, vcard
qr_id, // This is essentially the filename it can be found at /qr/{account_id}/{qr_id} qr_id, // This is essentially the filename it can be found at /qr/{account_id}/{qr_id}
qr_data, // vcard fields: qr_data, // vcard fields:
obj_type, obj_type,
obj_id, obj_id,
str, // For encoding a string (like a URL) into a QR code. str, // For encoding a string (like a URL) into a QR code.
return_blob = true, // blob or url? return_blob = true, // blob or url?
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
qr_type: string; qr_type: string;
qr_id: string; qr_id: string;
qr_data?: any; qr_data?: any;
obj_type?: string; obj_type?: string;
obj_id?: string; obj_id?: string;
str?: string; str?: string;
return_blob?: boolean; return_blob?: boolean;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** generate_qr_code() *** qr_id=${qr_id}`); console.log(`*** generate_qr_code() *** qr_id=${qr_id}`);
} }
const endpoint = `/qr/${account_id}/${qr_id}`; const endpoint = `/qr/${account_id}/${qr_id}`;
if (log_lvl) { if (log_lvl) {
console.log('Endpoint', endpoint); console.log('Endpoint', endpoint);
} }
const params: key_val = { const params: key_val = {
regen: true, // Regenerate the file even if nothing has changed. regen: true, // Regenerate the file even if nothing has changed.
return_file: return_blob, return_file: return_blob,
qr_type: qr_type, // mecard, obj, vcard qr_type: qr_type, // mecard, obj, vcard
qr_send: return_blob qr_send: return_blob
}; };
if (qr_type == 'vcard') { if (qr_type == 'vcard') {
if (qr_data.informal_name) { if (qr_data.informal_name) {
params['n'] = `${qr_data.family_name};${qr_data.given_name};${qr_data.informal_name}`; params['n'] = `${qr_data.family_name};${qr_data.given_name};${qr_data.informal_name}`;
} else { } else {
params['n'] = `${qr_data.family_name};${qr_data.given_name}`; params['n'] = `${qr_data.family_name};${qr_data.given_name}`;
} }
params['fn'] = qr_data.full_name_override; params['fn'] = qr_data.full_name_override;
if (qr_data.affiliations) { if (qr_data.affiliations) {
params['org'] = qr_data.affiliations; params['org'] = qr_data.affiliations;
} }
params['email'] = qr_data.email; params['email'] = qr_data.email;
if (qr_data.phone) { if (qr_data.phone) {
params['tel'] = qr_data.phone; params['tel'] = qr_data.phone;
} }
params['adr'] = qr_data.location_override; params['adr'] = qr_data.location_override;
if (qr_data.address_line_1) { if (qr_data.address_line_1) {
params['adr_str'] = qr_data.address_line_1; params['adr_str'] = qr_data.address_line_1;
} }
params['adr_loc'] = qr_data.city; params['adr_loc'] = qr_data.city;
params['adr_reg'] = qr_data.state_province; params['adr_reg'] = qr_data.state_province;
params['adr_postal'] = qr_data.postal_code; params['adr_postal'] = qr_data.postal_code;
params['adr_country'] = qr_data.country; params['adr_country'] = qr_data.country;
} else if (qr_type == 'obj') { } else if (qr_type == 'obj') {
params['obj_type'] = obj_type; params['obj_type'] = obj_type;
params['obj_id'] = obj_id; params['obj_id'] = obj_id;
} else if (qr_type == 'str') { } else if (qr_type == 'str') {
params['str'] = str; params['str'] = str;
} }
if (log_lvl) { if (log_lvl) {
console.log('Params', params); console.log('Params', params);
} }
const filename = null; const filename = null;
// Await the API call // Await the API call
ae_promises.generate_qr_code = await api.get_object({ ae_promises.generate_qr_code = await api.get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
return_blob: return_blob, return_blob: return_blob,
filename: filename, filename: filename,
auto_download: false, auto_download: false,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('QR code API response:', ae_promises.generate_qr_code); console.log('QR code API response:', ae_promises.generate_qr_code);
} }
// If return_blob is true, ensure we return an object URL for use in <img src=...> // If return_blob is true, ensure we return an object URL for use in <img src=...>
if (return_blob) { if (return_blob) {
const data = ae_promises.generate_qr_code.data ?? ae_promises.generate_qr_code; const data = ae_promises.generate_qr_code.data ?? ae_promises.generate_qr_code;
// If already a Blob, use it directly // If already a Blob, use it directly
if (data instanceof Blob) { if (data instanceof Blob) {
return URL.createObjectURL(data); return URL.createObjectURL(data);
} }
// If it's a Response (from fetch), convert to Blob // If it's a Response (from fetch), convert to Blob
if (data instanceof Response) { if (data instanceof Response) {
const blob = await data.blob(); const blob = await data.blob();
return URL.createObjectURL(blob); return URL.createObjectURL(blob);
} }
// If it's an ArrayBuffer or Uint8Array, convert to Blob // If it's an ArrayBuffer or Uint8Array, convert to Blob
if (data instanceof ArrayBuffer || data instanceof Uint8Array) { if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
const blob = new Blob([data], { type: 'image/png' }); const blob = new Blob([data], { type: 'image/png' });
return URL.createObjectURL(blob); return URL.createObjectURL(blob);
} }
// If it's a base64 string, return as data URL // If it's a base64 string, return as data URL
if (typeof data === 'string' && data.startsWith('data:image')) { if (typeof data === 'string' && data.startsWith('data:image')) {
return data; return data;
} }
// If it's a raw string (base64), convert to data URL // If it's a raw string (base64), convert to data URL
if (typeof data === 'string') { if (typeof data === 'string') {
return `data:image/png;base64,${data}`; return `data:image/png;base64,${data}`;
} }
// Fallback: try to create a Blob from whatever is left // Fallback: try to create a Blob from whatever is left
try { try {
const blob = new Blob([data], { type: 'image/png' }); const blob = new Blob([data], { type: 'image/png' });
return URL.createObjectURL(blob); return URL.createObjectURL(blob);
} catch (e) { } catch (e) {
if (log_lvl) console.error('Could not create QR code image blob:', e, data); if (log_lvl) console.error('Could not create QR code image blob:', e, data);
return null; return null;
} }
} }
// If not returning a blob, return the raw API response // If not returning a blob, return the raw API response
return ae_promises.generate_qr_code; return ae_promises.generate_qr_code;
} }
// Updated 2025-10-09 // Updated 2025-10-09
@@ -159,105 +159,105 @@ export async function generate_qr_code({
* @throws {Error} If the qr_type is unknown or data is missing. * @throws {Error} If the qr_type is unknown or data is missing.
*/ */
export async function js_generate_qr_code(qr_type, params = {}) { export async function js_generate_qr_code(qr_type, params = {}) {
const { const {
n = '', n = '',
fn = '', fn = '',
org = '', org = '',
url = '', url = '',
email = '', email = '',
tel = '', tel = '',
adr_poa = '', adr_poa = '',
adr_ext = '', adr_ext = '',
adr_str = '', adr_str = '',
adr_loc = '', adr_loc = '',
adr_reg = '', adr_reg = '',
adr_postal = '', adr_postal = '',
adr_country = '', adr_country = '',
obj_type, obj_type,
obj_id, obj_id,
key, key,
val, val,
js, js,
str str
} = params; } = params;
console.log(`*** js_generate_qr_code() *** qr_type=${qr_type}`, params); console.log(`*** js_generate_qr_code() *** qr_type=${qr_type}`, params);
let qr_data = null; let qr_data = null;
// --- 1. Replicate Data Formatting Logic --- // --- 1. Replicate Data Formatting Logic ---
switch (qr_type) { switch (qr_type) {
case 'mecard': case 'mecard':
// Format: MECARD:N:name;EMAIL:email;ADR:address;; // Format: MECARD:N:name;EMAIL:email;ADR:address;;
// Note: The original Python code had adr, but we'll use n and email as a minimum. // Note: The original Python code had adr, but we'll use n and email as a minimum.
qr_data = `MECARD:N:${n};EMAIL:${email};;`; qr_data = `MECARD:N:${n};EMAIL:${email};;`;
// You can enhance this with other MeCard fields if needed. // You can enhance this with other MeCard fields if needed.
break; break;
case 'vcard': case 'vcard':
// Format: BEGIN:VCARD...END:VCARD // Format: BEGIN:VCARD...END:VCARD
qr_data = `BEGIN:VCARD\nVERSION:3.0\nN:${n}\nFN:${fn}\nORG:${org}\nEMAIL:${email}\n`; qr_data = `BEGIN:VCARD\nVERSION:3.0\nN:${n}\nFN:${fn}\nORG:${org}\nEMAIL:${email}\n`;
if (url) { if (url) {
qr_data += `URL:${url}\n`; qr_data += `URL:${url}\n`;
} }
if (tel) { if (tel) {
qr_data += `TEL:${tel}\n`; qr_data += `TEL:${tel}\n`;
} }
if (adr_loc) { if (adr_loc) {
// ADR format: TYPE=postal:Po box;Ext;Street;Locality;Region;Postal code;Country // ADR format: TYPE=postal:Po box;Ext;Street;Locality;Region;Postal code;Country
qr_data += `ADR:${adr_poa};${adr_ext};${adr_str};${adr_loc};${adr_reg};${adr_postal};${adr_country}\n`; qr_data += `ADR:${adr_poa};${adr_ext};${adr_str};${adr_loc};${adr_reg};${adr_postal};${adr_country}\n`;
} }
qrData += 'END:VCARD'; qrData += 'END:VCARD';
break; break;
case 'obj': case 'obj':
// Custom format: OBJ:ot:obj_type,oi:obj_id // Custom format: OBJ:ot:obj_type,oi:obj_id
if (!obj_type || !obj_id) throw new Error('Missing obj_type or obj_id for type "obj".'); if (!obj_type || !obj_id) throw new Error('Missing obj_type or obj_id for type "obj".');
qr_data = `OBJ:ot:${obj_type},oi:${obj_id}`; qr_data = `OBJ:ot:${obj_type},oi:${obj_id}`;
break; break;
case 'kv': case 'kv':
// Custom format: KV:k:"key",v:"val" // Custom format: KV:k:"key",v:"val"
if (!key || !val) throw new Error('Missing key or val for type "kv".'); if (!key || !val) throw new Error('Missing key or val for type "kv".');
qr_data = `KV:k:"${key}",v:"${val}"`; qr_data = `KV:k:"${key}",v:"${val}"`;
break; break;
case 'js': case 'js':
// Assumes 'js' is a stringified JSON object // Assumes 'js' is a stringified JSON object
if (!js) throw new Error('Missing js string for type "js".'); if (!js) throw new Error('Missing js string for type "js".');
qr_data = `JS:${js}`; qr_data = `JS:${js}`;
break; break;
case 'str': case 'str':
// Raw string data // Raw string data
if (!str) throw new Error('Missing raw string data for type "str".'); if (!str) throw new Error('Missing raw string data for type "str".');
qr_data = str; qr_data = str;
break; break;
default: default:
throw new Error(`Unknown QR type: ${qr_type}`); throw new Error(`Unknown QR type: ${qr_type}`);
} }
if (!qr_data) { if (!qr_data) {
throw new Error('Failed to create QR code data string.'); throw new Error('Failed to create QR code data string.');
} }
// --- 2. Generate QR Code Image --- // --- 2. Generate QR Code Image ---
try { try {
// Options match the Python 'qrcode' library defaults closely: // Options match the Python 'qrcode' library defaults closely:
// error_correction = qrcode.constants.ERROR_CORRECT_M // error_correction = qrcode.constants.ERROR_CORRECT_M
// box_size = 10, border = 1 // box_size = 10, border = 1
const data_url = await QRCode.toDataURL(qr_data, { const data_url = await QRCode.toDataURL(qr_data, {
errorCorrectionLevel: 'M', errorCorrectionLevel: 'M',
margin: 1, // Corresponds to border margin: 1, // Corresponds to border
scale: 10, // Corresponds to box_size scale: 10, // Corresponds to box_size
type: 'image/png' type: 'image/png'
}); });
console.log('Generated QR code data URL:', data_url); console.log('Generated QR code data URL:', data_url);
return data_url; return data_url;
} catch (error) { } catch (error) {
console.error('Error generating QR code:', error); console.error('Error generating QR code:', error);
throw new Error('Could not generate QR code image.'); throw new Error('Could not generate QR code image.');
} }
} }

View File

@@ -1,50 +1,50 @@
export interface Site { export interface Site {
id: string; id: string;
// id_random: string; // id_random: string;
site_id: string; site_id: string;
site_id_random?: string; site_id_random?: string;
code?: string; code?: string;
account_id: string; account_id: string;
account_id_random?: string; account_id_random?: string;
name: string; name: string;
description?: null | string; description?: null | string;
restrict_access?: null | boolean; restrict_access?: null | boolean;
access_key?: null | string; access_key?: null | string;
access_code_kv_json?: null | string; access_code_kv_json?: null | string;
logo_path?: null | string; logo_path?: null | string;
logo_bg_color?: null | string; // Not really used currently. logo_bg_color?: null | string; // Not really used currently.
// background_image_path?: null|string; // Legacy field // background_image_path?: null|string; // Legacy field
// background_bg_color?: null|string; // Legacy field // background_bg_color?: null|string; // Legacy field
title?: null | string; title?: null | string;
// header_html?: null|string; // Legacy field // header_html?: null|string; // Legacy field
// header_css?: null|string; // Legacy field // header_css?: null|string; // Legacy field
// header_image_path?: null|string; // Legacy field // header_image_path?: null|string; // Legacy field
// header_image_bg_color?: null|string; // Legacy field // header_image_bg_color?: null|string; // Legacy field
// body_html?: null|string; // Legacy field // body_html?: null|string; // Legacy field
tagline?: null | string; tagline?: null | string;
// site_header_h1?: null|string; // Legacy field // site_header_h1?: null|string; // Legacy field
// site_header_h2?: null|string; // Legacy field // site_header_h2?: null|string; // Legacy field
style_href?: null | string; // Legacy field style_href?: null | string; // Legacy field
// script_src?: null|string; // Legacy field // script_src?: null|string; // Legacy field
google_tracking_id?: null | string; google_tracking_id?: null | string;
cfg_json?: null | string; // key value config json cfg_json?: null | string; // key value config json
enable: null | boolean; enable: null | boolean;
enable_from?: null | Date; enable_from?: null | Date;
enable_to?: null | Date; enable_to?: null | Date;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
} }

View File

@@ -1,22 +1,22 @@
export interface Site_Domain { export interface Site_Domain {
id: string; id: string;
// id_random: string; // id_random: string;
site_id: string; site_id: string;
site_id_random?: string; site_id_random?: string;
fqdn: string; fqdn: string;
access_key?: null | string; access_key?: null | string;
required_referrer?: null | string; required_referrer?: null | string;
valid_for?: null | number; // In hours valid_for?: null | number; // In hours
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
} }
import { api } from '$lib/api/api'; import { api } from '$lib/api/api';
@@ -31,45 +31,45 @@ import { api } from '$lib/api/api';
* @returns The site domain object or null if not found. * @returns The site domain object or null if not found.
*/ */
export async function load_ae_obj_by_fqdn__site_domain({ export async function load_ae_obj_by_fqdn__site_domain({
api_cfg, api_cfg,
fqdn, fqdn,
timeout = 7000, timeout = 7000,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
fqdn: string; fqdn: string;
timeout?: number; timeout?: number;
log_lvl?: number; log_lvl?: number;
}): Promise<any> { }): Promise<any> {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** load_ae_obj_by_fqdn__site_domain() *** api.base_url=${api_cfg.base_url}, fqdn=${fqdn}, timeout=${timeout}` `*** load_ae_obj_by_fqdn__site_domain() *** api.base_url=${api_cfg.base_url}, fqdn=${fqdn}, timeout=${timeout}`
); );
} }
const params = {}; const params = {};
try { try {
const site_domain_obj = await api.get_ae_obj_id_crud({ const site_domain_obj = await api.get_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
no_account_id: true, // This seems to be a special case for this endpoint no_account_id: true, // This seems to be a special case for this endpoint
obj_type: 'site_domain', obj_type: 'site_domain',
obj_id: fqdn, // NOTE: This is the FQDN, not the ID. obj_id: fqdn, // NOTE: This is the FQDN, not the ID.
use_alt_table: true, use_alt_table: true,
use_alt_base: true, use_alt_base: true,
params: params, params: params,
timeout: timeout, timeout: timeout,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (site_domain_obj) { if (site_domain_obj) {
return site_domain_obj; return site_domain_obj;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
} catch (error) { } catch (error) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
return null; return null;
} }
} }

View File

@@ -7,66 +7,66 @@ const ae_promises: key_val = {};
// Updated 2024-10-14 // Updated 2024-10-14
export async function load_ae_obj_li__time_zone({ export async function load_ae_obj_li__time_zone({
api_cfg, api_cfg,
// account_id, // account_id,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 99, limit = 99,
offset = 0, offset = 0,
// order_by_li = {'priority': 'DESC', 'group': 'ASC', 'sort': 'DESC', 'name': 'ASC'}, // order_by_li = {'priority': 'DESC', 'group': 'ASC', 'sort': 'DESC', 'name': 'ASC'},
order_by_li = { priority: 'DESC', sort: 'DESC', name: 'ASC' }, order_by_li = { priority: 'DESC', sort: 'DESC', name: 'ASC' },
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
// account_id: string, // account_id: string,
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_li__time_zone() ***`); console.log(`*** load_ae_obj_li__time_zone() ***`);
} }
const params_json: key_val = {}; const params_json: key_val = {};
// console.log('params_json:', params_json); // console.log('params_json:', params_json);
ae_promises.load__time_zone_li = await api ae_promises.load__time_zone_li = await api
.get_ae_obj_li_for_obj_id_crud_v2({ .get_ae_obj_li_for_obj_id_crud_v2({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'lu', obj_type: 'lu',
for_obj_type: 'time_zone', for_obj_type: 'time_zone',
// for_obj_id: account_id, // for_obj_id: account_id,
use_alt_tbl: true, // NOTE: Using this with the time zones to use the view named "v_lu_time_zone_cust" use_alt_tbl: true, // NOTE: Using this with the time zones to use the view named "v_lu_time_zone_cust"
use_alt_mdl: false, use_alt_mdl: false,
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(function (time_zone_li_get_result) { .then(function (time_zone_li_get_result) {
if (time_zone_li_get_result) { if (time_zone_li_get_result) {
// handle_db_save_ae_obj_li__time_zone({obj_type: 'time_zone', obj_li: time_zone_li_get_result}); // handle_db_save_ae_obj_li__time_zone({obj_type: 'time_zone', obj_li: time_zone_li_get_result});
return time_zone_li_get_result; return time_zone_li_get_result;
} else { } else {
return []; return [];
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
console.log('ae_promises.load__time_zone_li:', ae_promises.load__time_zone_li); console.log('ae_promises.load__time_zone_li:', ae_promises.load__time_zone_li);
return ae_promises.load__time_zone_li; return ae_promises.load__time_zone_li;
} }

View File

@@ -7,272 +7,272 @@ const ae_promises: key_val = {};
// Updated 2025-04-04 // Updated 2025-04-04
export async function auth_ae_obj__username_password({ export async function auth_ae_obj__username_password({
api_cfg, api_cfg,
account_id, account_id,
null_account_id = false, null_account_id = false,
username, username,
password, password,
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
null_account_id?: boolean; null_account_id?: boolean;
username: string; username: string;
password: string; password: string;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** auth_ae_obj__username_password() *** account_id=${account_id} username=${username} password=${password}` `*** auth_ae_obj__username_password() *** account_id=${account_id} username=${username} password=${password}`
); );
} }
const endpoint = '/user/authenticate'; const endpoint = '/user/authenticate';
if (null_account_id) { if (null_account_id) {
params['null_account_id'] = true; params['null_account_id'] = true;
} }
params['username'] = username; // Required params['username'] = username; // Required
params['password'] = password; // Required params['password'] = password; // Required
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`auth_ae_obj__username_password() - params:`, params); console.log(`auth_ae_obj__username_password() - params:`, params);
} }
ae_promises.auth__username_password = await api ae_promises.auth__username_password = await api
.get_object({ .get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
// data: {}, // data: {},
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (user_obj_get_result) { .then(async function (user_obj_get_result) {
if (user_obj_get_result) { if (user_obj_get_result) {
// if (try_cache) { // if (try_cache) {
// // This is expecting a list // // This is expecting a list
// db_save_ae_obj_li__user({ // db_save_ae_obj_li__user({
// obj_type: 'user', // obj_type: 'user',
// obj_li: [user_obj_get_result], // obj_li: [user_obj_get_result],
// log_lvl: log_lvl // log_lvl: log_lvl
// }); // });
// } // }
return user_obj_get_result; return user_obj_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.auth__username_password:', ae_promises.auth__username_password); console.log('ae_promises.auth__username_password:', ae_promises.auth__username_password);
} }
return ae_promises.auth__username_password; return ae_promises.auth__username_password;
} }
// Updated 2025-04-04 // Updated 2025-04-04
export async function auth_ae_obj__user_id_user_auth_key({ export async function auth_ae_obj__user_id_user_auth_key({
api_cfg, api_cfg,
account_id, account_id,
user_id, user_id,
user_auth_key, user_auth_key,
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
user_id: string; user_id: string;
user_auth_key: string; user_auth_key: string;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** auth_ae_obj__user_id_user_auth_key() *** account_id=${account_id} user_id=${user_id}` `*** auth_ae_obj__user_id_user_auth_key() *** account_id=${account_id} user_id=${user_id}`
); );
} }
const endpoint = '/user/authenticate'; const endpoint = '/user/authenticate';
params['user_id'] = user_id; // Required params['user_id'] = user_id; // Required
params['auth_key'] = user_auth_key; // Required params['auth_key'] = user_auth_key; // Required
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`auth_ae_obj__user_id_user_auth_key() - params:`, params); console.log(`auth_ae_obj__user_id_user_auth_key() - params:`, params);
} }
ae_promises.auth__user_id_user_key = await api ae_promises.auth__user_id_user_key = await api
.get_object({ .get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (user_obj_get_result) { .then(async function (user_obj_get_result) {
if (user_obj_get_result) { if (user_obj_get_result) {
return user_obj_get_result; return user_obj_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.auth__user_id_user_key:', ae_promises.auth__user_id_user_key); console.log('ae_promises.auth__user_id_user_key:', ae_promises.auth__user_id_user_key);
} }
return ae_promises.auth__user_id_user_key; return ae_promises.auth__user_id_user_key;
} }
// Send an email to the user with a new one time use authentication key. The new key must be generated and returned first. // Send an email to the user with a new one time use authentication key. The new key must be generated and returned first.
// Updated 2025-04-08 // Updated 2025-04-08
export async function send_email_auth_ae_obj__user_id({ export async function send_email_auth_ae_obj__user_id({
api_cfg, api_cfg,
account_id, account_id,
user_id, user_id,
base_url, base_url,
key_param_name = 'user_key', // API defaults to 'auth_key' key_param_name = 'user_key', // API defaults to 'auth_key'
params = {}, params = {},
// try_cache = true, // try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
user_id: string; user_id: string;
base_url?: string; base_url?: string;
key_param_name?: string; key_param_name?: string;
params?: key_val; params?: key_val;
// try_cache?: boolean, // try_cache?: boolean,
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** send_email_auth_ae_obj__user_id() *** account_id=${account_id} user_id=${user_id}` `*** send_email_auth_ae_obj__user_id() *** account_id=${account_id} user_id=${user_id}`
); );
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(api_cfg); console.log(api_cfg);
} }
const email_auth_key_endpoint = `user/${user_id}/email_auth_key_url`; const email_auth_key_endpoint = `user/${user_id}/email_auth_key_url`;
params = { params = {
root_url: base_url, root_url: base_url,
key_param_name: key_param_name key_param_name: key_param_name
}; };
ae_promises.auth_key__send_email = await api.get_object({ ae_promises.auth_key__send_email = await api.get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: email_auth_key_endpoint, endpoint: email_auth_key_endpoint,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}); });
return ae_promises.auth_key__send_email; return ae_promises.auth_key__send_email;
// let endpoint = `/user/${user_id}/new_auth_key`; // let endpoint = `/user/${user_id}/new_auth_key`;
// // params['user_id'] = user_id; // Required // // params['user_id'] = user_id; // Required
// if (log_lvl > 1) { // if (log_lvl > 1) {
// console.log(`send_email_auth_ae_obj__user_id() - params:`, params); // console.log(`send_email_auth_ae_obj__user_id() - params:`, params);
// } // }
// ae_promises.auth_key__gen_auth_key = await api.get_object({ // ae_promises.auth_key__gen_auth_key = await api.get_object({
// api_cfg: api_cfg, // api_cfg: api_cfg,
// endpoint: endpoint, // endpoint: endpoint,
// params: params, // params: params,
// log_lvl: log_lvl // log_lvl: log_lvl
// }) // })
// .then(async function (email_send_result) { // .then(async function (email_send_result) {
// if (email_send_result) { // if (email_send_result) {
// let email_auth_key_endpoint = `user/${user_id}/email_auth_key_url`; // let email_auth_key_endpoint = `user/${user_id}/email_auth_key_url`;
// params = { // params = {
// 'root_url': 'https://test.oneskyit.com' // 'root_url': 'https://test.oneskyit.com'
// } // }
// ae_promises.auth_key__send_email = await api.get_object({ // ae_promises.auth_key__send_email = await api.get_object({
// api_cfg: api_cfg, // api_cfg: api_cfg,
// endpoint: email_auth_key_endpoint, // endpoint: email_auth_key_endpoint,
// params: params, // params: params,
// log_lvl: log_lvl // log_lvl: log_lvl
// }) // })
// return email_send_result; // return email_send_result;
// } else { // } else {
// console.log('No results returned.'); // console.log('No results returned.');
// return null; // return null;
// } // }
// }) // })
// .catch(function (error: any) { // .catch(function (error: any) {
// console.log('No results returned or failed.', error); // console.log('No results returned or failed.', error);
// }); // });
// if (log_lvl) { // if (log_lvl) {
// console.log('ae_promises.send_email_auth__user_id:', ae_promises.send_email_auth__user_id); // console.log('ae_promises.send_email_auth__user_id:', ae_promises.send_email_auth__user_id);
// } // }
// return ae_promises.send_email_auth__user_id; // return ae_promises.send_email_auth__user_id;
} }
// Look up user based on email address provided // Look up user based on email address provided
// Updated 2025-04-08 // Updated 2025-04-08
export async function qry_ae_obj_li__user_email({ export async function qry_ae_obj_li__user_email({
api_cfg, api_cfg,
account_id, account_id,
null_account_id = false, null_account_id = false,
email, email,
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
null_account_id?: boolean; null_account_id?: boolean;
email: string; email: string;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** qry_ae_obj_li__user_email() *** account_id=${account_id} email=${email}`); console.log(`*** qry_ae_obj_li__user_email() *** account_id=${account_id} email=${email}`);
} }
const endpoint = '/user/lookup_email'; const endpoint = '/user/lookup_email';
params['email'] = email; // Required params['email'] = email; // Required
params['null_account_id'] = null_account_id || false; params['null_account_id'] = null_account_id || false;
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`qry_ae_obj_li__user_email() - params:`, params); console.log(`qry_ae_obj_li__user_email() - params:`, params);
} }
ae_promises.qry__user_email = await api ae_promises.qry__user_email = await api
.get_object({ .get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (user_obj_get_result) { .then(async function (user_obj_get_result) {
if (user_obj_get_result) { if (user_obj_get_result) {
return user_obj_get_result; return user_obj_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.qry__user_email:', ae_promises.qry__user_email); console.log('ae_promises.qry__user_email:', ae_promises.qry__user_email);
} }
return ae_promises.qry__user_email; return ae_promises.qry__user_email;
} }
// Change user password // Change user password
@@ -281,55 +281,55 @@ export async function qry_ae_obj_li__user_email({
// data_kv: password (the new password) // data_kv: password (the new password)
// Updated 2025-04-11 // Updated 2025-04-11
export async function auth_ae_obj__user_id_change_password({ export async function auth_ae_obj__user_id_change_password({
api_cfg, api_cfg,
account_id, account_id,
user_id, user_id,
password, password,
params = {}, params = {},
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
user_id: string; user_id: string;
password: string; password: string;
params?: key_val; params?: key_val;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** auth_ae_obj__user_id_change_password() *** account_id=${account_id} user_id=${user_id}` `*** auth_ae_obj__user_id_change_password() *** account_id=${account_id} user_id=${user_id}`
); );
} }
const endpoint = `/user/${user_id}/change_password`; const endpoint = `/user/${user_id}/change_password`;
params['user_id'] = user_id; // Required params['user_id'] = user_id; // Required
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`auth_ae_obj__user_id_change_password() - params:`, params); console.log(`auth_ae_obj__user_id_change_password() - params:`, params);
} }
ae_promises.change_password__user_id = await api ae_promises.change_password__user_id = await api
.patch_object({ .patch_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
data: { password: password }, data: { password: password },
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (change_password_result) { .then(async function (change_password_result) {
if (change_password_result) { if (change_password_result) {
return change_password_result; return change_password_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.change_password__user_id:', ae_promises.change_password__user_id); console.log('ae_promises.change_password__user_id:', ae_promises.change_password__user_id);
} }
return ae_promises.change_password__user_id; return ae_promises.change_password__user_id;
} }

View File

@@ -5,143 +5,143 @@ import Dexie, { type Table } from 'dexie';
// Updated 2025-01-07 // Updated 2025-01-07
export interface File { export interface File {
id: string; id: string;
id_random: string; id_random: string;
hosted_file_id: string; hosted_file_id: string;
hosted_file_id_random: string; hosted_file_id_random: string;
hash_sha256: string; hash_sha256: string;
for_type?: string; for_type?: string;
for_id?: string; for_id?: string;
for_id_random?: string; for_id_random?: string;
account_id: string; account_id: string;
filename: string; filename: string;
extension: string; extension: string;
content_type: string; content_type: string;
size: number; // In bytes size: number; // In bytes
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
filename_no_ext: string; filename_no_ext: string;
filename_w_ext: string; filename_w_ext: string;
} }
// Updated 2024-07-17 // Updated 2024-07-17
export interface Person { export interface Person {
id: string; id: string;
// id_random: string; // id_random: string;
person_id: string; person_id: string;
person_id_random: string; person_id_random: string;
external_id?: string; // This may be semi-random or unique only withing the account. external_id?: string; // This may be semi-random or unique only withing the account.
external_sys_id?: string; // Generated by an external system. Ideally this should be something like a UUID. It may be the same as the external_id if nothing given. external_sys_id?: string; // Generated by an external system. Ideally this should be something like a UUID. It may be the same as the external_id if nothing given.
code?: string; // Not currently used. code?: string; // Not currently used.
account_id?: string; // Technically this is not required for global users. account_id?: string; // Technically this is not required for global users.
account_id_random?: string; // Technically this is not required for global users. account_id_random?: string; // Technically this is not required for global users.
person_profile_id?: null | string; person_profile_id?: null | string;
person_profile_id_random?: null | string; // The new table person_profile will be used soon... person_profile_id_random?: null | string; // The new table person_profile will be used soon...
user_id?: string; user_id?: string;
user_id_random?: string; user_id_random?: string;
pronouns?: null | string; pronouns?: null | string;
informal_name?: null | string; informal_name?: null | string;
title_names?: null | string; title_names?: null | string;
given_name: string; given_name: string;
middle_name?: null | string; middle_name?: null | string;
family_name: null | string; family_name: null | string;
designations?: null | string; designations?: null | string;
professional_title?: null | string; professional_title?: null | string;
full_name?: string; full_name?: string;
full_name_override?: null | string; // was called display_name full_name_override?: null | string; // was called display_name
affiliations?: null | string; affiliations?: null | string;
primary_email?: string; primary_email?: string;
biography?: null | string; biography?: null | string;
agree?: null | boolean; agree?: null | boolean;
comments?: null | string; comments?: null | string;
allow_auth_key?: null | boolean; // For sign in without password allow_auth_key?: null | boolean; // For sign in without password
auth_key?: null | string; // Should this be saved locally? auth_key?: null | string; // Should this be saved locally?
passcode?: null | string; passcode?: null | string;
data_json?: null | string; data_json?: null | string;
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
tmp_sort_3?: null | string; tmp_sort_3?: null | string;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
username?: string; // Same as user_username username?: string; // Same as user_username
// user_username?: null|string; // Same as username // user_username?: null|string; // Same as username
user_name?: null | string; user_name?: null | string;
user_email?: null | string; user_email?: null | string;
user_allow_auth_key?: null | boolean; // For sign in without password user_allow_auth_key?: null | boolean; // For sign in without password
user_super?: boolean; user_super?: boolean;
user_manager?: boolean; user_manager?: boolean;
user_administrator?: boolean; user_administrator?: boolean;
user_public?: boolean; user_public?: boolean;
organization_id?: null | string; // The organization this person belongs to, if any. organization_id?: null | string; // The organization this person belongs to, if any.
organization_id_random?: null | string; // The random ID of the organization this person belongs to, if any. organization_id_random?: null | string; // The random ID of the organization this person belongs to, if any.
organization_name?: null | string; organization_name?: null | string;
contact_id?: null | string; // The contact ID of the person, if any. contact_id?: null | string; // The contact ID of the person, if any.
contact_id_random?: null | string; // The random ID of the contact, if any. contact_id_random?: null | string; // The random ID of the contact, if any.
contact_name?: null | string; contact_name?: null | string;
contact_email?: null | string; contact_email?: null | string;
contact_cc_email?: null | string; contact_cc_email?: null | string;
contact_phone_mobile?: null | string; contact_phone_mobile?: null | string;
contact_phone_home?: null | string; contact_phone_home?: null | string;
contact_phone_office?: null | string; contact_phone_office?: null | string;
contact_phone_landline?: null | string; contact_phone_landline?: null | string;
contact_phone_fax?: null | string; contact_phone_fax?: null | string;
contact_phone_other?: null | string; contact_phone_other?: null | string;
address_id?: null | string; // The address ID of the person, if any. address_id?: null | string; // The address ID of the person, if any.
address_id_random?: null | string; // The random ID of the address, if any. address_id_random?: null | string; // The random ID of the address, if any.
address_city?: null | string; address_city?: null | string;
address_country_alpha_2_code?: null | string; // ISO 3166-1 alpha-2 country code address_country_alpha_2_code?: null | string; // ISO 3166-1 alpha-2 country code
} }
// Updated 2025-01-07 // Updated 2025-01-07
export class MySubClassedDexie extends Dexie { export class MySubClassedDexie extends Dexie {
file!: Table<File>; file!: Table<File>;
person!: Table<Person>; person!: Table<Person>;
// user!: Table<User>; // user!: Table<User>;
constructor() { constructor() {
super('ae_core_db'); super('ae_core_db');
this.version(1).stores({ this.version(1).stores({
file: ` file: `
id, id_random, hosted_file_id, hosted_file_id_random, id, id_random, hosted_file_id, hosted_file_id_random,
hash_sha256, hash_sha256,
account_id, account_id,
@@ -150,7 +150,7 @@ export class MySubClassedDexie extends Dexie {
content_type, size, content_type, size,
enable, hide, priority, sort, group, created_on, updated_on`, enable, hide, priority, sort, group, created_on, updated_on`,
person: ` person: `
id, person_id, person_id_random, id, person_id, person_id_random,
external_id, code, external_id, code,
account_id, user_id, account_id, user_id,
@@ -161,8 +161,8 @@ export class MySubClassedDexie extends Dexie {
full_name, affiliations, email, full_name, affiliations, email,
agree, agree,
enable, hide, priority, sort, group, created_on, updated_on` enable, hide, priority, sort, group, created_on, updated_on`
}); });
} }
} }
export const db_core = new MySubClassedDexie(); export const db_core = new MySubClassedDexie();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -7,14 +7,14 @@ import * as event_device from '$lib/ae_events/ae_events__event_device';
import * as event_file from '$lib/ae_events/ae_events__event_file'; import * as event_file from '$lib/ae_events/ae_events__event_file';
import { import {
load_ae_obj_id__exhibit, load_ae_obj_id__exhibit,
load_ae_obj_li__exhibit, load_ae_obj_li__exhibit,
load_ae_obj_id__exhibit_tracking, load_ae_obj_id__exhibit_tracking,
load_ae_obj_li__exhibit_tracking, load_ae_obj_li__exhibit_tracking,
create_ae_obj__exhibit_tracking, create_ae_obj__exhibit_tracking,
update_ae_obj__exhibit_tracking, update_ae_obj__exhibit_tracking,
download_export__event_exhibit_tracking download_export__event_exhibit_tracking
// db_save_ae_obj_li__exhibitor, // db_save_ae_obj_li__exhibitor,
} from '$lib/ae_events/ae_events__exhibit'; } from '$lib/ae_events/ae_events__exhibit';
import * as event_location from '$lib/ae_events/ae_events__event_location'; import * as event_location from '$lib/ae_events/ae_events__event_location';
@@ -30,102 +30,102 @@ import * as event_badge from '$lib/ae_events/ae_events__event_badge';
import * as event_badge_template from '$lib/ae_events/ae_events__event_badge_template'; import * as event_badge_template from '$lib/ae_events/ae_events__event_badge_template';
const export_obj = { const export_obj = {
// Events // Events
load_ae_obj_id__event: event.load_ae_obj_id__event, load_ae_obj_id__event: event.load_ae_obj_id__event,
load_ae_obj_li__event: event.load_ae_obj_li__event, load_ae_obj_li__event: event.load_ae_obj_li__event,
qry_ae_obj_li__event: event.qry_ae_obj_li__event, qry_ae_obj_li__event: event.qry_ae_obj_li__event,
create_ae_obj__event: event.create_ae_obj__event, create_ae_obj__event: event.create_ae_obj__event,
delete_ae_obj_id__event: event.delete_ae_obj_id__event, delete_ae_obj_id__event: event.delete_ae_obj_id__event,
update_ae_obj__event: event.update_ae_obj__event, update_ae_obj__event: event.update_ae_obj__event,
// db_save_ae_obj_li__event: event.db_save_ae_obj_li__event, // db_save_ae_obj_li__event: event.db_save_ae_obj_li__event,
sync_config__event_pres_mgmt: event.sync_config__event_pres_mgmt, sync_config__event_pres_mgmt: event.sync_config__event_pres_mgmt,
// Event Badges // Event Badges
load_ae_obj_id__event_badge: event_badge.load_ae_obj_id__event_badge, load_ae_obj_id__event_badge: event_badge.load_ae_obj_id__event_badge,
load_ae_obj_li__event_badge: event_badge.load_ae_obj_li__event_badge, load_ae_obj_li__event_badge: event_badge.load_ae_obj_li__event_badge,
create_ae_obj__event_badge: event_badge.create_ae_obj__event_badge, create_ae_obj__event_badge: event_badge.create_ae_obj__event_badge,
delete_ae_obj_id__event_badge: event_badge.delete_ae_obj_id__event_badge, delete_ae_obj_id__event_badge: event_badge.delete_ae_obj_id__event_badge,
update_ae_obj__event_badge: event_badge.update_ae_obj__event_badge, update_ae_obj__event_badge: event_badge.update_ae_obj__event_badge,
qry__event_badge: event_badge.qry__event_badge, qry__event_badge: event_badge.qry__event_badge,
search__event_badge: event_badge.search__event_badge, search__event_badge: event_badge.search__event_badge,
// handle_load_ae_obj_id__badge: event_badge.handle_load_ae_obj_id__badge, // handle_load_ae_obj_id__badge: event_badge.handle_load_ae_obj_id__badge,
// handle_load_ae_obj_li__badge: event_badge.handle_load_ae_obj_li__badge, // handle_load_ae_obj_li__badge: event_badge.handle_load_ae_obj_li__badge,
// handle_search__event_badge: event_badge.handle_search__event_badge, // handle_search__event_badge: event_badge.handle_search__event_badge,
// db_save_ae_obj_li__event_badge: event_badge.db_save_ae_obj_li__event_badge, // db_save_ae_obj_li__event_badge: event_badge.db_save_ae_obj_li__event_badge,
// Event Badge Templates // Event Badge Templates
load_ae_obj_id__event_badge_template: event_badge_template.load_ae_obj_id__event_badge_template, load_ae_obj_id__event_badge_template: event_badge_template.load_ae_obj_id__event_badge_template,
load_ae_obj_li__event_badge_template: event_badge_template.load_ae_obj_li__event_badge_template, load_ae_obj_li__event_badge_template: event_badge_template.load_ae_obj_li__event_badge_template,
create_ae_obj__event_badge_template: event_badge_template.create_ae_obj__event_badge_template, create_ae_obj__event_badge_template: event_badge_template.create_ae_obj__event_badge_template,
delete_ae_obj_id__event_badge_template: delete_ae_obj_id__event_badge_template:
event_badge_template.delete_ae_obj_id__event_badge_template, event_badge_template.delete_ae_obj_id__event_badge_template,
update_ae_obj__event_badge_template: event_badge_template.update_ae_obj__event_badge_template, update_ae_obj__event_badge_template: event_badge_template.update_ae_obj__event_badge_template,
search__event_badge_template: event_badge_template.search__event_badge_template, search__event_badge_template: event_badge_template.search__event_badge_template,
// Event Devices // Event Devices
load_ae_obj_id__event_device: event_device.load_ae_obj_id__event_device, load_ae_obj_id__event_device: event_device.load_ae_obj_id__event_device,
load_ae_obj_li__event_device: event_device.load_ae_obj_li__event_device, load_ae_obj_li__event_device: event_device.load_ae_obj_li__event_device,
create_ae_obj__event_device: event_device.create_ae_obj__event_device, create_ae_obj__event_device: event_device.create_ae_obj__event_device,
delete_ae_obj_id__event_device: event_device.delete_ae_obj_id__event_device, delete_ae_obj_id__event_device: event_device.delete_ae_obj_id__event_device,
update_ae_obj__event_device: event_device.update_ae_obj__event_device, update_ae_obj__event_device: event_device.update_ae_obj__event_device,
// db_save_ae_obj_li__event_device: event_device.db_save_ae_obj_li__event_device, // db_save_ae_obj_li__event_device: event_device.db_save_ae_obj_li__event_device,
// Event Exhibits // Event Exhibits
handle_load_ae_obj_id__exhibit: load_ae_obj_id__exhibit, handle_load_ae_obj_id__exhibit: load_ae_obj_id__exhibit,
handle_load_ae_obj_li__exhibit: load_ae_obj_li__exhibit, handle_load_ae_obj_li__exhibit: load_ae_obj_li__exhibit,
handle_load_ae_obj_id__exhibit_tracking: load_ae_obj_id__exhibit_tracking, handle_load_ae_obj_id__exhibit_tracking: load_ae_obj_id__exhibit_tracking,
handle_load_ae_obj_li__exhibit_tracking: load_ae_obj_li__exhibit_tracking, handle_load_ae_obj_li__exhibit_tracking: load_ae_obj_li__exhibit_tracking,
handle_create_ae_obj__exhibit_tracking: create_ae_obj__exhibit_tracking, handle_create_ae_obj__exhibit_tracking: create_ae_obj__exhibit_tracking,
handle_update_ae_obj__exhibit_tracking: update_ae_obj__exhibit_tracking, handle_update_ae_obj__exhibit_tracking: update_ae_obj__exhibit_tracking,
handle_download_export__event_exhibit_tracking: download_export__event_exhibit_tracking, handle_download_export__event_exhibit_tracking: download_export__event_exhibit_tracking,
// handle_db_save_ae_obj_li__exhibitor: db_save_ae_obj_li__exhibitor, // handle_db_save_ae_obj_li__exhibitor: db_save_ae_obj_li__exhibitor,
// Event Files // Event Files
load_ae_obj_id__event_file: event_file.load_ae_obj_id__event_file, load_ae_obj_id__event_file: event_file.load_ae_obj_id__event_file,
load_ae_obj_li__event_file: event_file.load_ae_obj_li__event_file, load_ae_obj_li__event_file: event_file.load_ae_obj_li__event_file,
create_event_file_obj_from_hosted_file_async: create_event_file_obj_from_hosted_file_async:
event_file.create_event_file_obj_from_hosted_file_async, event_file.create_event_file_obj_from_hosted_file_async,
delete_ae_obj_id__event_file: event_file.delete_ae_obj_id__event_file, delete_ae_obj_id__event_file: event_file.delete_ae_obj_id__event_file,
update_ae_obj__event_file: event_file.update_ae_obj__event_file, update_ae_obj__event_file: event_file.update_ae_obj__event_file,
qry__event_file: event_file.qry__event_file, qry__event_file: event_file.qry__event_file,
search__event_file: event_file.search__event_file, search__event_file: event_file.search__event_file,
// db_save_ae_obj_li__event_file: event_file.db_save_ae_obj_li__event_file, // db_save_ae_obj_li__event_file: event_file.db_save_ae_obj_li__event_file,
// Event Locations // Event Locations
load_ae_obj_id__event_location: event_location.load_ae_obj_id__event_location, load_ae_obj_id__event_location: event_location.load_ae_obj_id__event_location,
load_ae_obj_li__event_location: event_location.load_ae_obj_li__event_location, load_ae_obj_li__event_location: event_location.load_ae_obj_li__event_location,
create_ae_obj__event_location: event_location.create_ae_obj__event_location, create_ae_obj__event_location: event_location.create_ae_obj__event_location,
delete_ae_obj_id__event_location: event_location.delete_ae_obj_id__event_location, delete_ae_obj_id__event_location: event_location.delete_ae_obj_id__event_location,
update_ae_obj__event_location: event_location.update_ae_obj__event_location, update_ae_obj__event_location: event_location.update_ae_obj__event_location,
// db_save_ae_obj_li__event_location: event_location.db_save_ae_obj_li__event_location, // db_save_ae_obj_li__event_location: event_location.db_save_ae_obj_li__event_location,
// Event Sessions // Event Sessions
load_ae_obj_id__event_session: event_session.load_ae_obj_id__event_session, load_ae_obj_id__event_session: event_session.load_ae_obj_id__event_session,
load_ae_obj_li__event_session: event_session.load_ae_obj_li__event_session, load_ae_obj_li__event_session: event_session.load_ae_obj_li__event_session,
create_ae_obj__event_session: event_session.create_ae_obj__event_session, create_ae_obj__event_session: event_session.create_ae_obj__event_session,
delete_ae_obj_id__event_session: event_session.delete_ae_obj_id__event_session, delete_ae_obj_id__event_session: event_session.delete_ae_obj_id__event_session,
update_ae_obj__event_session: event_session.update_ae_obj__event_session, update_ae_obj__event_session: event_session.update_ae_obj__event_session,
qry__event_session: event_session.qry__event_session, qry__event_session: event_session.qry__event_session,
search__event_session: event_session.search__event_session, search__event_session: event_session.search__event_session,
email_sign_in__event_session: event_session.email_sign_in__event_session, email_sign_in__event_session: event_session.email_sign_in__event_session,
// db_save_ae_obj_li__event_session: event_session.db_save_ae_obj_li__event_session, // db_save_ae_obj_li__event_session: event_session.db_save_ae_obj_li__event_session,
// Event Presentations // Event Presentations
load_ae_obj_id__event_presentation: event_presentation.load_ae_obj_id__event_presentation, load_ae_obj_id__event_presentation: event_presentation.load_ae_obj_id__event_presentation,
load_ae_obj_li__event_presentation: event_presentation.load_ae_obj_li__event_presentation, load_ae_obj_li__event_presentation: event_presentation.load_ae_obj_li__event_presentation,
create_ae_obj__event_presentation: event_presentation.create_ae_obj__event_presentation, create_ae_obj__event_presentation: event_presentation.create_ae_obj__event_presentation,
delete_ae_obj_id__event_presentation: event_presentation.delete_ae_obj_id__event_presentation, delete_ae_obj_id__event_presentation: event_presentation.delete_ae_obj_id__event_presentation,
update_ae_obj__event_presentation: event_presentation.update_ae_obj__event_presentation, update_ae_obj__event_presentation: event_presentation.update_ae_obj__event_presentation,
// db_save_ae_obj_li__event_presentation: event_presentation.db_save_ae_obj_li__event_presentation, // db_save_ae_obj_li__event_presentation: event_presentation.db_save_ae_obj_li__event_presentation,
// Event Presenters // Event Presenters
load_ae_obj_id__event_presenter: event_presenter.load_ae_obj_id__event_presenter, load_ae_obj_id__event_presenter: event_presenter.load_ae_obj_id__event_presenter,
load_ae_obj_li__event_presenter: event_presenter.load_ae_obj_li__event_presenter, load_ae_obj_li__event_presenter: event_presenter.load_ae_obj_li__event_presenter,
create_ae_obj__event_presenter: event_presenter.create_ae_obj__event_presenter, create_ae_obj__event_presenter: event_presenter.create_ae_obj__event_presenter,
delete_ae_obj_id__event_presenter: event_presenter.delete_ae_obj_id__event_presenter, delete_ae_obj_id__event_presenter: event_presenter.delete_ae_obj_id__event_presenter,
update_ae_obj__event_presenter: event_presenter.update_ae_obj__event_presenter, update_ae_obj__event_presenter: event_presenter.update_ae_obj__event_presenter,
search__event_presenter: event_presenter.search__event_presenter, search__event_presenter: event_presenter.search__event_presenter,
// db_save_ae_obj_li__event_presenter: event_presenter.db_save_ae_obj_li__event_presenter, // db_save_ae_obj_li__event_presenter: event_presenter.db_save_ae_obj_li__event_presenter,
email_sign_in__event_presenter: event_presenter.email_sign_in__event_presenter email_sign_in__event_presenter: event_presenter.email_sign_in__event_presenter
}; };
export const events_func = export_obj; export const events_func = export_obj;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,18 +4,18 @@ import * as journal from '$lib/ae_journals/ae_journals__journal';
import * as journal_entry from '$lib/ae_journals/ae_journals__journal_entry'; import * as journal_entry from '$lib/ae_journals/ae_journals__journal_entry';
const export_obj = { const export_obj = {
load_ae_obj_id__journal: journal.load_ae_obj_id__journal, load_ae_obj_id__journal: journal.load_ae_obj_id__journal,
load_ae_obj_li__journal: journal.load_ae_obj_li__journal, load_ae_obj_li__journal: journal.load_ae_obj_li__journal,
create_ae_obj__journal: journal.create_ae_obj__journal, create_ae_obj__journal: journal.create_ae_obj__journal,
delete_ae_obj_id__journal: journal.delete_ae_obj_id__journal, delete_ae_obj_id__journal: journal.delete_ae_obj_id__journal,
update_ae_obj__journal: journal.update_ae_obj__journal, update_ae_obj__journal: journal.update_ae_obj__journal,
// db_save_ae_obj_li__journal: journal.db_save_ae_obj_li__journal, // db_save_ae_obj_li__journal: journal.db_save_ae_obj_li__journal,
load_ae_obj_id__journal_entry: journal_entry.load_ae_obj_id__journal_entry, load_ae_obj_id__journal_entry: journal_entry.load_ae_obj_id__journal_entry,
load_ae_obj_li__journal_entry: journal_entry.load_ae_obj_li__journal_entry, load_ae_obj_li__journal_entry: journal_entry.load_ae_obj_li__journal_entry,
create_ae_obj__journal_entry: journal_entry.create_ae_obj__journal_entry, create_ae_obj__journal_entry: journal_entry.create_ae_obj__journal_entry,
delete_ae_obj_id__journal_entry: journal_entry.delete_ae_obj_id__journal_entry, delete_ae_obj_id__journal_entry: journal_entry.delete_ae_obj_id__journal_entry,
update_ae_obj__journal_entry: journal_entry.update_ae_obj__journal_entry, update_ae_obj__journal_entry: journal_entry.update_ae_obj__journal_entry,
qry__journal_entry: journal_entry.qry__journal_entry qry__journal_entry: journal_entry.qry__journal_entry
// db_save_ae_obj_li__journal_entry: journal_entry.db_save_ae_obj_li__journal_entry, // db_save_ae_obj_li__journal_entry: journal_entry.db_save_ae_obj_li__journal_entry,
}; };
export const journals_func = export_obj; export const journals_func = export_obj;

View File

@@ -9,88 +9,88 @@ import type { key_val } from '$lib/stores/ae_stores';
// This is for longer term or sticky app data. This should be stored to *local* storage. // This is for longer term or sticky app data. This should be stored to *local* storage.
// Updated 2025-03-20 // Updated 2025-03-20
const journals_local_data_struct: key_val = { const journals_local_data_struct: key_val = {
ver: '2024-08-20_19', ver: '2024-08-20_19',
// Shared // Shared
name: 'Aether - Journals (SvelteKit 2.x Svelte 5.x)', name: 'Aether - Journals (SvelteKit 2.x Svelte 5.x)',
title: `OSIT's Æ Journals`, // &AElig; title: `OSIT's Æ Journals`, // &AElig;
mode__edit: false, mode__edit: false,
mode__debug: false, mode__debug: false,
datetime_format: 'datetime_12_long', datetime_format: 'datetime_12_long',
time_format: 'time_12_short', time_format: 'time_12_short',
time_hours: 12, // 12 or 24 time_hours: 12, // 12 or 24
qry__enabled: 'enabled', // all, disabled, enabled qry__enabled: 'enabled', // all, disabled, enabled
qry__hidden: 'not_hidden', // all, hidden, not_hidden qry__hidden: 'not_hidden', // all, hidden, not_hidden
qry__limit: 20, qry__limit: 20,
qry__order_by_li: { qry__order_by_li: {
// 'created_on': 'desc', // 'created_on': 'desc',
// 'updated_on': 'desc', // 'updated_on': 'desc',
}, },
qry__offset: 0, qry__offset: 0,
qry__journal_id: null, qry__journal_id: null,
journal_view_history_li: [], // Appended each time the journal is loaded. journal_view_history_li: [], // Appended each time the journal is loaded.
entry_view_history_li: [], // NO LONGER USED: Appended each time the entry is loaded. entry_view_history_li: [], // NO LONGER USED: Appended each time the entry is loaded.
entry_view_history_kv: {}, // Keyed by journal_entry_id for quick lookup. entry_view_history_kv: {}, // Keyed by journal_entry_id for quick lookup.
entry_view_history_max: 15, // Maximum number of journal entries to keep in history. entry_view_history_max: 15, // Maximum number of journal entries to keep in history.
llm__api_base_url: 'https://ai.dgrzone.com/api', llm__api_base_url: 'https://ai.dgrzone.com/api',
llm__api_model: 'dgrzone-deepseek-8b-quick', llm__api_model: 'dgrzone-deepseek-8b-quick',
llm__api_token: llm__api_token:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVhYjI2MzdlLThiMjktNGM2Zi05MzVhLWFkYjU1MDkwMGU5MCJ9.VObfR91GrX3j1vHbHZqGsOWEyrL981cbSWWjaXfYbUQ', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVhYjI2MzdlLThiMjktNGM2Zi05MzVhLWFkYjU1MDkwMGU5MCJ9.VObfR91GrX3j1vHbHZqGsOWEyrL981cbSWWjaXfYbUQ',
llm__api_dangerous_browser: false, // This allows for use of localhost. llm__api_dangerous_browser: false, // This allows for use of localhost.
llm__stream: false, // Whether to use streaming or not. Not all APIs support this. llm__stream: false, // Whether to use streaming or not. Not all APIs support this.
llm__timeout_ms: 60000, // 60 seconds llm__timeout_ms: 60000, // 60 seconds
llm__max_retries: 3, // Number of times to retry a failed LLM API call. llm__max_retries: 3, // Number of times to retry a failed LLM API call.
llm__retry_delay_ms: 2000, // 2 seconds between retries. llm__retry_delay_ms: 2000, // 2 seconds between retries.
llm__system_prompt: 'You are a helpful assistant that helps people find information.', llm__system_prompt: 'You are a helpful assistant that helps people find information.',
llm__max_tokens: 1024, llm__max_tokens: 1024,
llm__temperature: 0.7, llm__temperature: 0.7,
llm__top_p: 1.0, llm__top_p: 1.0,
llm__n: 1, llm__n: 1,
llm__frequency_penalty: 0.0, llm__frequency_penalty: 0.0,
llm__presence_penalty: 0.0, llm__presence_penalty: 0.0,
journal: { journal: {
edit: false, edit: false,
edit_kv: {}, edit_kv: {},
type_code_li: [ type_code_li: [
{ code: 'diary', name: 'Diary' }, { code: 'diary', name: 'Diary' },
{ code: 'log', name: 'Log' }, { code: 'log', name: 'Log' },
{ code: 'journal', name: 'Journal' }, { code: 'journal', name: 'Journal' },
{ code: 'notebook', name: 'Notebook' }, { code: 'notebook', name: 'Notebook' },
{ code: 'personal', name: 'Personal' }, { code: 'personal', name: 'Personal' },
{ code: 'professional', name: 'Professional' }, { code: 'professional', name: 'Professional' },
{ code: 'tracking', name: 'Tracking' }, { code: 'tracking', name: 'Tracking' },
{ code: 'other', name: 'Other' }, { code: 'other', name: 'Other' },
{ code: 'test', name: 'Test' } { code: 'test', name: 'Test' }
// { code: 'notepad', name: 'Notepad' }, // { code: 'notepad', name: 'Notepad' },
] ]
}, },
entry: { entry: {
llm__system_prompt: llm__system_prompt:
'Summarize the following journal entry content in a concise manner, focusing on key points and insights.', 'Summarize the following journal entry content in a concise manner, focusing on key points and insights.',
llm__max_tokens: 512, llm__max_tokens: 512,
llm__temperature: 0.7, llm__temperature: 0.7,
llm__top_p: 1.0, llm__top_p: 1.0,
llm__n: 1, llm__n: 1,
llm__frequency_penalty: 0.0, llm__frequency_penalty: 0.0,
llm__presence_penalty: 0.0, llm__presence_penalty: 0.0,
edit: false, edit: false,
edit_kv: {} edit_kv: {}
} }
}; };
// console.log(`AE Stores - App Journals Local Storage Data:`, journals_local_data_struct); // console.log(`AE Stores - App Journals Local Storage Data:`, journals_local_data_struct);
// This works and uses *local* storage: // This works and uses *local* storage:
export const journals_loc: Writable<key_val> = persisted( export const journals_loc: Writable<key_val> = persisted(
'ae_journals_loc', 'ae_journals_loc',
journals_local_data_struct journals_local_data_struct
); );
// console.log(`AE Stores - App Local Storage Data:`, get(ae_loc)); // console.log(`AE Stores - App Local Storage Data:`, get(ae_loc));
@@ -98,47 +98,47 @@ export const journals_loc: Writable<key_val> = persisted(
// Temporary app data. This is lost if the page is refreshed or using different tabs/windows. This should be stored to *session* storage. // Temporary app data. This is lost if the page is refreshed or using different tabs/windows. This should be stored to *session* storage.
// Updated 2025-03-20 // Updated 2025-03-20
const journals_session_data_struct: key_val = { const journals_session_data_struct: key_val = {
ver: '2024-08-20_19', ver: '2024-08-20_19',
log_lvl: 1, log_lvl: 1,
// Shared Triggers // Shared Triggers
trigger: null, trigger: null,
trigger__journal_id: null, trigger__journal_id: null,
// trigger__journal_li: null, // trigger__journal_li: null,
show__modal__journals_config: false, show__modal__journals_config: false,
show__modal_edit__journal_obj: false, show__modal_edit__journal_obj: false,
show__modal_new__journal_obj: false, show__modal_new__journal_obj: false,
show__modal_view__journal_id: null, show__modal_view__journal_id: null,
show_list__journal_entry_li_group: true, show_list__journal_entry_li_group: true,
show__modal_view__journal_entry_id: null, show__modal_view__journal_entry_id: null,
show__modal_edit__journal_entry_id: null, show__modal_edit__journal_entry_id: null,
show__content__journal_entry_history: false, show__content__journal_entry_history: false,
journal: { journal: {
edit: false, edit: false,
edit_kv: {}, edit_kv: {},
new_journal_name: '', new_journal_name: '',
new_journal_type_code: '', new_journal_type_code: '',
tmp_obj: {} tmp_obj: {}
}, },
entry: { entry: {
show__ai_summary: false, show__ai_summary: false,
ai_summary: '', ai_summary: '',
decrypt_kv: {}, // Essentially flag that the entry (content and history) can be decrypted. decrypt_kv: {}, // Essentially flag that the entry (content and history) can be decrypted.
edit: false, edit: false,
edit_kv: {}, edit_kv: {},
tmp_obj: {} tmp_obj: {}
}, },
journal_kv: { journal_kv: {
// journal_id: {}, // journal_id: {},
} }
}; };
// console.log(`AE Stores - App Journals Session Storage Data:`, journals_session_data_struct); // console.log(`AE Stores - App Journals Session Storage Data:`, journals_session_data_struct);
export const journals_sess = writable(journals_session_data_struct); export const journals_sess = writable(journals_session_data_struct);
@@ -149,15 +149,15 @@ export const journals_sess = writable(journals_session_data_struct);
// Intended for temporary session storage. // Intended for temporary session storage.
// Updated 2024-08-20 // Updated 2024-08-20
const journals_slct_obj_template: key_val = { const journals_slct_obj_template: key_val = {
// Top level // Top level
journal_id: null, journal_id: null,
journal_obj: {}, journal_obj: {},
journal_obj_li: [], journal_obj_li: [],
tmp_journal_obj: {}, // Temporary object for new journal tmp_journal_obj: {}, // Temporary object for new journal
tmp_journal_entry_obj: {}, // Temporary object for new journal entry tmp_journal_entry_obj: {}, // Temporary object for new journal entry
lq__journal_obj: {} // Testing passing a LiveQuery object around... lq__journal_obj: {} // Testing passing a LiveQuery object around...
}; };
// console.log(`AE Stores - Selected Journals Objects:`, journals_slct_obj_template); // console.log(`AE Stores - Selected Journals Objects:`, journals_slct_obj_template);
@@ -168,8 +168,8 @@ export const journals_slct = writable(journals_slct_obj_template);
// Intended for temporary session storage. // Intended for temporary session storage.
// Updated 2025-03-16 // Updated 2025-03-16
const journals_trig_template: key_val = { const journals_trig_template: key_val = {
journal_id: false, journal_id: false,
journal_entry_li: false journal_entry_li: false
}; };
export const journals_trig: any = writable(journals_trig_template); export const journals_trig: any = writable(journals_trig_template);
// console.log(`AE Journals Stores - Journals Trigger:`, journals_trig); // console.log(`AE Journals Stores - Journals Trigger:`, journals_trig);
@@ -178,8 +178,8 @@ export const journals_trig: any = writable(journals_trig_template);
// Intended for temporary session storage. // Intended for temporary session storage.
// Updated 2025-03-16 // Updated 2025-03-16
const journals_prom_template: key_val = { const journals_prom_template: key_val = {
journal_id: false, journal_id: false,
journal_entry_li: false journal_entry_li: false
}; };
export const journals_prom: any = writable(journals_prom_template); export const journals_prom: any = writable(journals_prom_template);
// console.log(`AE Journals Stores - Journals Trigger:`, journals_prom); // console.log(`AE Journals Stores - Journals Trigger:`, journals_prom);

View File

@@ -10,509 +10,509 @@ import type { key_val } from '$lib/stores/ae_stores';
// Updated 2025-03-15 // Updated 2025-03-15
export interface Journal { export interface Journal {
id: string; // actually "id_random" id: string; // actually "id_random"
journal_id: string; journal_id: string;
// Essentially this is a change log of journals // Essentially this is a change log of journals
snapshot_id?: string; // This is the original journal ID. If deleted, then delete all children journals. snapshot_id?: string; // This is the original journal ID. If deleted, then delete all children journals.
previous_id?: null | string; // This is the old or parent journal ID previous_id?: null | string; // This is the old or parent journal ID
next_id?: null | string; // This is the new or child journal ID next_id?: null | string; // This is the new or child journal ID
external_id?: null | string; external_id?: null | string;
import_id?: null | string; import_id?: null | string;
code?: null | string; code?: null | string;
for_type?: null | string; for_type?: null | string;
for_id?: null | string; for_id?: null | string;
// template?: null|boolean; // Is this a template journal? If true, it can be used to create new journals. // template?: null|boolean; // Is this a template journal? If true, it can be used to create new journals.
type_code?: null | string; type_code?: null | string;
account_id?: null | string; // Owner account of the journal account_id?: null | string; // Owner account of the journal
person_id?: null | string; // Owner person of the journal person_id?: null | string; // Owner person of the journal
// event_id?: null|string; // Assign to an event??? // event_id?: null|string; // Assign to an event???
// location_id?: null|string; // Assign to a location??? // location_id?: null|string; // Assign to a location???
name: string; // or the title name: string; // or the title
short_name?: null | string; // Short name for the journal, if any. Used for display purposes. short_name?: null | string; // Short name for the journal, if any. Used for display purposes.
summary?: null | string; // LLM (AI) generated summary...??? summary?: null | string; // LLM (AI) generated summary...???
outline?: null | string; // LLM (AI) generated outline...??? outline?: null | string; // LLM (AI) generated outline...???
description?: null | string; description?: null | string;
description_md_html?: null | string; // Markdown converted to HTML based on description. Uses marked or similar library for conversion. description_md_html?: null | string; // Markdown converted to HTML based on description. Uses marked or similar library for conversion.
description_md_html_alt?: null | string; // Markdown converted to HTML based on description. Uses marked or similar library for conversion. description_md_html_alt?: null | string; // Markdown converted to HTML based on description. Uses marked or similar library for conversion.
description_html?: null | string; description_html?: null | string;
description_json?: null | string; description_json?: null | string;
start_datetime?: null | Date; start_datetime?: null | Date;
end_datetime?: null | Date; end_datetime?: null | Date;
timezone?: null | string; timezone?: null | string;
alert?: null | boolean; // LLM (AI) generated summary...??? alert?: null | boolean; // LLM (AI) generated summary...???
alert_msg?: null | string; // LLM (AI) generated summary...??? alert_msg?: null | string; // LLM (AI) generated summary...???
sort_by?: null | string; // This is the sort by field sort_by?: null | string; // This is the sort by field
sort_by_desc?: null | string; // This is the sort by field description sort_by_desc?: null | string; // This is the sort by field description
cfg_json?: null | key_val; // This is the configuration JSON for the journal cfg_json?: null | key_val; // This is the configuration JSON for the journal
data_json?: null | key_val; // We always need to store something extra... data_json?: null | key_val; // We always need to store something extra...
ux_mode?: null | string; // 'mobile' or 'desktop' ux_mode?: null | string; // 'mobile' or 'desktop'
// This only allows for basic access to the data. // This only allows for basic access to the data.
passcode_read?: null | string; // For LLM (AI) generated summary...??? passcode_read?: null | string; // For LLM (AI) generated summary...???
passcode_read_expire?: null | Date; passcode_read_expire?: null | Date;
passcode_write?: null | string; passcode_write?: null | string;
passcode_write_expire?: null | Date; passcode_write_expire?: null | Date;
passcode?: null | string; // For Journal Entry encryption password passcode?: null | string; // For Journal Entry encryption password
passcode_timeout?: null | number; // Timeout in seconds passcode_timeout?: null | number; // Timeout in seconds
private_passcode?: null | string; // Combine with the Journal passcode for Journal Entry encryption password private_passcode?: null | string; // Combine with the Journal passcode for Journal Entry encryption password
auth_key?: null | string; // For Journal authorization without sign in auth_key?: null | string; // For Journal authorization without sign in
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
archive?: null | boolean; // Archive the journal archive?: null | boolean; // Archive the journal
archive_on?: null | Date; archive_on?: null | Date;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
tmp_sort_3?: null | string; tmp_sort_3?: null | string;
combined_passcode?: null | string; // For Journal Entry encryption password combined_passcode?: null | string; // For Journal Entry encryption password
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
file_count?: null | number; // Only files directly under a journal file_count?: null | number; // Only files directly under a journal
journal_file_id_li_json?: null | string; journal_file_id_li_json?: null | string;
// One person // One person
person__given_name?: null | string; person__given_name?: null | string;
person__family_name?: null | string; person__family_name?: null | string;
person__full_name?: null | string; person__full_name?: null | string;
person__primary_email?: null | string; person__primary_email?: null | string;
person__passcode?: null | string; person__passcode?: null | string;
// JSON formatted key value pairs for multiple people: {id: name, email, etc.} // JSON formatted key value pairs for multiple people: {id: name, email, etc.}
person__kv_json?: null | string; person__kv_json?: null | string;
journal_name?: null | string; journal_name?: null | string;
journal_location_code?: null | string; journal_location_code?: null | string;
journal_location_name?: null | string; journal_location_name?: null | string;
journal_entry_count?: null | number; journal_entry_count?: null | number;
// A key value list of the entries // A key value list of the entries
journal_entry_kv?: null | key_val; journal_entry_kv?: null | key_val;
journal_entry_li?: null | []; journal_entry_li?: null | [];
// A key value list of the files // A key value list of the files
journal_file_kv?: null | key_val; journal_file_kv?: null | key_val;
journal_file_li?: null | []; journal_file_li?: null | [];
// journal_collection_id?: null|string; // For a collection of journals? // journal_collection_id?: null|string; // For a collection of journals?
// Future standard fields!!! // Future standard fields!!!
obj_id?: null | string; obj_id?: null | string;
obj_ext_uid?: null | string; // Probably not needed for journals obj_ext_uid?: null | string; // Probably not needed for journals
obj_ext_id?: null | string; // Probably not needed for journals obj_ext_id?: null | string; // Probably not needed for journals
obj_import_id?: null | string; // Probably not needed for journals obj_import_id?: null | string; // Probably not needed for journals
obj_code?: null | string; obj_code?: null | string;
obj_account_id?: null | string; obj_account_id?: null | string;
obj_passcode?: null | string; obj_passcode?: null | string;
obj_type?: null | string; // Should always be 'journal' in this case obj_type?: null | string; // Should always be 'journal' in this case
obj_type_ver_id?: null | string; // The ID from the table for the object type obj_type_ver_id?: null | string; // The ID from the table for the object type
obj_name?: null | string; obj_name?: null | string;
obj_summary?: null | string; // LLM (AI) generated summary...??? obj_summary?: null | string; // LLM (AI) generated summary...???
obj_outline?: null | string; // LLM (AI) generated outline...??? obj_outline?: null | string; // LLM (AI) generated outline...???
obj_description?: null | string; // Probably not needed for journals obj_description?: null | string; // Probably not needed for journals
obj_enable?: null | boolean; obj_enable?: null | boolean;
obj_enable_on?: null | Date; obj_enable_on?: null | Date;
obj_archive_on?: null | Date; obj_archive_on?: null | Date;
obj_hide?: null | boolean; obj_hide?: null | boolean;
obj_priority?: null | number; obj_priority?: null | number;
obj_sort?: null | number; obj_sort?: null | number;
obj_group?: null | string; obj_group?: null | string;
obj_cfg_json?: null | string; obj_cfg_json?: null | string;
obj_notes?: null | string; obj_notes?: null | string;
obj_created_on?: Date; obj_created_on?: Date;
obj_updated_on?: null | Date; obj_updated_on?: null | Date;
} }
export const journal_field_li = [ export const journal_field_li = [
'id', 'id',
'journal_id', 'journal_id',
'snapshot_id', 'snapshot_id',
'previous_id', 'previous_id',
'next_id', 'next_id',
'external_id', 'external_id',
'import_id', 'import_id',
'code', 'code',
'for_type', 'for_type',
'for_id', 'for_id',
'type_code', 'type_code',
'account_id', 'account_id',
'person_id', 'person_id',
'name', 'name',
'short_name', 'short_name',
'summary', 'summary',
'outline', 'outline',
'description', 'description',
'description_md_html', 'description_md_html',
'description_md_html_alt', 'description_md_html_alt',
'description_html', 'description_html',
'description_json', 'description_json',
'start_datetime', 'start_datetime',
'end_datetime', 'end_datetime',
'timezone', 'timezone',
'alert', 'alert',
'alert_msg', 'alert_msg',
'sort_by', 'sort_by',
'sort_by_desc', 'sort_by_desc',
'cfg_json', 'cfg_json',
'data_json', 'data_json',
'ux_mode', 'ux_mode',
'passcode_read', 'passcode_read',
'passcode_read_expire', 'passcode_read_expire',
'passcode_write', 'passcode_write',
'passcode_write_expire', 'passcode_write_expire',
'passcode_timeout', 'passcode_timeout',
'private_passcode', 'private_passcode',
'auth_key', 'auth_key',
'enable', 'enable',
'hide', 'hide',
'archive', // Archive the journal 'archive', // Archive the journal
'archive_on', // Archive date 'archive_on', // Archive date
'priority', // Priority flag 'priority', // Priority flag
'sort', // Sort order 'sort', // Sort order
'group', // Group name 'group', // Group name
'notes', // Notes about the journal 'notes', // Notes about the journal
'created_on', // Creation date 'created_on', // Creation date
'updated_on', // Last updated date 'updated_on', // Last updated date
'tmp_sort_1', // Temporary sort field 1 'tmp_sort_1', // Temporary sort field 1
'tmp_sort_2', // Temporary sort field 2 'tmp_sort_2', // Temporary sort field 2
'tmp_sort_3', // Temporary sort field 3 'tmp_sort_3', // Temporary sort field 3
'combined_passcode', // For Journal Entry encryption password 'combined_passcode', // For Journal Entry encryption password
'file_count', // Only files directly under a journal 'file_count', // Only files directly under a journal
'journal_file_id_li_json', // JSON string of file IDs 'journal_file_id_li_json', // JSON string of file IDs
'person__given_name', // Person's given name 'person__given_name', // Person's given name
'person__family_name', // Person's family name 'person__family_name', // Person's family name
'person__full_name', // Person's full name 'person__full_name', // Person's full name
'person__primary_email', // Person's primary email 'person__primary_email', // Person's primary email
'person__passcode', // Person's passcode 'person__passcode', // Person's passcode
'person__kv_json', // JSON formatted key value pairs for multiple people 'person__kv_json', // JSON formatted key value pairs for multiple people
'journal_name', // Journal name 'journal_name', // Journal name
'journal_location_code', // Journal location code 'journal_location_code', // Journal location code
'journal_location_name', // Journal location name 'journal_location_name', // Journal location name
'journal_entry_count', // Count of journal entries 'journal_entry_count', // Count of journal entries
'journal_entry_kv', // Key value list of the entries 'journal_entry_kv', // Key value list of the entries
'journal_entry_li', // List of journal entries 'journal_entry_li', // List of journal entries
'journal_file_kv', // Key value list of the files 'journal_file_kv', // Key value list of the files
'journal_file_li', // List of journal files 'journal_file_li', // List of journal files
'obj_id', // Object ID 'obj_id', // Object ID
'obj_ext_uid', // External UID 'obj_ext_uid', // External UID
'obj_ext_id', // External ID 'obj_ext_id', // External ID
'obj_import_id', // Import ID 'obj_import_id', // Import ID
'obj_code', // Object code 'obj_code', // Object code
'obj_account_id', // Object account ID 'obj_account_id', // Object account ID
'obj_passcode', // Object passcode 'obj_passcode', // Object passcode
'obj_type', // Object type 'obj_type', // Object type
'obj_type_ver_id', // Object type version ID 'obj_type_ver_id', // Object type version ID
'obj_name', // Object name 'obj_name', // Object name
'obj_summary', // Object summary 'obj_summary', // Object summary
'obj_outline', // Object outline 'obj_outline', // Object outline
'obj_description', // Object description 'obj_description', // Object description
'obj_enable', // Object enable flag 'obj_enable', // Object enable flag
'obj_enable_on', // Object enable date 'obj_enable_on', // Object enable date
'obj_archive_on', // Object archive date 'obj_archive_on', // Object archive date
'obj_hide', // Object hide flag 'obj_hide', // Object hide flag
'obj_priority', // Object priority 'obj_priority', // Object priority
'obj_sort', // Object sort order 'obj_sort', // Object sort order
'obj_group', // Object group name 'obj_group', // Object group name
'obj_cfg_json', // Object configuration JSON 'obj_cfg_json', // Object configuration JSON
'obj_notes', // Object notes 'obj_notes', // Object notes
'obj_created_on', // Object creation date 'obj_created_on', // Object creation date
'obj_updated_on' // Object last updated date 'obj_updated_on' // Object last updated date
]; ];
// Updated 2025-04-02 // Updated 2025-04-02
export interface Journal_Entry { export interface Journal_Entry {
id: string; // actually "id_random" id: string; // actually "id_random"
journal_entry_id: string; journal_entry_id: string;
journal_id: string; // This is the parent journal ID. If deleted, then delete all children journal entries. journal_id: string; // This is the parent journal ID. If deleted, then delete all children journal entries.
// Essentially this is a change log of journal entries // Essentially this is a change log of journal entries
snapshot_id?: string; // This is the original journal ID. If deleted, then delete all children journal entries. snapshot_id?: string; // This is the original journal ID. If deleted, then delete all children journal entries.
previous_id?: null | string; // This is the old or parent journal ID previous_id?: null | string; // This is the old or parent journal ID
next_id?: null | string; // This is the new or child journal ID next_id?: null | string; // This is the new or child journal ID
external_id?: null | string; external_id?: null | string;
import_id?: null | string; import_id?: null | string;
code?: null | string; code?: null | string;
for_type?: null | string; for_type?: null | string;
for_id?: null | string; for_id?: null | string;
template?: null | boolean; // Is this a template journal entry? If true, it can be used to create new journal entries. template?: null | boolean; // Is this a template journal entry? If true, it can be used to create new journal entries.
activity_code?: null | string; activity_code?: null | string;
category_code?: null | string; category_code?: null | string;
topic_code?: null | string; topic_code?: null | string;
type_code?: null | string; type_code?: null | string;
tags?: null | string; // Comma separated tags tags?: null | string; // Comma separated tags
journal_entry_type?: null | string; // This is the type of journal entry journal_entry_type?: null | string; // This is the type of journal entry
account_id?: null | string; // Owner account of the journal account_id?: null | string; // Owner account of the journal
person_id?: null | string; // Owner person of the journal person_id?: null | string; // Owner person of the journal
// event_id?: null|string; // Assign to an event??? // event_id?: null|string; // Assign to an event???
// location_id?: null|string; // Assign to a location??? // location_id?: null|string; // Assign to a location???
public?: null | boolean; public?: null | boolean;
private?: null | boolean; private?: null | boolean;
personal?: null | boolean; personal?: null | boolean;
professional?: null | boolean; professional?: null | boolean;
name: string; // or the title name: string; // or the title
short_name?: null | string; // Short name for the journal entry, if any. Used for display purposes. Most likely for the templates list. short_name?: null | string; // Short name for the journal entry, if any. Used for display purposes. Most likely for the templates list.
summary?: null | string; // LLM (AI) generated summary...??? summary?: null | string; // LLM (AI) generated summary...???
outline?: null | string; // LLM (AI) generated outline...??? outline?: null | string; // LLM (AI) generated outline...???
// description?: null|string; // This is the description of the journal entry // description?: null|string; // This is the description of the journal entry
content?: null | string; content?: null | string;
content_md_html?: null | string; // Markdown converted to HTML based on content. Uses marked or similar library for conversion. content_md_html?: null | string; // Markdown converted to HTML based on content. Uses marked or similar library for conversion.
content_md_html_alt?: null | string; // Markdown converted to HTML based on content. Uses marked or similar library for conversion. content_md_html_alt?: null | string; // Markdown converted to HTML based on content. Uses marked or similar library for conversion.
content_html?: null | string; content_html?: null | string;
content_json?: null | string; content_json?: null | string;
content_encrypted?: null | string; // This is the encrypted content of the journal entry content_encrypted?: null | string; // This is the encrypted content of the journal entry
history?: null | string; // This is the history of the journal entry; a log history?: null | string; // This is the history of the journal entry; a log
history_encrypted?: null | string; // This is the encrypted history of the journal entry history_encrypted?: null | string; // This is the encrypted history of the journal entry
passcode_hash?: null | string; // This is the passcode hash for the journal entry to look up the passcode passcode_hash?: null | string; // This is the passcode hash for the journal entry to look up the passcode
start_datetime?: null | Date; start_datetime?: null | Date;
end_datetime?: null | Date; end_datetime?: null | Date;
timezone?: null | string; timezone?: null | string;
seconds?: null | number; // Duration in seconds seconds?: null | number; // Duration in seconds
location?: null | string; // Location of the journal entry location?: null | string; // Location of the journal entry
latitude?: null | number; // Latitude of the journal entry latitude?: null | number; // Latitude of the journal entry
longitude?: null | number; // Longitude of the journal entry longitude?: null | number; // Longitude of the journal entry
billable?: null | boolean; // Is this billable? billable?: null | boolean; // Is this billable?
bill_to?: null | string; // Who to bill for this journal entry bill_to?: null | string; // Who to bill for this journal entry
bill_rate?: null | number; // Rate to bill for this journal entry bill_rate?: null | number; // Rate to bill for this journal entry
billable_minutes?: null | number; // Billable minutes for this journal entry billable_minutes?: null | number; // Billable minutes for this journal entry
alert?: null | boolean; // LLM (AI) generated summary...??? alert?: null | boolean; // LLM (AI) generated summary...???
alert_msg?: null | string; // LLM (AI) generated summary...??? alert_msg?: null | string; // LLM (AI) generated summary...???
parent_id?: null | string; // This is the parent journal entry ID. If deleted, then delete all children journal entries. parent_id?: null | string; // This is the parent journal entry ID. If deleted, then delete all children journal entries.
related_entry_id_li?: null | key_val; // List of related journal entry IDs related_entry_id_li?: null | key_val; // List of related journal entry IDs
// cfg_json?: null|key_val; // This is the configuration JSON for the journal entry // cfg_json?: null|key_val; // This is the configuration JSON for the journal entry
data_json?: null | key_val; // We always need to store something extra... data_json?: null | key_val; // We always need to store something extra...
// This only allows for basic access to the content. // This only allows for basic access to the content.
passcode_read?: null | string; // For LLM (AI) generated summary...??? passcode_read?: null | string; // For LLM (AI) generated summary...???
passcode_read_expire?: null | Date; passcode_read_expire?: null | Date;
passcode_write?: null | string; passcode_write?: null | string;
passcode_write_expire?: null | Date; passcode_write_expire?: null | Date;
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
tmp_sort_3?: null | string; tmp_sort_3?: null | string;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
file_count?: null | number; // Only files directly under a journal file_count?: null | number; // Only files directly under a journal
journal_file_id_li_json?: null | string; journal_file_id_li_json?: null | string;
journal_code?: null | string; // This is the code for the journal entry journal_code?: null | string; // This is the code for the journal entry
journal_name?: null | string; // This is the name for the journal entry journal_name?: null | string; // This is the name for the journal entry
// One person // One person
person__given_name?: null | string; person__given_name?: null | string;
person__family_name?: null | string; person__family_name?: null | string;
person__full_name?: null | string; person__full_name?: null | string;
person__primary_email?: null | string; person__primary_email?: null | string;
person__passcode?: null | string; person__passcode?: null | string;
// JSON formatted key value pairs for multiple people: {id: name, email, etc.} // JSON formatted key value pairs for multiple people: {id: name, email, etc.}
person__kv_json?: null | string; person__kv_json?: null | string;
// A key value list of the files // A key value list of the files
journal_file_kv?: null | key_val; journal_file_kv?: null | key_val;
journal_file_li?: null | []; journal_file_li?: null | [];
// journal_collection_id?: null|string; // For a collection of journal entries? // journal_collection_id?: null|string; // For a collection of journal entries?
// Future standard fields!!! // Future standard fields!!!
obj_id?: null | string; obj_id?: null | string;
obj_ext_uid?: null | string; // Probably not needed for journal entries obj_ext_uid?: null | string; // Probably not needed for journal entries
obj_ext_id?: null | string; // Probably not needed for journal entries obj_ext_id?: null | string; // Probably not needed for journal entries
obj_import_id?: null | string; // Probably not needed for journal entries obj_import_id?: null | string; // Probably not needed for journal entries
obj_code?: null | string; obj_code?: null | string;
obj_account_id?: null | string; obj_account_id?: null | string;
obj_passcode?: null | string; obj_passcode?: null | string;
obj_type?: null | string; // Should always be 'journal' in this case obj_type?: null | string; // Should always be 'journal' in this case
obj_type_ver_id?: null | string; // The ID from the table for the object type obj_type_ver_id?: null | string; // The ID from the table for the object type
obj_name?: null | string; obj_name?: null | string;
obj_summary?: null | string; // LLM (AI) generated summary...??? obj_summary?: null | string; // LLM (AI) generated summary...???
obj_outline?: null | string; // LLM (AI) generated outline...??? obj_outline?: null | string; // LLM (AI) generated outline...???
obj_description?: null | string; // Probably not needed for journal entries obj_description?: null | string; // Probably not needed for journal entries
obj_enable?: null | boolean; obj_enable?: null | boolean;
obj_enable_on?: null | Date; obj_enable_on?: null | Date;
obj_archive_on?: null | Date; obj_archive_on?: null | Date;
obj_hide?: null | boolean; obj_hide?: null | boolean;
obj_priority?: null | number; obj_priority?: null | number;
obj_sort?: null | number; obj_sort?: null | number;
obj_group?: null | string; obj_group?: null | string;
obj_cfg_json?: null | string; obj_cfg_json?: null | string;
obj_notes?: null | string; obj_notes?: null | string;
obj_created_on?: Date; obj_created_on?: Date;
obj_updated_on?: null | Date; obj_updated_on?: null | Date;
} }
export const journal_entry_field_li = [ export const journal_entry_field_li = [
'id', 'id',
'journal_entry_id', 'journal_entry_id',
'journal_id', 'journal_id',
'code', 'code',
'for_type', 'for_type',
'for_id', 'for_id',
'template', 'template',
'activity_code', 'activity_code',
'category_code', 'category_code',
'topic_code', 'topic_code',
'type_code', 'type_code',
'tags', 'tags',
'journal_entry_type', 'journal_entry_type',
'account_id', 'account_id',
'person_id', 'person_id',
'public', 'public',
'private', 'private',
'personal', 'personal',
'professional', 'professional',
'name', 'name',
'short_name', 'short_name',
'summary', 'summary',
'outline', 'outline',
'content', 'content',
'content_md_html', 'content_md_html',
'content_md_html_alt', 'content_md_html_alt',
'content_html', 'content_html',
'content_json', 'content_json',
'content_encrypted', 'content_encrypted',
'history', 'history',
'history_encrypted', 'history_encrypted',
'passcode_hash', 'passcode_hash',
'start_datetime', 'start_datetime',
'end_datetime', 'end_datetime',
'timezone', 'timezone',
'seconds', 'seconds',
'location', 'location',
'latitude', 'latitude',
'longitude', 'longitude',
'billable', 'billable',
'bill_to', 'bill_to',
'bill_rate', 'bill_rate',
'billable_minutes', 'billable_minutes',
'alert', 'alert',
'alert_msg', 'alert_msg',
'parent_id', 'parent_id',
'related_entry_id_li', 'related_entry_id_li',
'data_json', 'data_json',
'passcode_read', 'passcode_read',
'passcode_read_expire', 'passcode_read_expire',
'passcode_write', 'passcode_write',
'passcode_write_expire', 'passcode_write_expire',
'enable', 'enable',
'hide', 'hide',
'priority', 'priority',
'sort', 'sort',
'group', 'group',
'notes', 'notes',
'created_on', 'created_on',
'updated_on', 'updated_on',
'tmp_sort_1', 'tmp_sort_1',
'tmp_sort_2', 'tmp_sort_2',
'tmp_sort_3', 'tmp_sort_3',
'file_count', 'file_count',
'journal_file_id_li_json', 'journal_file_id_li_json',
'journal_code', 'journal_code',
'journal_name', 'journal_name',
'person__given_name', 'person__given_name',
'person__family_name', 'person__family_name',
'person__full_name', 'person__full_name',
'person__primary_email', 'person__primary_email',
'person__passcode', 'person__passcode',
'person__kv_json', 'person__kv_json',
'journal_file_kv', 'journal_file_kv',
'journal_file_li', 'journal_file_li',
'obj_id', 'obj_id',
'obj_ext_uid', 'obj_ext_uid',
'obj_ext_id', 'obj_ext_id',
'obj_import_id', 'obj_import_id',
'obj_code', 'obj_code',
'obj_account_id', 'obj_account_id',
'obj_passcode', 'obj_passcode',
'obj_type', 'obj_type',
'obj_type_ver_id', 'obj_type_ver_id',
'obj_name', 'obj_name',
'obj_summary', 'obj_summary',
'obj_outline', 'obj_outline',
'obj_description', 'obj_description',
'obj_enable', 'obj_enable',
'obj_enable_on', 'obj_enable_on',
'obj_archive_on', 'obj_archive_on',
'obj_hide', 'obj_hide',
'obj_priority', 'obj_priority',
'obj_sort', 'obj_sort',
'obj_group', 'obj_group',
'obj_cfg_json', 'obj_cfg_json',
'obj_notes', 'obj_notes',
'obj_created_on', 'obj_created_on',
'obj_updated_on' 'obj_updated_on'
]; ];
// Updated 2024-06-10 // Updated 2024-06-10
export class MySubClassedDexie extends Dexie { export class MySubClassedDexie extends Dexie {
// We just tell the typing system this is the case // We just tell the typing system this is the case
journal!: Table<Journal>; journal!: Table<Journal>;
journal_entry!: Table<Journal_Entry>; journal_entry!: Table<Journal_Entry>;
constructor() { constructor() {
super('ae_journals_db'); super('ae_journals_db');
this.version(4).stores({ this.version(4).stores({
journal: ` journal: `
id, journal_id, id, journal_id,
code, code,
account_id, account_id,
@@ -523,7 +523,7 @@ export class MySubClassedDexie extends Dexie {
timezone, timezone,
tmp_sort_1, tmp_sort_2, tmp_sort_3, tmp_sort_1, tmp_sort_2, tmp_sort_3,
enable, hide, priority, sort, group, created_on, updated_on`, enable, hide, priority, sort, group, created_on, updated_on`,
journal_entry: ` journal_entry: `
id, journal_entry_id, id, journal_entry_id,
journal_id, journal_id,
code, code,
@@ -534,8 +534,8 @@ export class MySubClassedDexie extends Dexie {
timezone, timezone,
tmp_sort_1, tmp_sort_2, tmp_sort_3, tmp_sort_1, tmp_sort_2, tmp_sort_3,
enable, hide, priority, sort, group, created_on, updated_on` enable, hide, priority, sort, group, created_on, updated_on`
}); });
} }
} }
export const db_journals = new MySubClassedDexie(); export const db_journals = new MySubClassedDexie();

File diff suppressed because it is too large Load Diff

View File

@@ -9,446 +9,451 @@ const ae_promises: key_val = {};
// Updated 2025-06-23 // Updated 2025-06-23
export async function load_ae_obj_id__post_comment({ export async function load_ae_obj_id__post_comment({
api_cfg, api_cfg,
post_comment_id, post_comment_id,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 99, limit = 99,
offset = 0, offset = 0,
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
post_comment_id: string; post_comment_id: string;
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_id__post_comment() *** post_comment_id=${post_comment_id}`); console.log(`*** load_ae_obj_id__post_comment() *** post_comment_id=${post_comment_id}`);
} }
ae_promises.load__post_comment_obj = await api ae_promises.load__post_comment_obj = await api
.get_ae_obj_id_crud({ .get_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'post_comment', obj_type: 'post_comment',
obj_id: post_comment_id, obj_id: post_comment_id,
use_alt_table: false, use_alt_table: false,
use_alt_base: false, use_alt_base: false,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (post_comment_obj_get_result) { .then(async function (post_comment_obj_get_result) {
if (post_comment_obj_get_result) { if (post_comment_obj_get_result) {
if (try_cache) { if (try_cache) {
// Process the results first // Process the results first
const processed_obj_li = await process_ae_obj__post_comment_props({ const processed_obj_li = await process_ae_obj__post_comment_props({
obj_li: [post_comment_obj_get_result], obj_li: [post_comment_obj_get_result],
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('Processed object list:', processed_obj_li); console.log('Processed object list:', processed_obj_li);
} }
// Save the updated results list to the database // Save the updated results list to the database
if (log_lvl) { if (log_lvl) {
console.log('Saving to DB...'); console.log('Saving to DB...');
} }
await db_save_ae_obj_li__ae_obj({ await db_save_ae_obj_li__ae_obj({
db_instance: db_posts, db_instance: db_posts,
table_name: 'comment', table_name: 'comment',
obj_li: processed_obj_li, obj_li: processed_obj_li,
properties_to_save: properties_to_save, properties_to_save: properties_to_save,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('DB save completed.'); console.log('DB save completed.');
} }
// // This is expecting a list // // This is expecting a list
// db_save_ae_obj_li__post_comment({ // db_save_ae_obj_li__post_comment({
// obj_type: 'post_comment', // obj_type: 'post_comment',
// obj_li: [post_comment_obj_get_result], // obj_li: [post_comment_obj_get_result],
// log_lvl: log_lvl // log_lvl: log_lvl
// }); // });
} }
return post_comment_obj_get_result; return post_comment_obj_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
return ae_promises.load__post_comment_obj; return ae_promises.load__post_comment_obj;
} }
// Updated 2025-06-23 // Updated 2025-06-23
export async function load_ae_obj_li__post_comment({ export async function load_ae_obj_li__post_comment({
api_cfg, api_cfg,
for_obj_type = 'post', for_obj_type = 'post',
for_obj_id, for_obj_id,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 99, limit = 99,
offset = 0, offset = 0,
order_by_li = { order_by_li = {
priority: 'DESC', priority: 'DESC',
sort: 'DESC', sort: 'DESC',
updated_on: 'DESC', updated_on: 'DESC',
created_on: 'DESC', created_on: 'DESC',
title: 'ASC' title: 'ASC'
}, },
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
for_obj_type: string; for_obj_type: string;
for_obj_id: string; for_obj_id: string;
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** load_ae_obj_li__post_comment() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}` `*** load_ae_obj_li__post_comment() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}`
); );
} }
const params_json: key_val = {}; const params_json: key_val = {};
if (log_lvl) { if (log_lvl) {
console.log('params_json:', params_json); console.log('params_json:', params_json);
} }
ae_promises.load__post_comment_obj_li = await api ae_promises.load__post_comment_obj_li = await api
.get_ae_obj_li_for_obj_id_crud_v2({ .get_ae_obj_li_for_obj_id_crud_v2({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'post_comment', obj_type: 'post_comment',
for_obj_type: for_obj_type, for_obj_type: for_obj_type,
for_obj_id: for_obj_id, for_obj_id: for_obj_id,
use_alt_tbl: false, use_alt_tbl: false,
use_alt_mdl: false, use_alt_mdl: false,
use_alt_exp: false, use_alt_exp: false,
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (post_comment_obj_li_get_result) { .then(async function (post_comment_obj_li_get_result) {
if (post_comment_obj_li_get_result) { if (post_comment_obj_li_get_result) {
if (try_cache) { if (try_cache) {
// Process the results first // Process the results first
const processed_obj_li = await process_ae_obj__post_comment_props({ const processed_obj_li = await process_ae_obj__post_comment_props({
obj_li: post_comment_obj_li_get_result, obj_li: post_comment_obj_li_get_result,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('Processed object list:', processed_obj_li); console.log('Processed object list:', processed_obj_li);
} }
// Save the updated results list to the database // Save the updated results list to the database
if (log_lvl) { if (log_lvl) {
console.log('Saving to DB...'); console.log('Saving to DB...');
} }
await db_save_ae_obj_li__ae_obj({ await db_save_ae_obj_li__ae_obj({
db_instance: db_posts, db_instance: db_posts,
table_name: 'comment', table_name: 'comment',
obj_li: processed_obj_li, obj_li: processed_obj_li,
properties_to_save: properties_to_save, properties_to_save: properties_to_save,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('DB save completed.'); console.log('DB save completed.');
} }
// db_save_ae_obj_li__post_comment({ // db_save_ae_obj_li__post_comment({
// obj_type: 'post_comment', // obj_type: 'post_comment',
// obj_li: post_comment_obj_li_get_result, // obj_li: post_comment_obj_li_get_result,
// log_lvl: log_lvl // log_lvl: log_lvl
// }); // });
} }
return post_comment_obj_li_get_result; return post_comment_obj_li_get_result;
} else { } else {
return []; return [];
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__post_comment_obj_li:', ae_promises.load__post_comment_obj_li); console.log(
} 'ae_promises.load__post_comment_obj_li:',
ae_promises.load__post_comment_obj_li
);
}
return ae_promises.load__post_comment_obj_li; return ae_promises.load__post_comment_obj_li;
} }
// Updated 2025-06-23 // Updated 2025-06-23
export async function create_ae_obj__post_comment({ export async function create_ae_obj__post_comment({
api_cfg, api_cfg,
post_id, post_id,
data_kv, data_kv,
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
post_id: string; post_id: string;
data_kv: key_val; data_kv: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** create_ae_obj__post_comment() *** post_id=${post_id}`); console.log(`*** create_ae_obj__post_comment() *** post_id=${post_id}`);
} }
if (!post_id) { if (!post_id) {
console.log(`ERROR: Posts - Comment - post_id required to create`); console.log(`ERROR: Posts - Comment - post_id required to create`);
return false; return false;
} }
ae_promises.create__post_comment = await api ae_promises.create__post_comment = await api
.create_ae_obj_crud({ .create_ae_obj_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'post_comment', obj_type: 'post_comment',
fields: { fields: {
post_id_random: post_id, post_id_random: post_id,
...data_kv ...data_kv
}, },
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: params, params: params,
return_obj: true, return_obj: true,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (post_comment_obj_create_result) { .then(async function (post_comment_obj_create_result) {
if (post_comment_obj_create_result) { if (post_comment_obj_create_result) {
if (try_cache) { if (try_cache) {
// Process the results first // Process the results first
const processed_obj_li = await process_ae_obj__post_comment_props({ const processed_obj_li = await process_ae_obj__post_comment_props({
obj_li: [post_comment_obj_create_result], obj_li: [post_comment_obj_create_result],
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('Processed object list:', processed_obj_li); console.log('Processed object list:', processed_obj_li);
} }
// Save the updated results list to the database // Save the updated results list to the database
if (log_lvl) { if (log_lvl) {
console.log('Saving to DB...'); console.log('Saving to DB...');
} }
await db_save_ae_obj_li__ae_obj({ await db_save_ae_obj_li__ae_obj({
db_instance: db_posts, db_instance: db_posts,
table_name: 'comment', table_name: 'comment',
obj_li: processed_obj_li, obj_li: processed_obj_li,
properties_to_save: properties_to_save, properties_to_save: properties_to_save,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('DB save completed.'); console.log('DB save completed.');
} }
// db_save_ae_obj_li__post_comment( // db_save_ae_obj_li__post_comment(
// { // {
// obj_type: 'post_comment', // obj_type: 'post_comment',
// obj_li: [post_comment_obj_create_result], // obj_li: [post_comment_obj_create_result],
// log_lvl: log_lvl // log_lvl: log_lvl
// }); // });
} }
return post_comment_obj_create_result; return post_comment_obj_create_result;
} else { } else {
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}) })
.finally(function () {}); .finally(function () {});
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.create__post_comment:', ae_promises.create__post_comment); console.log('ae_promises.create__post_comment:', ae_promises.create__post_comment);
} }
return ae_promises.create__post_comment; return ae_promises.create__post_comment;
} }
// Updated 2024-11-08 // Updated 2024-11-08
export async function delete_ae_obj_id__post_comment({ export async function delete_ae_obj_id__post_comment({
api_cfg, api_cfg,
post_comment_id, post_comment_id,
method = 'delete', // 'delete', 'disable', 'hide' method = 'delete', // 'delete', 'disable', 'hide'
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
post_comment_id: string; post_comment_id: string;
method?: string; method?: string;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** delete_ae_obj_id__post_comment() *** post_comment_id=${post_comment_id}`); console.log(`*** delete_ae_obj_id__post_comment() *** post_comment_id=${post_comment_id}`);
} }
ae_promises.delete__post_comment_obj = await api ae_promises.delete__post_comment_obj = await api
.delete_ae_obj_id_crud({ .delete_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'post_comment', obj_type: 'post_comment',
obj_id: post_comment_id, obj_id: post_comment_id,
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: params, params: params,
method: method, method: method,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}) })
.finally(function () { .finally(function () {
if (try_cache) { if (try_cache) {
if (log_lvl) { if (log_lvl) {
console.log(`Attempting to remove IDB entry for post_comment_id=${post_comment_id}`); console.log(
} `Attempting to remove IDB entry for post_comment_id=${post_comment_id}`
db_posts.comment.delete(post_comment_id); // Delete from the DB no matter what. );
} }
}); db_posts.comment.delete(post_comment_id); // Delete from the DB no matter what.
}
});
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.delete__post_comment_obj:', ae_promises.delete__post_comment_obj); console.log('ae_promises.delete__post_comment_obj:', ae_promises.delete__post_comment_obj);
} }
return ae_promises.delete__post_comment_obj; return ae_promises.delete__post_comment_obj;
} }
// Updated 2025-06-23 // Updated 2025-06-23
export async function update_ae_obj__post_comment({ export async function update_ae_obj__post_comment({
api_cfg, api_cfg,
post_comment_id, post_comment_id,
data_kv, data_kv,
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
post_comment_id: string; post_comment_id: string;
data_kv: key_val; data_kv: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** update_ae_obj__post_comment() *** post_comment_id=${post_comment_id}`, `*** update_ae_obj__post_comment() *** post_comment_id=${post_comment_id}`,
data_kv data_kv
); );
} }
// Perform the API update // Perform the API update
const result = await api.update_ae_obj_id_crud({ const result = await api.update_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'post_comment', obj_type: 'post_comment',
obj_id: post_comment_id, obj_id: post_comment_id,
fields: data_kv, fields: data_kv,
key: api_cfg.api_crud_super_key, key: api_cfg.api_crud_super_key,
params: params, params: params,
return_obj: true, return_obj: true,
log_lvl: log_lvl log_lvl: log_lvl
}); });
// Handle the result // Handle the result
if (result) { if (result) {
if (try_cache) { if (try_cache) {
// Process the results first // Process the results first
const processed_obj_li = await process_ae_obj__post_comment_props({ const processed_obj_li = await process_ae_obj__post_comment_props({
obj_li: [result], obj_li: [result],
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('Processed object list:', processed_obj_li); console.log('Processed object list:', processed_obj_li);
} }
// Save the updated results list to the database // Save the updated results list to the database
if (log_lvl) { if (log_lvl) {
console.log('Saving to DB...'); console.log('Saving to DB...');
} }
await db_save_ae_obj_li__ae_obj({ await db_save_ae_obj_li__ae_obj({
db_instance: db_posts, db_instance: db_posts,
table_name: 'comment', table_name: 'comment',
obj_li: processed_obj_li, obj_li: processed_obj_li,
properties_to_save: properties_to_save, properties_to_save: properties_to_save,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('DB save completed.'); console.log('DB save completed.');
} }
// await db_save_ae_obj_li__post_comment({ // await db_save_ae_obj_li__post_comment({
// obj_type: 'post_comment', // obj_type: 'post_comment',
// obj_li: [result], // obj_li: [result],
// log_lvl: log_lvl, // log_lvl: log_lvl,
// }); // });
} }
return result; return result;
} else { } else {
console.error('Failed to update post comment.'); console.error('Failed to update post comment.');
return null; return null;
} }
} }
// Updated 2025-06-04 // Updated 2025-06-04
export const properties_to_save = [ export const properties_to_save = [
'id', 'id',
'post_comment_id', 'post_comment_id',
// 'post_comment_id_random', // 'post_comment_id_random',
'post_id', 'post_id',
// 'post_id_random', // 'post_id_random',
'external_person_id', 'external_person_id',
'name', 'name',
'title', 'title',
'content', 'content',
'anonymous', 'anonymous',
'full_name', 'full_name',
'email', 'email',
'notify', 'notify',
'linked_li_json', 'linked_li_json',
'cfg_json', 'cfg_json',
'enable', 'enable',
'hide', 'hide',
'priority', 'priority',
'sort', 'sort',
'group', 'group',
'notes', 'notes',
'created_on', 'created_on',
'updated_on', 'updated_on',
// Generated fields for sorting locally only // Generated fields for sorting locally only
'tmp_sort_1', 'tmp_sort_1',
'tmp_sort_2' 'tmp_sort_2'
// 'tmp_sort_a', // 'tmp_sort_a',
// 'tmp_sort_b', // 'tmp_sort_b',
// From SQL view // From SQL view
]; ];
/** /**
@@ -456,91 +461,91 @@ export const properties_to_save = [
* Processes a list of Aether objects by applying common and specific transformations. * Processes a list of Aether objects by applying common and specific transformations.
*/ */
async function _process_generic_props<T extends Record<string, any>>({ async function _process_generic_props<T extends Record<string, any>>({
obj_li, obj_li,
obj_type, obj_type,
log_lvl = 0, log_lvl = 0,
specific_processor specific_processor
}: { }: {
obj_li: T[]; obj_li: T[];
obj_type: string; obj_type: string;
log_lvl?: number; log_lvl?: number;
specific_processor?: (obj: T) => Promise<T> | T; specific_processor?: (obj: T) => Promise<T> | T;
}): Promise<T[]> { }): Promise<T[]> {
if (log_lvl > 0) { if (log_lvl > 0) {
console.log( console.log(
`*** _process_generic_props: Processing ${obj_li.length} objects of type "${obj_type}" ***` `*** _process_generic_props: Processing ${obj_li.length} objects of type "${obj_type}" ***`
); );
} }
if (!obj_li || obj_li.length === 0) { if (!obj_li || obj_li.length === 0) {
if (log_lvl > 0) console.log('No objects to process.'); if (log_lvl > 0) console.log('No objects to process.');
return []; return [];
} }
const processed_obj_li: T[] = []; const processed_obj_li: T[] = [];
for (const original_obj of obj_li) { for (const original_obj of obj_li) {
let processed_obj = { ...original_obj }; let processed_obj = { ...original_obj };
// --- Common Transformations --- // --- Common Transformations ---
// 1. Standardize ID and other '_random' fields // 1. Standardize ID and other '_random' fields
// The API often returns fields like 'person_id_random', which need to be aliased to 'person_id'. // The API often returns fields like 'person_id_random', which need to be aliased to 'person_id'.
for (const key in processed_obj) { for (const key in processed_obj) {
if (key.endsWith('_random')) { if (key.endsWith('_random')) {
const newKey = key.slice(0, -7); // Remove '_random' suffix const newKey = key.slice(0, -7); // Remove '_random' suffix
processed_obj[newKey] = processed_obj[key]; processed_obj[newKey] = processed_obj[key];
} }
} }
// Ensure 'id' is set from '[obj_type]_id_random' // Ensure 'id' is set from '[obj_type]_id_random'
const randomIdKey = `${obj_type}_id_random`; const randomIdKey = `${obj_type}_id_random`;
if (processed_obj[randomIdKey]) { if (processed_obj[randomIdKey]) {
(processed_obj as any).id = processed_obj[randomIdKey]; (processed_obj as any).id = processed_obj[randomIdKey];
} }
// 2. Create common computed properties for client-side sorting. // 2. Create common computed properties for client-side sorting.
const group = processed_obj.group ?? '0'; const group = processed_obj.group ?? '0';
const priority = processed_obj.priority ? 1 : 0; const priority = processed_obj.priority ? 1 : 0;
const sort = processed_obj.sort ?? '0'; const sort = processed_obj.sort ?? '0';
const updated = processed_obj.updated_on ?? processed_obj.created_on; const updated = processed_obj.updated_on ?? processed_obj.created_on;
const name = processed_obj.name ?? ''; const name = processed_obj.name ?? '';
(processed_obj as any).tmp_sort_1 = `${group}_${priority}_${sort}_${updated}`; (processed_obj as any).tmp_sort_1 = `${group}_${priority}_${sort}_${updated}`;
(processed_obj as any).tmp_sort_2 = `${group}_${priority}_${sort}_${name}_${updated}`; (processed_obj as any).tmp_sort_2 = `${group}_${priority}_${sort}_${name}_${updated}`;
// --- Specific Transformations --- // --- Specific Transformations ---
if (specific_processor) { if (specific_processor) {
processed_obj = await Promise.resolve(specific_processor(processed_obj)); processed_obj = await Promise.resolve(specific_processor(processed_obj));
} }
processed_obj_li.push(processed_obj as T); processed_obj_li.push(processed_obj as T);
} }
return processed_obj_li; return processed_obj_li;
} }
// Updated 2025-06-04 // Updated 2025-06-04
export async function process_ae_obj__post_comment_props({ export async function process_ae_obj__post_comment_props({
obj_li, obj_li,
log_lvl = 0 log_lvl = 0
}: { }: {
obj_li: any[]; obj_li: any[];
log_lvl?: number; log_lvl?: number;
}) { }) {
return _process_generic_props({ return _process_generic_props({
obj_li, obj_li,
obj_type: 'post_comment', obj_type: 'post_comment',
log_lvl, log_lvl,
specific_processor: (obj) => { specific_processor: (obj) => {
// Post comment-specific computed sort fields, overriding generic ones if needed // Post comment-specific computed sort fields, overriding generic ones if needed
obj.tmp_sort_1 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${ obj.tmp_sort_1 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${
obj.sort?.toString().padStart(3, '0') ?? '' obj.sort?.toString().padStart(3, '0') ?? ''
}_${obj.updated_on ?? obj.created_on}`; }_${obj.updated_on ?? obj.created_on}`;
obj.tmp_sort_2 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${ obj.tmp_sort_2 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${
obj.sort?.toString().padStart(2, '0') ?? '' obj.sort?.toString().padStart(2, '0') ?? ''
}_${obj.updated_on}_${obj.created_on}`; }_${obj.updated_on}_${obj.created_on}`;
return obj; return obj;
} }
}); });
} }

View File

@@ -1,32 +1,32 @@
// This file is used to export all the functions that are used for Aether Posts related functions. // This file is used to export all the functions that are used for Aether Posts related functions.
import { import {
load_ae_obj_id__post, load_ae_obj_id__post,
load_ae_obj_li__post, load_ae_obj_li__post,
create_ae_obj__post, create_ae_obj__post,
delete_ae_obj_id__post, delete_ae_obj_id__post,
update_ae_obj__post update_ae_obj__post
} from '$lib/ae_posts/ae_posts__post'; } from '$lib/ae_posts/ae_posts__post';
import { import {
load_ae_obj_id__post_comment, load_ae_obj_id__post_comment,
load_ae_obj_li__post_comment, load_ae_obj_li__post_comment,
create_ae_obj__post_comment, create_ae_obj__post_comment,
delete_ae_obj_id__post_comment, delete_ae_obj_id__post_comment,
update_ae_obj__post_comment update_ae_obj__post_comment
} from '$lib/ae_posts/ae_posts__post_comment'; } from '$lib/ae_posts/ae_posts__post_comment';
const export_obj = { const export_obj = {
load_ae_obj_id__post: load_ae_obj_id__post, load_ae_obj_id__post: load_ae_obj_id__post,
load_ae_obj_li__post: load_ae_obj_li__post, load_ae_obj_li__post: load_ae_obj_li__post,
create_ae_obj__post: create_ae_obj__post, create_ae_obj__post: create_ae_obj__post,
delete_ae_obj_id__post: delete_ae_obj_id__post, delete_ae_obj_id__post: delete_ae_obj_id__post,
update_ae_obj__post: update_ae_obj__post, update_ae_obj__post: update_ae_obj__post,
load_ae_obj_id__post_comment: load_ae_obj_id__post_comment, load_ae_obj_id__post_comment: load_ae_obj_id__post_comment,
load_ae_obj_li__post_comment: load_ae_obj_li__post_comment, load_ae_obj_li__post_comment: load_ae_obj_li__post_comment,
create_ae_obj__post_comment: create_ae_obj__post_comment, create_ae_obj__post_comment: create_ae_obj__post_comment,
delete_ae_obj_id__post_comment: delete_ae_obj_id__post_comment, delete_ae_obj_id__post_comment: delete_ae_obj_id__post_comment,
update_ae_obj__post_comment: update_ae_obj__post_comment update_ae_obj__post_comment: update_ae_obj__post_comment
}; };
export const posts_func = export_obj; export const posts_func = export_obj;

View File

@@ -7,113 +7,113 @@ import type { key_val } from '$lib/stores/ae_stores';
// Updated 2024-11-13 // Updated 2024-11-13
export interface Post { export interface Post {
id: string; id: string;
// id_random: string; // id_random: string;
post_id: string; post_id: string;
// post_id_random: string; // post_id_random: string;
account_id: string; account_id: string;
// account_id_random: string; // account_id_random: string;
person_id?: null | string; person_id?: null | string;
external_person_id?: null | string; // For IDAA this is the Novi UUID external_person_id?: null | string; // For IDAA this is the Novi UUID
user_id?: null | string; user_id?: null | string;
topic_id?: string; topic_id?: string;
topic?: string; // or topic_name? topic?: string; // or topic_name?
topic_name?: string; topic_name?: string;
name: null | string; name: null | string;
title: null | string; title: null | string;
// summary?: null|string; // summary?: null|string;
content?: null | string; content?: null | string;
anonymous?: null | boolean; anonymous?: null | boolean;
full_name?: null | string; full_name?: null | string;
email?: null | string; email?: null | string;
notify?: null | boolean; notify?: null | boolean;
enable_comments?: null | boolean; enable_comments?: null | boolean;
archive?: null | boolean; archive?: null | boolean;
archive_on?: null | Date; archive_on?: null | Date;
linked_li_json?: null | string; linked_li_json?: null | string;
cfg_json?: null | key_val; cfg_json?: null | key_val;
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
post_comment_count?: number; post_comment_count?: number;
// Placeholder for generated temp data // Placeholder for generated temp data
hosted_file_id_li?: null | Array<string>; hosted_file_id_li?: null | Array<string>;
hosted_file_obj_li?: null | Array<any>; hosted_file_obj_li?: null | Array<any>;
upload_complete?: boolean; upload_complete?: boolean;
} }
// Updated 2024-11-13 // Updated 2024-11-13
export interface Post_Comment { export interface Post_Comment {
id: string; id: string;
// id_random: string; // id_random: string;
post_comment_id: string; post_comment_id: string;
// post_comment_id_random: string; // post_comment_id_random: string;
post_id: string; post_id: string;
// post_id_random: string; // post_id_random: string;
external_person_id?: null | string; // For IDAA this is the Novi UUID external_person_id?: null | string; // For IDAA this is the Novi UUID
name: null | string; name: null | string;
title: null | string; title: null | string;
// summary?: null|string; // summary?: null|string;
content?: null | string; content?: null | string;
anonymous?: null | boolean; anonymous?: null | boolean;
full_name?: null | string; full_name?: null | string;
email?: null | string; email?: null | string;
notify?: null | boolean; notify?: null | boolean;
linked_li_json?: null | string; linked_li_json?: null | string;
cfg_json?: null | key_val; cfg_json?: null | key_val;
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
} }
// Updated 2024-09-25 // Updated 2024-09-25
export class MySubClassedDexie extends Dexie { export class MySubClassedDexie extends Dexie {
// We just tell the typing system this is the case // We just tell the typing system this is the case
post!: Table<Post>; post!: Table<Post>;
comment!: Table<Post_Comment>; comment!: Table<Post_Comment>;
constructor() { constructor() {
super('ae_posts_db'); super('ae_posts_db');
this.version(1).stores({ this.version(1).stores({
post: ` post: `
id, post_id, id, post_id,
account_id, account_id,
topic_id, topic, topic_id, topic,
@@ -124,7 +124,7 @@ export class MySubClassedDexie extends Dexie {
tmp_sort_1, tmp_sort_2, tmp_sort_1, tmp_sort_2,
enable, hide, priority, sort, group, notes, created_on, updated_on, [updated_on+created_on], [created_on+updated_on]`, enable, hide, priority, sort, group, notes, created_on, updated_on, [updated_on+created_on], [created_on+updated_on]`,
comment: ` comment: `
id, post_comment_id, id, post_comment_id,
post_id, post_id,
name, name,
@@ -132,8 +132,8 @@ export class MySubClassedDexie extends Dexie {
full_name, email, full_name, email,
tmp_sort_1, tmp_sort_2, tmp_sort_1, tmp_sort_2,
enable, hide, priority, sort, group, notes, created_on, updated_on, [updated_on+created_on]` enable, hide, priority, sort, group, notes, created_on, updated_on, [updated_on+created_on]`
}); });
} }
} }
export const db_posts = new MySubClassedDexie(); export const db_posts = new MySubClassedDexie();

View File

@@ -8,118 +8,118 @@ import { db_sponsorships } from '$lib/ae_sponsorships/db_sponsorships';
// --- PROPERTIES TO SAVE --- // --- PROPERTIES TO SAVE ---
export const properties_to_save_sponsorship_cfg = [ export const properties_to_save_sponsorship_cfg = [
'id', 'id',
'sponsorship_cfg_id', 'sponsorship_cfg_id',
'account_id', 'account_id',
'for_type', 'for_type',
'for_id', 'for_id',
'level_li_json', 'level_li_json',
'option_li_json', 'option_li_json',
'schedule_li_json', 'schedule_li_json',
'cfg_json', 'cfg_json',
'enable', 'enable',
'hide', 'hide',
'priority', 'priority',
'sort', 'sort',
'group', 'group',
'notes', 'notes',
'created_on', 'created_on',
'updated_on', 'updated_on',
// Generated fields for sorting locally only // Generated fields for sorting locally only
'tmp_sort_1', 'tmp_sort_1',
'tmp_sort_2' 'tmp_sort_2'
]; ];
// --- PROCESS FUNCTION --- // --- PROCESS FUNCTION ---
export async function process_ae_obj__sponsorship_cfg_props({ export async function process_ae_obj__sponsorship_cfg_props({
obj_li, obj_li,
log_lvl = 0 log_lvl = 0
}: { }: {
obj_li: any[]; obj_li: any[];
log_lvl?: number; log_lvl?: number;
}) { }) {
return _process_generic_props({ return _process_generic_props({
obj_li, obj_li,
obj_type: 'sponsorship_cfg', obj_type: 'sponsorship_cfg',
log_lvl, log_lvl,
specific_processor: (obj) => { specific_processor: (obj) => {
// Sponsorship Cfg-specific computed sort fields, overriding generic ones if needed // Sponsorship Cfg-specific computed sort fields, overriding generic ones if needed
obj.tmp_sort_1 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${ obj.tmp_sort_1 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${
obj.sort?.toString().padStart(3, '0') ?? '' obj.sort?.toString().padStart(3, '0') ?? ''
}_${obj.updated_on ?? obj.created_on}`; }_${obj.updated_on ?? obj.created_on}`;
obj.tmp_sort_2 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${ obj.tmp_sort_2 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${
obj.sort?.toString().padStart(3, '0') ?? '' obj.sort?.toString().padStart(3, '0') ?? ''
}_${obj.updated_on}_${obj.created_on}`; }_${obj.updated_on}_${obj.created_on}`;
return obj; return obj;
} }
}); });
} }
// --- PROPERTIES TO SAVE --- // --- PROPERTIES TO SAVE ---
export const properties_to_save_sponsorship = [ export const properties_to_save_sponsorship = [
'id', 'id',
'sponsorship_id', 'sponsorship_id',
'account_id', 'account_id',
'organization_id', 'organization_id',
'person_id', 'person_id',
'poc_person_id', 'poc_person_id',
'poc_json', 'poc_json',
'name', 'name',
'name_override', 'name_override',
'description', 'description',
'email', 'email',
'website_url', 'website_url',
'logo_li_json', 'logo_li_json',
'media_li_json', 'media_li_json',
'social_li_json', 'social_li_json',
'address_li_json', 'address_li_json',
'contact_li_json', 'contact_li_json',
'guest_li_json', 'guest_li_json',
'level_num', 'level_num',
'level_str', 'level_str',
'amount', 'amount',
'questions_li_json', 'questions_li_json',
'agree', 'agree',
'comments', 'comments',
'staff_notes', 'staff_notes',
'enable', 'enable',
'hide', 'hide',
'priority', 'priority',
'sort', 'sort',
'group', 'group',
'notes', 'notes',
'created_on', 'created_on',
'updated_on', 'updated_on',
// Generated fields for sorting locally only // Generated fields for sorting locally only
'tmp_sort_1', 'tmp_sort_1',
'tmp_sort_2' 'tmp_sort_2'
]; ];
// --- PROCESS FUNCTION --- // --- PROCESS FUNCTION ---
export async function process_ae_obj__sponsorship_props({ export async function process_ae_obj__sponsorship_props({
obj_li, obj_li,
log_lvl = 0 log_lvl = 0
}: { }: {
obj_li: any[]; obj_li: any[];
log_lvl?: number; log_lvl?: number;
}) { }) {
return _process_generic_props({ return _process_generic_props({
obj_li, obj_li,
obj_type: 'sponsorship', obj_type: 'sponsorship',
log_lvl, log_lvl,
specific_processor: (obj) => { specific_processor: (obj) => {
// Sponsorship-specific computed sort fields, overriding generic ones if needed // Sponsorship-specific computed sort fields, overriding generic ones if needed
obj.tmp_sort_1 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${ obj.tmp_sort_1 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${
obj.sort?.toString().padStart(3, '0') ?? '' obj.sort?.toString().padStart(3, '0') ?? ''
}_${obj.updated_on ?? obj.created_on}`; }_${obj.updated_on ?? obj.created_on}`;
obj.tmp_sort_2 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${ obj.tmp_sort_2 = `${obj.group ?? ''}_${obj.priority ? '1' : '0'}_${
obj.sort?.toString().padStart(3, '0') ?? '' obj.sort?.toString().padStart(3, '0') ?? ''
}_${obj.updated_on}_${obj.created_on}`; }_${obj.updated_on}_${obj.created_on}`;
return obj; return obj;
} }
}); });
} }
/** /**
@@ -127,378 +127,383 @@ export async function process_ae_obj__sponsorship_props({
* Processes a list of Aether objects by applying common and specific transformations. * Processes a list of Aether objects by applying common and specific transformations.
*/ */
async function _process_generic_props<T extends Record<string, any>>({ async function _process_generic_props<T extends Record<string, any>>({
obj_li, obj_li,
obj_type, obj_type,
log_lvl = 0, log_lvl = 0,
specific_processor specific_processor
}: { }: {
obj_li: T[]; obj_li: T[];
obj_type: string; obj_type: string;
log_lvl?: number; log_lvl?: number;
specific_processor?: (obj: T) => Promise<T> | T; specific_processor?: (obj: T) => Promise<T> | T;
}): Promise<T[]> { }): Promise<T[]> {
if (log_lvl > 0) { if (log_lvl > 0) {
console.log( console.log(
`*** _process_generic_props: Processing ${obj_li.length} objects of type "${obj_type}" ***` `*** _process_generic_props: Processing ${obj_li.length} objects of type "${obj_type}" ***`
); );
} }
if (!obj_li || obj_li.length === 0) { if (!obj_li || obj_li.length === 0) {
if (log_lvl > 0) console.log('No objects to process.'); if (log_lvl > 0) console.log('No objects to process.');
return []; return [];
} }
const processed_obj_li: T[] = []; const processed_obj_li: T[] = [];
for (const original_obj of obj_li) { for (const original_obj of obj_li) {
let processed_obj = { ...original_obj }; let processed_obj = { ...original_obj };
// --- Common Transformations --- // --- Common Transformations ---
// 1. Standardize ID and other '_random' fields // 1. Standardize ID and other '_random' fields
// The API often returns fields like 'person_id_random', which need to be aliased to 'person_id'. // The API often returns fields like 'person_id_random', which need to be aliased to 'person_id'.
for (const key in processed_obj) { for (const key in processed_obj) {
if (key.endsWith('_random')) { if (key.endsWith('_random')) {
const newKey = key.slice(0, -7); // Remove '_random' suffix const newKey = key.slice(0, -7); // Remove '_random' suffix
processed_obj[newKey] = processed_obj[key]; processed_obj[newKey] = processed_obj[key];
} }
} }
// Ensure 'id' is set from '[obj_type]_id_random' // Ensure 'id' is set from '[obj_type]_id_random'
const randomIdKey = `${obj_type}_id_random`; const randomIdKey = `${obj_type}_id_random`;
if (processed_obj[randomIdKey]) { if (processed_obj[randomIdKey]) {
(processed_obj as any).id = processed_obj[randomIdKey]; (processed_obj as any).id = processed_obj[randomIdKey];
} }
// 2. Create common computed properties for client-side sorting. // 2. Create common computed properties for client-side sorting.
const group = processed_obj.group ?? '0'; const group = processed_obj.group ?? '0';
const priority = processed_obj.priority ? 1 : 0; const priority = processed_obj.priority ? 1 : 0;
const sort = processed_obj.sort ?? '0'; const sort = processed_obj.sort ?? '0';
const updated = processed_obj.updated_on ?? processed_obj.created_on; const updated = processed_obj.updated_on ?? processed_obj.created_on;
const name = processed_obj.name ?? ''; const name = processed_obj.name ?? '';
(processed_obj as any).tmp_sort_1 = `${group}_${priority}_${sort}_${updated}`; (processed_obj as any).tmp_sort_1 = `${group}_${priority}_${sort}_${updated}`;
(processed_obj as any).tmp_sort_2 = `${group}_${priority}_${sort}_${name}_${updated}`; (processed_obj as any).tmp_sort_2 = `${group}_${priority}_${sort}_${name}_${updated}`;
// --- Specific Transformations --- // --- Specific Transformations ---
if (specific_processor) { if (specific_processor) {
processed_obj = await Promise.resolve(specific_processor(processed_obj)); processed_obj = await Promise.resolve(specific_processor(processed_obj));
} }
processed_obj_li.push(processed_obj as T); processed_obj_li.push(processed_obj as T);
} }
return processed_obj_li; return processed_obj_li;
} }
// Updated 2024-03-29 // Updated 2024-03-29
async function load_ae_obj_id__sponsorship_cfg({ async function load_ae_obj_id__sponsorship_cfg({
api_cfg, api_cfg,
sponsorship_cfg_id, sponsorship_cfg_id,
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
sponsorship_cfg_id: string; sponsorship_cfg_id: string;
try_cache: boolean; try_cache: boolean;
log_lvl: number; log_lvl: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** load_ae_obj_id__sponsorship_cfg() *** sponsorship_cfg_id=${sponsorship_cfg_id}` `*** load_ae_obj_id__sponsorship_cfg() *** sponsorship_cfg_id=${sponsorship_cfg_id}`
); );
} }
const params = {}; const params = {};
ae_promises.load__sponsorship_cfg_obj = api ae_promises.load__sponsorship_cfg_obj = api
.get_ae_obj_id_crud({ .get_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'sponsorship_cfg', obj_type: 'sponsorship_cfg',
obj_id: sponsorship_cfg_id, obj_id: sponsorship_cfg_id,
use_alt_table: false, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config. use_alt_table: false, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config.
use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value in the API config. use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value in the API config.
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (sponsorship_cfg_obj_get_result) { .then(async function (sponsorship_cfg_obj_get_result) {
if (sponsorship_cfg_obj_get_result) { if (sponsorship_cfg_obj_get_result) {
if (log_lvl) { if (log_lvl) {
console.log(`*spons_func* Got a result for sponsorship_cfg_id ${sponsorship_cfg_id}`); console.log(
} else if (log_lvl > 1) { `*spons_func* Got a result for sponsorship_cfg_id ${sponsorship_cfg_id}`
console.log( );
`*spons_func* Got a result for sponsorship_cfg_id ${sponsorship_cfg_id}:`, } else if (log_lvl > 1) {
sponsorship_cfg_obj_get_result console.log(
); `*spons_func* Got a result for sponsorship_cfg_id ${sponsorship_cfg_id}:`,
} sponsorship_cfg_obj_get_result
if (try_cache) { );
// Process the results first }
const processed_obj_li = await process_ae_obj__sponsorship_cfg_props({ if (try_cache) {
obj_li: [sponsorship_cfg_obj_get_result], // Process the results first
log_lvl: log_lvl const processed_obj_li = await process_ae_obj__sponsorship_cfg_props({
}); obj_li: [sponsorship_cfg_obj_get_result],
if (log_lvl) { log_lvl: log_lvl
console.log('Processed object list:', processed_obj_li); });
} if (log_lvl) {
// Save the updated results list to the database console.log('Processed object list:', processed_obj_li);
if (log_lvl) { }
console.log('Saving to DB...'); // Save the updated results list to the database
} if (log_lvl) {
await db_save_ae_obj_li__ae_obj({ console.log('Saving to DB...');
db_instance: db_sponsorships, }
table_name: 'cfg', await db_save_ae_obj_li__ae_obj({
obj_li: processed_obj_li, db_instance: db_sponsorships,
properties_to_save: properties_to_save_sponsorship_cfg, table_name: 'cfg',
log_lvl: log_lvl obj_li: processed_obj_li,
}); properties_to_save: properties_to_save_sponsorship_cfg,
if (log_lvl) { log_lvl: log_lvl
console.log('DB save completed.'); });
} if (log_lvl) {
} console.log('DB save completed.');
return sponsorship_cfg_obj_get_result; }
} else { }
console.log('No results returned.'); return sponsorship_cfg_obj_get_result;
return null; } else {
} console.log('No results returned.');
}) return null;
.catch(function (error: any) { }
console.log('No results returned or failed.', error); })
}); .catch(function (error: any) {
console.log('No results returned or failed.', error);
});
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__sponsorship_cfg_obj:', ae_promises.load__sponsorship_cfg_obj); console.log(
} 'ae_promises.load__sponsorship_cfg_obj:',
ae_promises.load__sponsorship_cfg_obj
);
}
return ae_promises.load__sponsorship_cfg_obj; return ae_promises.load__sponsorship_cfg_obj;
} }
// Updated 2024-03-29 // Updated 2024-03-29
async function load_ae_obj_id__sponsorship({ async function load_ae_obj_id__sponsorship({
api_cfg, api_cfg,
sponsorship_id, sponsorship_id,
try_cache = false, try_cache = false,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
sponsorship_id: string; sponsorship_id: string;
try_cache: boolean; try_cache: boolean;
log_lvl: number; log_lvl: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** load_ae_obj_id__sponsorship() *** sponsorship_id=${sponsorship_id}`); console.log(`*** load_ae_obj_id__sponsorship() *** sponsorship_id=${sponsorship_id}`);
} }
const params = {}; const params = {};
ae_promises.load__sponsorship_obj = api ae_promises.load__sponsorship_obj = api
.get_ae_obj_id_crud({ .get_ae_obj_id_crud({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'sponsorship', obj_type: 'sponsorship',
obj_id: sponsorship_id, obj_id: sponsorship_id,
use_alt_table: false, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config. use_alt_table: false, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config.
use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value in the API config. use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value in the API config.
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (sponsorship_obj_get_result) { .then(async function (sponsorship_obj_get_result) {
if (sponsorship_obj_get_result) { if (sponsorship_obj_get_result) {
if (log_lvl) { if (log_lvl) {
console.log(`*spons_func* Got a result for sponsorship_id ${sponsorship_id}`); console.log(`*spons_func* Got a result for sponsorship_id ${sponsorship_id}`);
} else if (log_lvl > 1) { } else if (log_lvl > 1) {
console.log( console.log(
`*spons_func* Got a result for sponsorship_id ${sponsorship_id}:`, `*spons_func* Got a result for sponsorship_id ${sponsorship_id}:`,
sponsorship_obj_get_result sponsorship_obj_get_result
); );
} }
if (try_cache) { if (try_cache) {
// Process the results first // Process the results first
const processed_obj_li = await process_ae_obj__sponsorship_props({ const processed_obj_li = await process_ae_obj__sponsorship_props({
obj_li: [sponsorship_obj_get_result], obj_li: [sponsorship_obj_get_result],
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('Processed object list:', processed_obj_li); console.log('Processed object list:', processed_obj_li);
} }
// Save the updated results list to the database // Save the updated results list to the database
if (log_lvl) { if (log_lvl) {
console.log('Saving to DB...'); console.log('Saving to DB...');
} }
await db_save_ae_obj_li__ae_obj({ await db_save_ae_obj_li__ae_obj({
db_instance: db_sponsorships, db_instance: db_sponsorships,
table_name: 'sponsorship', table_name: 'sponsorship',
obj_li: processed_obj_li, obj_li: processed_obj_li,
properties_to_save: properties_to_save_sponsorship, properties_to_save: properties_to_save_sponsorship,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('DB save completed.'); console.log('DB save completed.');
} }
} }
return sponsorship_obj_get_result; return sponsorship_obj_get_result;
} else { } else {
console.log('No results returned.'); console.log('No results returned.');
return null; return null;
} }
}) })
.catch(function (error: any) { .catch(function (error: any) {
console.log('No results returned or failed.', error); console.log('No results returned or failed.', error);
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__sponsorship_obj:', ae_promises.load__sponsorship_obj); console.log('ae_promises.load__sponsorship_obj:', ae_promises.load__sponsorship_obj);
} }
return ae_promises.load__sponsorship_obj; return ae_promises.load__sponsorship_obj;
} }
// Updated 2025-01-15 // Updated 2025-01-15
async function load_ae_obj_li__sponsorship({ async function load_ae_obj_li__sponsorship({
api_cfg, api_cfg,
for_obj_type = 'account', for_obj_type = 'account',
for_obj_id, for_obj_id,
enabled = 'enabled', enabled = 'enabled',
hidden = 'not_hidden', hidden = 'not_hidden',
limit = 99, limit = 99,
offset = 0, offset = 0,
order_by_li = { order_by_li = {
priority: 'DESC', priority: 'DESC',
sort: 'DESC', sort: 'DESC',
name: 'ASC', name: 'ASC',
updated_on: 'DESC', updated_on: 'DESC',
created_on: 'DESC' created_on: 'DESC'
}, },
params = {}, params = {},
try_cache = true, try_cache = true,
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
for_obj_type: string; for_obj_type: string;
for_obj_id: string; for_obj_id: string;
inc_content_li?: boolean; inc_content_li?: boolean;
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined; enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined; hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
limit?: number; limit?: number;
offset?: number; offset?: number;
order_by_li?: key_val; order_by_li?: key_val;
params?: key_val; params?: key_val;
try_cache?: boolean; try_cache?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log( console.log(
`*** load_ae_obj_li__sponsorship() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}` `*** load_ae_obj_li__sponsorship() *** for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}`
); );
} }
const params_json: key_val = {}; const params_json: key_val = {};
ae_promises.load__sponsorship_obj_li = await api ae_promises.load__sponsorship_obj_li = await api
.get_ae_obj_li_for_obj_id_crud_v2({ .get_ae_obj_li_for_obj_id_crud_v2({
api_cfg: api_cfg, api_cfg: api_cfg,
obj_type: 'sponsorship', obj_type: 'sponsorship',
for_obj_type: for_obj_type, for_obj_type: for_obj_type,
for_obj_id: for_obj_id, for_obj_id: for_obj_id,
use_alt_tbl: false, use_alt_tbl: false,
use_alt_mdl: false, use_alt_mdl: false,
use_alt_exp: false, use_alt_exp: false,
enabled: enabled, enabled: enabled,
hidden: hidden, hidden: hidden,
order_by_li: order_by_li, order_by_li: order_by_li,
limit: limit, limit: limit,
offset: offset, offset: offset,
params_json: params_json, params_json: params_json,
params: params, params: params,
log_lvl: log_lvl log_lvl: log_lvl
}) })
.then(async function (sponsorship_obj_li_get_result) { .then(async function (sponsorship_obj_li_get_result) {
if (sponsorship_obj_li_get_result) { if (sponsorship_obj_li_get_result) {
if (try_cache) { if (try_cache) {
// Process the results first // Process the results first
const processed_obj_li = await process_ae_obj__sponsorship_props({ const processed_obj_li = await process_ae_obj__sponsorship_props({
obj_li: sponsorship_obj_li_get_result, obj_li: sponsorship_obj_li_get_result,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('Processed object list:', processed_obj_li); console.log('Processed object list:', processed_obj_li);
} }
// Save the updated results list to the database // Save the updated results list to the database
if (log_lvl) { if (log_lvl) {
console.log('Saving to DB...'); console.log('Saving to DB...');
} }
await db_save_ae_obj_li__ae_obj({ await db_save_ae_obj_li__ae_obj({
db_instance: db_sponsorships, db_instance: db_sponsorships,
table_name: 'sponsorship', table_name: 'sponsorship',
obj_li: processed_obj_li, obj_li: processed_obj_li,
properties_to_save: properties_to_save_sponsorship, properties_to_save: properties_to_save_sponsorship,
log_lvl: log_lvl log_lvl: log_lvl
}); });
if (log_lvl) { if (log_lvl) {
console.log('DB save completed.'); console.log('DB save completed.');
} }
} }
return sponsorship_obj_li_get_result; return sponsorship_obj_li_get_result;
} else { } else {
return []; return [];
} }
}); });
if (log_lvl) { if (log_lvl) {
console.log('ae_promises.load__sponsorship_obj_li:', ae_promises.load__sponsorship_obj_li); console.log('ae_promises.load__sponsorship_obj_li:', ae_promises.load__sponsorship_obj_li);
} }
return ae_promises.load__sponsorship_obj_li; return ae_promises.load__sponsorship_obj_li;
} }
export async function download_export__sponsorship({ export async function download_export__sponsorship({
api_cfg, api_cfg,
account_id, account_id,
file_type = 'CSV', // 'CSV' or 'Excel' file_type = 'CSV', // 'CSV' or 'Excel'
return_file = true, return_file = true,
filename = 'no_filename.csv', filename = 'no_filename.csv',
auto_download = false, auto_download = false,
params = {}, // key value object is expected params = {}, // key value object is expected
log_lvl = 0 log_lvl = 0
}: { }: {
api_cfg: any; api_cfg: any;
account_id: string; account_id: string;
file_type?: string; file_type?: string;
return_file?: boolean; return_file?: boolean;
filename?: string; filename?: string;
auto_download?: boolean; auto_download?: boolean;
params?: key_val; params?: key_val;
log_lvl?: number; log_lvl?: number;
}) { }) {
console.log('*** stores_event_api.js: get_sponsorship_export() ***'); console.log('*** stores_event_api.js: get_sponsorship_export() ***');
const endpoint = `/v2/crud/sponsorship/list`; const endpoint = `/v2/crud/sponsorship/list`;
params['for_obj_type'] = 'account'; params['for_obj_type'] = 'account';
params['for_obj_id'] = account_id; params['for_obj_id'] = account_id;
if (file_type == 'CSV' || file_type == 'Excel') { if (file_type == 'CSV' || file_type == 'Excel') {
params['file_type'] = file_type; params['file_type'] = file_type;
} }
params['return_file'] = true; params['return_file'] = true;
ae_promises.download__sponsorship_export_file = await api.get_object({ ae_promises.download__sponsorship_export_file = await api.get_object({
api_cfg: api_cfg, api_cfg: api_cfg,
endpoint: endpoint, endpoint: endpoint,
params: params, params: params,
return_blob: return_file, return_blob: return_file,
filename: filename, filename: filename,
auto_download: auto_download, auto_download: auto_download,
log_lvl: log_lvl log_lvl: log_lvl
}); });
console.log( console.log(
'ae_promises.download__sponsorship_export_file:', 'ae_promises.download__sponsorship_export_file:',
ae_promises.download__sponsorship_export_file ae_promises.download__sponsorship_export_file
); );
return ae_promises.download__sponsorship_export_file; return ae_promises.download__sponsorship_export_file;
} }
const export_obj = { const export_obj = {
load_ae_obj_id__sponsorship_cfg: load_ae_obj_id__sponsorship_cfg, load_ae_obj_id__sponsorship_cfg: load_ae_obj_id__sponsorship_cfg,
load_ae_obj_id__sponsorship: load_ae_obj_id__sponsorship, load_ae_obj_id__sponsorship: load_ae_obj_id__sponsorship,
load_ae_obj_li__sponsorship: load_ae_obj_li__sponsorship, load_ae_obj_li__sponsorship: load_ae_obj_li__sponsorship,
download_export__sponsorship: download_export__sponsorship download_export__sponsorship: download_export__sponsorship
}; };
export const spons_func = export_obj; export const spons_func = export_obj;

View File

@@ -7,113 +7,113 @@ import type { key_val } from '$lib/stores/ae_stores';
// Updated 2025-01-15 // Updated 2025-01-15
export interface Sponsorship { export interface Sponsorship {
id: string; id: string;
// id_random: string; // id_random: string;
sponsorship_id: string; sponsorship_id: string;
// sponsorship_id_random: string; // sponsorship_id_random: string;
account_id: string; account_id: string;
// account_id_random: string; // account_id_random: string;
organization_id?: null | string; organization_id?: null | string;
person_id?: null | string; person_id?: null | string;
poc_person_id?: null | string; poc_person_id?: null | string;
poc_json?: null | string; poc_json?: null | string;
name: null | string; name: null | string;
name_override: null | string; name_override: null | string;
description?: null | string; description?: null | string;
email?: null | string; email?: null | string;
website_url?: null | string; website_url?: null | string;
// html_text?: null|string; // html_text?: null|string;
// thumbnail_url?: null|string; // thumbnail_url?: null|string;
// picture_url?: null|string; // picture_url?: null|string;
// video_url?: null|string; // video_url?: null|string;
// audio_url?: null|string; // audio_url?: null|string;
// image_url?: null|string; // image_url?: null|string;
// document_url?: null|string; // document_url?: null|string;
// logo_url?: null|string; // logo_url?: null|string;
logo_li_json?: null | string; logo_li_json?: null | string;
media_li_json?: null | string; media_li_json?: null | string;
social_li_json?: null | string; social_li_json?: null | string;
address_li_json?: null | string; address_li_json?: null | string;
contact_li_json?: null | string; contact_li_json?: null | string;
guest_li_json?: null | string; guest_li_json?: null | string;
level_num?: null | number; level_num?: null | number;
level_str?: null | string; level_str?: null | string;
amount?: null | number; // In dollars amount?: null | number; // In dollars
questions_li_json?: null | string; questions_li_json?: null | string;
agree?: null | boolean; // Catchall agree or consent agree?: null | boolean; // Catchall agree or consent
comments?: null | string; // From the sponsor comments?: null | string; // From the sponsor
staff_notes?: null | string; // Internal use; from staff staff_notes?: null | string; // Internal use; from staff
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Generated fields for sorting locally only // Generated fields for sorting locally only
tmp_sort_1?: null | string; tmp_sort_1?: null | string;
tmp_sort_2?: null | string; tmp_sort_2?: null | string;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
} }
// Updated 2025-01-15 // Updated 2025-01-15
export interface Sponsorship_Cfg { export interface Sponsorship_Cfg {
id: string; id: string;
// id_random: string; // id_random: string;
sponsorship_cfg_id: string; sponsorship_cfg_id: string;
// sponsorship_cfg_id_random: string; // sponsorship_cfg_id_random: string;
account_id: string; account_id: string;
// account_id_random: string; // account_id_random: string;
for_type?: null | string; for_type?: null | string;
for_id?: null | number; for_id?: null | number;
level_li_json?: null | string; level_li_json?: null | string;
option_li_json?: null | string; option_li_json?: null | string;
schedule_li_json?: null | string; schedule_li_json?: null | string;
cfg_json?: null | key_val; cfg_json?: null | key_val;
enable: null | boolean; enable: null | boolean;
hide?: null | boolean; hide?: null | boolean;
priority?: null | boolean; priority?: null | boolean;
sort?: null | number; sort?: null | number;
group?: null | string; group?: null | string;
notes?: null | string; notes?: null | string;
created_on: Date; created_on: Date;
updated_on?: null | Date; updated_on?: null | Date;
// Additional fields for convenience (database views) // Additional fields for convenience (database views)
} }
// Updated 2024-09-25 // Updated 2024-09-25
export class MySubClassedDexie extends Dexie { export class MySubClassedDexie extends Dexie {
// We just tell the typing system this is the case // We just tell the typing system this is the case
sponsorship!: Table<Sponsorship>; sponsorship!: Table<Sponsorship>;
cfg!: Table<Sponsorship_Cfg>; cfg!: Table<Sponsorship_Cfg>;
constructor() { constructor() {
super('ae_sponsorships_db'); super('ae_sponsorships_db');
this.version(1).stores({ this.version(1).stores({
sponsorship: ` sponsorship: `
id, sponsorship_id, id, sponsorship_id,
account_id, account_id,
poc_person_id, poc_person_id,
@@ -122,12 +122,12 @@ export class MySubClassedDexie extends Dexie {
agree, agree,
enable, hide, priority, sort, group, notes, created_on, updated_on, [updated_on+created_on], [created_on+updated_on]`, enable, hide, priority, sort, group, notes, created_on, updated_on, [updated_on+created_on], [created_on+updated_on]`,
cfg: ` cfg: `
id, sponsorship_cfg_id, id, sponsorship_cfg_id,
account_id, account_id,
for_type, for_id` for_type, for_id`
}); });
} }
} }
export const db_sponsorships = new MySubClassedDexie(); export const db_sponsorships = new MySubClassedDexie();

View File

@@ -1,10 +1,10 @@
// Import external files first. Eventually this will be broken up in to smaller files. // Import external files first. Eventually this will be broken up in to smaller files.
import { import {
clean_filename, clean_filename,
format_bytes, format_bytes,
guess_file_name, guess_file_name,
guess_file_extension, guess_file_extension,
get_file_hash get_file_hash
} from './ae_utils__files'; } from './ae_utils__files';
import { get_obj_li_w_match_prop } from './ae_utils__get_obj_li_w_match_prop'; import { get_obj_li_w_match_prop } from './ae_utils__get_obj_li_w_match_prop';
import { file_extension_icon } from './ae_utils__file_extension_icon'; import { file_extension_icon } from './ae_utils__file_extension_icon';
@@ -17,24 +17,24 @@ import { process_data_string } from './ae_utils__process_data_string';
import { set_obj_prop_display_name } from './ae_utils__set_obj_prop_display_name'; import { set_obj_prop_display_name } from './ae_utils__set_obj_prop_display_name';
import { return_obj_type_path } from './ae_utils__return_obj_type_path'; import { return_obj_type_path } from './ae_utils__return_obj_type_path';
import { import {
combine_iv_and_base64, combine_iv_and_base64,
encrypt_content, encrypt_content,
encrypt_wrapper, encrypt_wrapper,
decrypt_content, decrypt_content,
decrypt_wrapper decrypt_wrapper
} from './ae_utils__crypto'; } from './ae_utils__crypto';
export type key_str = { export type key_str = {
[key: string]: string; [key: string]: string;
}; };
export type key_val = { export type key_val = {
[key: string]: any; [key: string]: any;
}; };
/* This utility function will add commas to a number. */ /* This utility function will add commas to a number. */
function number_w_commas(x) { function number_w_commas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
} }
// This function will update the URL and send a message to the parent window (iframe). // This function will update the URL and send a message to the parent window (iframe).
@@ -45,110 +45,110 @@ function number_w_commas(x) {
// import { pushState, replaceState } from '$app/navigation'; // import { pushState, replaceState } from '$app/navigation';
function handle_url_and_message(name: string, value: null | string) { function handle_url_and_message(name: string, value: null | string) {
console.log(`*** handle_url_and_message() *** name=${name} value=${value}`); console.log(`*** handle_url_and_message() *** name=${name} value=${value}`);
const location = window.location.href; const location = window.location.href;
// console.log('location:', location); // console.log('location:', location);
const url = new URL(location); const url = new URL(location);
// console.log('url:', url); // console.log('url:', url);
if (value) { if (value) {
url.searchParams.set(name, value); url.searchParams.set(name, value);
history.pushState({}, '', url); history.pushState({}, '', url);
// console.log('url:', url); // console.log('url:', url);
// pushState(url.href, {}); // pushState(url.href, {});
// pushState(url.search, {}); // pushState(url.search, {});
// replaceState(url.href, {}); // replaceState(url.href, {});
const message = { name: value }; const message = { name: value };
window.parent.postMessage(message, '*'); window.parent.postMessage(message, '*');
} else { } else {
url.searchParams.delete(name); url.searchParams.delete(name);
history.pushState({}, '', url); history.pushState({}, '', url);
// console.log('url:', url); // console.log('url:', url);
// pushState({}, '', url.search); // pushState({}, '', url.search);
// pushState(url.href, {}); // pushState(url.href, {});
// replaceState(url.href, {}); // replaceState(url.href, {});
const message = { name: null }; const message = { name: null };
window.parent.postMessage(message, '*'); window.parent.postMessage(message, '*');
} }
// console.log('Message sent to parent (iframe):', message); // console.log('Message sent to parent (iframe):', message);
} }
function create_a_element({ function create_a_element({
account_id, account_id,
base_url, base_url,
hosted_file_id, hosted_file_id,
filename = null, filename = null,
extension = null, extension = null,
text = 'Download', text = 'Download',
class_li = 'text-blue-500' class_li = 'text-blue-500'
}) { }) {
return `<a href="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}&filename=${filename}" class="${class_li}">${text}</a>`; return `<a href="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}&filename=${filename}" class="${class_li}">${text}</a>`;
} }
function create_img_element({ function create_img_element({
account_id, account_id,
base_url, base_url,
hosted_file_id, hosted_file_id,
filename = null, filename = null,
extension = null, extension = null,
class_li = 'max-w-64', class_li = 'max-w-64',
style = '', style = '',
inc_link = false inc_link = false
}) { }) {
let img_html = ''; let img_html = '';
if (filename) { if (filename) {
img_html = `<img src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}&filename=${filename}" class="${class_li}" style="${style}" />`; img_html = `<img src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}&filename=${filename}" class="${class_li}" style="${style}" />`;
} else { } else {
img_html = `<img src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}" class="${class_li}" style="${style}" />`; img_html = `<img src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}" class="${class_li}" style="${style}" />`;
} }
if (inc_link) { if (inc_link) {
const a_html = create_a_element({ const a_html = create_a_element({
account_id: account_id, account_id: account_id,
base_url: base_url, base_url: base_url,
hosted_file_id: hosted_file_id, hosted_file_id: hosted_file_id,
filename: filename, filename: filename,
extension: extension extension: extension
}); });
img_html = `<div class="ae_img ae_a">${img_html}${a_html}</div>`; img_html = `<div class="ae_img ae_a">${img_html}${a_html}</div>`;
} }
return img_html; return img_html;
} }
function create_video_element({ function create_video_element({
account_id, account_id,
base_url, base_url,
hosted_file_id, hosted_file_id,
filename = null, filename = null,
extension = null, extension = null,
class_li = 'max-w-64', class_li = 'max-w-64',
inc_link = false inc_link = false
}) { }) {
let video_html = ''; let video_html = '';
if (filename) { if (filename) {
video_html = `<video src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}&filename=${filename}" controls class="${class_li}"></video>`; video_html = `<video src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}&filename=${filename}" controls class="${class_li}"></video>`;
} else { } else {
video_html = `<video src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}" controls class="${class_li}"></video>`; video_html = `<video src="${base_url}/hosted_file/${hosted_file_id}/download?x_no_account_id_token=${account_id}" controls class="${class_li}"></video>`;
} }
if (inc_link) { if (inc_link) {
const a_html = create_a_element({ const a_html = create_a_element({
account_id: account_id, account_id: account_id,
base_url: base_url, base_url: base_url,
hosted_file_id: hosted_file_id, hosted_file_id: hosted_file_id,
filename: filename, filename: filename,
extension: extension extension: extension
}); });
video_html = `<div class="ae_video ae_a">${video_html}${a_html}</div>`; video_html = `<div class="ae_video ae_a">${video_html}${a_html}</div>`;
} }
return video_html; return video_html;
} }
// // Clear the quick access type // // Clear the quick access type
@@ -171,66 +171,66 @@ function create_video_element({
// This function will take a long string (sentences or paragraphs) of text and return an estimated number of words. // This function will take a long string (sentences or paragraphs) of text and return an estimated number of words.
function count_words(text: string) { function count_words(text: string) {
if (!text || text.length < 1) { if (!text || text.length < 1) {
return false; return false;
} }
const count = text.trim().split(/\s+/).length; const count = text.trim().split(/\s+/).length;
return count; return count;
} }
// Updated 2024-06-19 // Updated 2024-06-19
// This function behaves weirdly. It needs to be reviewed and updated. // This function behaves weirdly. It needs to be reviewed and updated.
export const shorten_string = function shorten_string({ export const shorten_string = function shorten_string({
string, string,
max_length = 45, max_length = 45,
begin_length = 15, begin_length = 15,
end_length = 5, end_length = 5,
wildcard_length = 3 wildcard_length = 3
}: { }: {
string: undefined | string; string: undefined | string;
max_length?: number; max_length?: number;
begin_length?: number; begin_length?: number;
end_length?: number; end_length?: number;
wildcard_length?: number; wildcard_length?: number;
}) { }) {
// console.log('*** shorten_filename() ***'); // console.log('*** shorten_filename() ***');
if (!string || typeof string != 'string') { if (!string || typeof string != 'string') {
// console.log('Invalid string value passed'); // console.log('Invalid string value passed');
// return false; // return false;
return ''; return '';
} }
// NOTE: max_length is not the actual end result length. The actual max will be 45 characters. // NOTE: max_length is not the actual end result length. The actual max will be 45 characters.
// 20 part 1 characters, 5 part 2 characters, 20 part 3 characters // 20 part 1 characters, 5 part 2 characters, 20 part 3 characters
// let length = string.length; // let length = string.length;
const char_over = string.length - max_length; const char_over = string.length - max_length;
let new_string = null; let new_string = null;
let wildcards = char_over; let wildcards = char_over;
if (char_over > 0) { if (char_over > 0) {
const part1 = string.slice(0, begin_length); const part1 = string.slice(0, begin_length);
let part2 = ''; let part2 = '';
if (char_over > 5) { if (char_over > 5) {
wildcards = 5; wildcards = 5;
} else { } else {
} }
if (wildcard_length) { if (wildcard_length) {
part2 = '.'.repeat(wildcard_length); part2 = '.'.repeat(wildcard_length);
} else { } else {
part2 = '.'.repeat(wildcards); part2 = '.'.repeat(wildcards);
} }
const part3 = string.slice(end_length * -1); const part3 = string.slice(end_length * -1);
new_string = part1 + part2 + part3; new_string = part1 + part2 + part3;
} else { } else {
new_string = string; new_string = string;
} }
return new_string; return new_string;
}; };
// Updated 2024-06-19 // Updated 2024-06-19
@@ -238,69 +238,69 @@ export const shorten_string = function shorten_string({
// Example 1: The Original Long File Name.pdf -> The Orig....pdf // Example 1: The Original Long File Name.pdf -> The Orig....pdf
// Example 2: The Original Long File Name.html -> The Ori....html // Example 2: The Original Long File Name.html -> The Ori....html
function shorten_filename({ function shorten_filename({
filename, filename,
max_length = 20, max_length = 20,
slice_end_at = 15, slice_end_at = 15,
max_end_length = 5 max_end_length = 5
}: { }: {
filename: string; filename: string;
max_length?: number; max_length?: number;
slice_end_at?: number; slice_end_at?: number;
max_end_length?: number; max_end_length?: number;
}) { }) {
// console.log('*** shorten_filename() ***'); // console.log('*** shorten_filename() ***');
if (typeof filename !== 'string' || filename.length <= max_length) { if (typeof filename !== 'string' || filename.length <= max_length) {
return filename; return filename;
} }
let new_filename = null; let new_filename = null;
const char_over = filename.length - max_length; const char_over = filename.length - max_length;
let wildcards = char_over - 4; // The number of characters over the max length let wildcards = char_over - 4; // The number of characters over the max length
if (wildcards < 1) { if (wildcards < 1) {
return filename; // No point in changing the filename? return filename; // No point in changing the filename?
} }
const part_1 = filename.slice(0, slice_end_at); const part_1 = filename.slice(0, slice_end_at);
if (wildcards > 3) { if (wildcards > 3) {
wildcards = 3; wildcards = 3;
} else { } else {
} }
const part_2 = '.'.repeat(wildcards); const part_2 = '.'.repeat(wildcards);
const part_3 = filename.slice(max_end_length * -1); const part_3 = filename.slice(max_end_length * -1);
new_filename = part_1 + part_2 + part_3; new_filename = part_1 + part_2 + part_3;
return new_filename; return new_filename;
} }
export const ae_util = { export const ae_util = {
is_datetime_recent: is_datetime_recent, is_datetime_recent: is_datetime_recent,
process_permission_checks: process_permission_checks, process_permission_checks: process_permission_checks,
iso_datetime_formatter: iso_datetime_formatter, iso_datetime_formatter: iso_datetime_formatter,
clean_filename: clean_filename, clean_filename: clean_filename,
format_bytes: format_bytes, format_bytes: format_bytes,
number_w_commas: number_w_commas, number_w_commas: number_w_commas,
guess_file_name: guess_file_name, guess_file_name: guess_file_name,
guess_file_extension: guess_file_extension, guess_file_extension: guess_file_extension,
get_file_hash: get_file_hash, get_file_hash: get_file_hash,
get_obj_li_w_match_prop: get_obj_li_w_match_prop, get_obj_li_w_match_prop: get_obj_li_w_match_prop,
extract_prefixed_form_data: extract_prefixed_form_data, extract_prefixed_form_data: extract_prefixed_form_data,
process_data_string: process_data_string, process_data_string: process_data_string,
handle_url_and_message: handle_url_and_message, handle_url_and_message: handle_url_and_message,
create_a_element: create_a_element, create_a_element: create_a_element,
create_img_element: create_img_element, create_img_element: create_img_element,
create_video_element: create_video_element, create_video_element: create_video_element,
count_words: count_words, count_words: count_words,
to_title_case: to_title_case, to_title_case: to_title_case,
shorten_string: shorten_string, shorten_string: shorten_string,
shorten_filename: shorten_filename, shorten_filename: shorten_filename,
file_extension_icon: file_extension_icon, file_extension_icon: file_extension_icon,
set_obj_prop_display_name: set_obj_prop_display_name, set_obj_prop_display_name: set_obj_prop_display_name,
return_obj_type_path: return_obj_type_path, return_obj_type_path: return_obj_type_path,
combine_iv_and_base64: combine_iv_and_base64, combine_iv_and_base64: combine_iv_and_base64,
encrypt_content: encrypt_content, encrypt_content: encrypt_content,
encrypt_wrapper: encrypt_wrapper, encrypt_wrapper: encrypt_wrapper,
decrypt_content: decrypt_content, decrypt_content: decrypt_content,
decrypt_wrapper: decrypt_wrapper decrypt_wrapper: decrypt_wrapper
}; };

View File

@@ -2,126 +2,126 @@ const log_lvl = 0; // 0 = no logging, 1 = some logging, 2 = all logging
// Updated 2025-05-08 // Updated 2025-05-08
async function generate_iv() { async function generate_iv() {
const data = new Uint8Array(16); const data = new Uint8Array(16);
crypto.getRandomValues(data); crypto.getRandomValues(data);
return data; return data;
} }
// Updated 2025-05-08 // Updated 2025-05-08
export const encrypt_content = async function encrypt_content(content: string, keyData: string) { export const encrypt_content = async function encrypt_content(content: string, keyData: string) {
const iv = await generate_iv(); const iv = await generate_iv();
const keyBytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(keyData)); const keyBytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(keyData));
const key = await crypto.subtle.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, [ const key = await crypto.subtle.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, [
'encrypt' 'encrypt'
]); ]);
const encodedContent = await crypto.subtle.encrypt( const encodedContent = await crypto.subtle.encrypt(
{ name: 'AES-CBC', iv }, { name: 'AES-CBC', iv },
key, key,
new TextEncoder().encode(content) new TextEncoder().encode(content)
); );
const base64 = btoa(String.fromCharCode(...new Uint8Array(encodedContent))); const base64 = btoa(String.fromCharCode(...new Uint8Array(encodedContent)));
if (log_lvl) { if (log_lvl) {
console.log(`IV: ${iv}; Encrypted:`, base64); console.log(`IV: ${iv}; Encrypted:`, base64);
} }
return { base64, iv }; return { base64, iv };
}; };
// Updated 2025-05-08 // Updated 2025-05-08
export const combine_iv_and_base64 = function combine_iv_and_base64( export const combine_iv_and_base64 = function combine_iv_and_base64(
base64: string, base64: string,
iv: Uint8Array iv: Uint8Array
) { ) {
if (log_lvl) { if (log_lvl) {
console.log(`IV: ${iv}; Encrypted:`, base64); console.log(`IV: ${iv}; Encrypted:`, base64);
} }
// Combine the IV and encrypted content // Combine the IV and encrypted content
const combined = const combined =
Array.from(iv) Array.from(iv)
.map((byte) => byte.toString(16).padStart(2, '0')) .map((byte) => byte.toString(16).padStart(2, '0'))
.join('') + .join('') +
':' + ':' +
base64; base64;
if (log_lvl) { if (log_lvl) {
console.log('Combined IV and Base64:', combined); console.log('Combined IV and Base64:', combined);
} }
// const ivBase64 = btoa(String.fromCharCode(...iv)); // const ivBase64 = btoa(String.fromCharCode(...iv));
// const combined = `${ivBase64}:${base64}`; // const combined = `${ivBase64}:${base64}`;
// console.log('Combined IV and Base64 v2:', combined); // console.log('Combined IV and Base64 v2:', combined);
return combined; return combined;
}; };
// Updated 2025-05-08 // Updated 2025-05-08
export const encrypt_wrapper = async function encrypt_wrapper(content: string, keyData: string) { export const encrypt_wrapper = async function encrypt_wrapper(content: string, keyData: string) {
if (!content) { if (!content) {
console.error('No content provided. Returning empty string.'); console.error('No content provided. Returning empty string.');
return ''; return '';
} }
if (!keyData) { if (!keyData) {
console.error('No keyData provided. Returning empty string.'); console.error('No keyData provided. Returning empty string.');
return ''; return '';
} }
const { base64, iv } = await encrypt_content(content, keyData); const { base64, iv } = await encrypt_content(content, keyData);
const combined = combine_iv_and_base64(base64, iv); const combined = combine_iv_and_base64(base64, iv);
return combined; return combined;
}; };
// This does not handle errors (invalid key/password) well. // This does not handle errors (invalid key/password) well.
// Updated 2025-05-08 // Updated 2025-05-08
export const decrypt_content = async function decrypt_content( export const decrypt_content = async function decrypt_content(
base64Content: string, base64Content: string,
iv: Uint8Array, iv: Uint8Array,
keyData: string keyData: string
) { ) {
const keyBytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(keyData)); const keyBytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(keyData));
const key = await crypto.subtle.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, [ const key = await crypto.subtle.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, [
'decrypt' 'decrypt'
]); ]);
const encryptedContent = Uint8Array.from(atob(base64Content), (c) => c.charCodeAt(0)); const encryptedContent = Uint8Array.from(atob(base64Content), (c) => c.charCodeAt(0));
const decryptedContent = await crypto.subtle.decrypt( const decryptedContent = await crypto.subtle.decrypt(
{ name: 'AES-CBC', iv }, { name: 'AES-CBC', iv },
key, key,
encryptedContent encryptedContent
); );
const decodedContent = new TextDecoder().decode(decryptedContent); const decodedContent = new TextDecoder().decode(decryptedContent);
// console.log('Decrypted Content:', decodedContent); // console.log('Decrypted Content:', decodedContent);
return decodedContent; return decodedContent;
}; };
// Updated 2025-05-08 // Updated 2025-05-08
export const split_iv_and_base64 = function split_iv_and_base64(combined: string) { export const split_iv_and_base64 = function split_iv_and_base64(combined: string) {
if (!combined) { if (!combined) {
console.error('No combined string provided. Returning empty object.'); console.error('No combined string provided. Returning empty object.');
return { iv: new Uint8Array(), base64: '' }; return { iv: new Uint8Array(), base64: '' };
} }
const [iv_hex, encrypted_base64_string] = combined.split(':'); const [iv_hex, encrypted_base64_string] = combined.split(':');
const base64 = encrypted_base64_string; const base64 = encrypted_base64_string;
const iv = new Uint8Array(iv_hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); const iv = new Uint8Array(iv_hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
if (log_lvl) { if (log_lvl) {
console.log(`IV: ${iv}; Encrypted:`, base64); console.log(`IV: ${iv}; Encrypted:`, base64);
} }
return { iv, base64 }; return { iv, base64 };
}; };
// Updated 2025-05-15 // Updated 2025-05-15
export const decrypt_wrapper = async function decrypt_wrapper(combined: string, keyData: string) { export const decrypt_wrapper = async function decrypt_wrapper(combined: string, keyData: string) {
if (!combined) { if (!combined) {
console.error('No combined string provided. Returning empty string.'); console.error('No combined string provided. Returning empty string.');
return false; return false;
} }
const { iv, base64 } = split_iv_and_base64(combined); const { iv, base64 } = split_iv_and_base64(combined);
console.log(`IV: ${iv}; Encrypted:`, base64); console.log(`IV: ${iv}; Encrypted:`, base64);
let decrypted; let decrypted;
try { try {
decrypted = await decrypt_content(base64, iv, keyData); decrypted = await decrypt_content(base64, iv, keyData);
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`IV: ${iv}; Decrypted:`, decrypted); console.log(`IV: ${iv}; Decrypted:`, decrypted);
} else if (log_lvl) { } else if (log_lvl) {
console.log(`IV: ${iv}`); console.log(`IV: ${iv}`);
} }
} catch (error) { } catch (error) {
console.error('Decryption failed:', error); console.error('Decryption failed:', error);
return false; return false;
} }
return decrypted; return decrypted;
}; };

View File

@@ -1,176 +1,176 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
export const iso_datetime_formatter = function iso_datetime_formatter( export const iso_datetime_formatter = function iso_datetime_formatter(
raw_datetime: null | string | Date = null, raw_datetime: null | string | Date = null,
named_format: string = 'datetime_iso_no_seconds', // date_iso, datetime_iso_no_seconds named_format: string = 'datetime_iso_no_seconds', // date_iso, datetime_iso_no_seconds
time_24_hours: boolean = false time_24_hours: boolean = false
) { ) {
// console.log('*** iso_datetime_formatter() ***'); // console.log('*** iso_datetime_formatter() ***');
// https://en.wikipedia.org/wiki/ISO_8601 // https://en.wikipedia.org/wiki/ISO_8601
// https://day.js.org/docs/en/display/format // https://day.js.org/docs/en/display/format
// ISO 8601-1:2019 includes the T before the time portion // ISO 8601-1:2019 includes the T before the time portion
// ISO 8601-1:2019 midnight may only be referred to as "00:00", corresponding to the beginning of a calendar day // ISO 8601-1:2019 midnight may only be referred to as "00:00", corresponding to the beginning of a calendar day
// and "24:00" is no longer allowed corresponding to the end of a day // and "24:00" is no longer allowed corresponding to the end of a day
// 60 is only used to denote an added leap second // 60 is only used to denote an added leap second
// ISO 8601 UTC: 2021-03-04T19:04:44+00:00 // ISO 8601 UTC: 2021-03-04T19:04:44+00:00
// ISO 8601 UTC: 2021-03-04T19:04:44Z // ISO 8601 UTC: 2021-03-04T19:04:44Z
// ISO 8601 UTC: 20210304T190444Z // ISO 8601 UTC: 20210304T190444Z
// datetime_iso 'YYYY-MM-DD HH:mm:ss' // datetime_iso 'YYYY-MM-DD HH:mm:ss'
// datetime_iso_12 'YYYY-MM-DD hh:mm:ss A' // datetime_iso_12 'YYYY-MM-DD hh:mm:ss A'
// datetime_iso_12_short 'YY-MM-DD hh:mm A' // datetime_iso_12_short 'YY-MM-DD hh:mm A'
// datetime_iso_tz 'YYYY-MM-DD HH:mm:ss Z' // datetime_iso_tz 'YYYY-MM-DD HH:mm:ss Z'
// datetime_12_no_seconds 'YYYY-MM-DD hh:mm A' // datetime_12_no_seconds 'YYYY-MM-DD hh:mm A'
// datetime_long 'dddd, MMMM D, YYYY hh:mm:ss A' // datetime_long 'dddd, MMMM D, YYYY hh:mm:ss A'
// datetime_medium 'ddd, MMM D, YYYY hh:mm:ss A' // datetime_medium 'ddd, MMM D, YYYY hh:mm:ss A'
// datetime_short 'MMM D, YY hh:mm A' // datetime_short 'MMM D, YY hh:mm A'
// date_iso 'YYYY-MM-DD' // date_iso 'YYYY-MM-DD'
// date_long 'dddd, MMMM D, YYYY' // date_long 'dddd, MMMM D, YYYY'
// date_medium 'ddd, MMM D, YYYY' // date_medium 'ddd, MMM D, YYYY'
// date_short 'MMM D, YY' // date_short 'MMM D, YY'
// time_iso 'HH:mm:ss' // time_iso 'HH:mm:ss'
// time_iso_12 'hh:mm:ss A' // time_iso_12 'hh:mm:ss A'
// time_iso_tz 'HH:mm:ss Z' // time_iso_tz 'HH:mm:ss Z'
// time_iso_12_tz 'hh:mm:ss A Z' // time_iso_12_tz 'hh:mm:ss A Z'
// time_long 'hh:mm:ss A' // time_long 'hh:mm:ss A'
// time_medium 'h:m:s A' // time_medium 'h:m:s A'
// time_short 'hh:mm A' // time_short 'hh:mm A'
// dayjs(raw_datetime).format('dddd, MMMM D, YYYY hh:mm:ss A'); // dayjs(raw_datetime).format('dddd, MMMM D, YYYY hh:mm:ss A');
if (!raw_datetime) { if (!raw_datetime) {
raw_datetime = new Date(); // Get the current datetime if one was not passed. raw_datetime = new Date(); // Get the current datetime if one was not passed.
} }
let datetime_string = null; let datetime_string = null;
switch (named_format) { switch (named_format) {
case 'datetime_iso': case 'datetime_iso':
datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm:ss'); datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm:ss');
break; break;
case 'datetime_iso_no_seconds': case 'datetime_iso_no_seconds':
datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm'); datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm');
break; break;
case 'datetime_iso_12_short': case 'datetime_iso_12_short':
datetime_string = dayjs(raw_datetime).format('YY-MM-DD hh:mm A'); datetime_string = dayjs(raw_datetime).format('YY-MM-DD hh:mm A');
break; break;
case 'datetime_iso_12_short_month': case 'datetime_iso_12_short_month':
datetime_string = dayjs(raw_datetime).format('MM-DD hh:mm A'); datetime_string = dayjs(raw_datetime).format('MM-DD hh:mm A');
break; break;
case 'datetime_iso_tz': case 'datetime_iso_tz':
datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm:ss Z'); datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm:ss Z');
break; break;
case 'datetime_iso_12_no_seconds': case 'datetime_iso_12_no_seconds':
datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD hh:mm A'); datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD hh:mm A');
break; break;
// case 'datetime_12_no_seconds': // case 'datetime_12_no_seconds':
// datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD hh:mm A'); // datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD hh:mm A');
// break; // break;
case 'datetime_us': case 'datetime_us':
datetime_string = dayjs(raw_datetime).format('MM/DD/YYYY hh:mm:ss A'); datetime_string = dayjs(raw_datetime).format('MM/DD/YYYY hh:mm:ss A');
break; break;
case 'datetime_short': case 'datetime_short':
datetime_string = dayjs(raw_datetime).format('MMM D, YY HH:mm'); datetime_string = dayjs(raw_datetime).format('MMM D, YY HH:mm');
break; break;
case 'datetime_12_short': case 'datetime_12_short':
datetime_string = dayjs(raw_datetime).format('MMM D, YY hh:mm A'); datetime_string = dayjs(raw_datetime).format('MMM D, YY hh:mm A');
break; break;
case 'datetime_medium': case 'datetime_medium':
datetime_string = dayjs(raw_datetime).format('MMM D, YYYY H:mm'); datetime_string = dayjs(raw_datetime).format('MMM D, YYYY H:mm');
break; break;
case 'datetime_12_medium': case 'datetime_12_medium':
datetime_string = dayjs(raw_datetime).format('MMM D, YYYY h:mm A'); datetime_string = dayjs(raw_datetime).format('MMM D, YYYY h:mm A');
break; break;
case 'datetime_long': case 'datetime_long':
datetime_string = dayjs(raw_datetime).format('MMMM D, YYYY HH:mm'); datetime_string = dayjs(raw_datetime).format('MMMM D, YYYY HH:mm');
break; break;
case 'datetime_12_long': case 'datetime_12_long':
datetime_string = dayjs(raw_datetime).format('MMMM D, YYYY hh:mm A'); datetime_string = dayjs(raw_datetime).format('MMMM D, YYYY hh:mm A');
break; break;
case 'datetime_medium_sec': case 'datetime_medium_sec':
datetime_string = dayjs(raw_datetime).format('MMM D, YYYY H:mm:ss'); datetime_string = dayjs(raw_datetime).format('MMM D, YYYY H:mm:ss');
break; break;
case 'datetime_12_medium_sec': case 'datetime_12_medium_sec':
datetime_string = dayjs(raw_datetime).format('MMM D, YYYY h:mm:ss A'); datetime_string = dayjs(raw_datetime).format('MMM D, YYYY h:mm:ss A');
break; break;
case 'datetime_short_month': case 'datetime_short_month':
datetime_string = dayjs(raw_datetime).format('MMM D hh:mm A'); datetime_string = dayjs(raw_datetime).format('MMM D hh:mm A');
break; break;
case 'datetime_long_month': case 'datetime_long_month':
datetime_string = dayjs(raw_datetime).format('MMMM D hh:mm A'); datetime_string = dayjs(raw_datetime).format('MMMM D hh:mm A');
break; break;
case 'datetime_short_day': case 'datetime_short_day':
datetime_string = dayjs(raw_datetime).format('D hh:mm A'); datetime_string = dayjs(raw_datetime).format('D hh:mm A');
break; break;
case 'date_iso': case 'date_iso':
datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD'); datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD');
break; break;
case 'date_us': case 'date_us':
datetime_string = dayjs(raw_datetime).format('MM/DD/YYYY'); datetime_string = dayjs(raw_datetime).format('MM/DD/YYYY');
break; break;
case 'date_long_month_day': case 'date_long_month_day':
datetime_string = dayjs(raw_datetime).format('MMMM D'); datetime_string = dayjs(raw_datetime).format('MMMM D');
break; break;
case 'date_short': case 'date_short':
datetime_string = dayjs(raw_datetime).format('MMM D, YY'); datetime_string = dayjs(raw_datetime).format('MMM D, YY');
break; break;
case 'date_short_no_year': case 'date_short_no_year':
datetime_string = dayjs(raw_datetime).format('MMM D'); datetime_string = dayjs(raw_datetime).format('MMM D');
break; break;
case 'date_long': case 'date_long':
datetime_string = dayjs(raw_datetime).format('MMMM D, YYYY'); datetime_string = dayjs(raw_datetime).format('MMMM D, YYYY');
break; break;
case 'date_full': case 'date_full':
datetime_string = dayjs(raw_datetime).format('dddd, MMMM D, YYYY'); datetime_string = dayjs(raw_datetime).format('dddd, MMMM D, YYYY');
break; break;
case 'date_full_no_year': case 'date_full_no_year':
datetime_string = dayjs(raw_datetime).format('dddd, MMMM D'); datetime_string = dayjs(raw_datetime).format('dddd, MMMM D');
break; break;
case 'time_iso': case 'time_iso':
datetime_string = dayjs(raw_datetime).format('HH:mm:ss'); datetime_string = dayjs(raw_datetime).format('HH:mm:ss');
break; break;
case 'time_iso_12_tz': case 'time_iso_12_tz':
datetime_string = dayjs(raw_datetime).format('hh:mm:ss A Z'); datetime_string = dayjs(raw_datetime).format('hh:mm:ss A Z');
break; break;
case 'time_long': case 'time_long':
datetime_string = dayjs(raw_datetime).format('HH:mm:ss'); datetime_string = dayjs(raw_datetime).format('HH:mm:ss');
break; break;
case 'time_12_long': case 'time_12_long':
datetime_string = dayjs(raw_datetime).format('hh:mm:ss A'); datetime_string = dayjs(raw_datetime).format('hh:mm:ss A');
break; break;
case 'time_short': case 'time_short':
datetime_string = dayjs(raw_datetime).format('HH:mm'); datetime_string = dayjs(raw_datetime).format('HH:mm');
break; break;
case 'time_short_no_leading': case 'time_short_no_leading':
datetime_string = dayjs(raw_datetime).format('H:mm'); datetime_string = dayjs(raw_datetime).format('H:mm');
break; break;
case 'time_12_short': case 'time_12_short':
datetime_string = dayjs(raw_datetime).format('hh:mm A'); datetime_string = dayjs(raw_datetime).format('hh:mm A');
break; break;
case 'time_12_short_no_leading': case 'time_12_short_no_leading':
datetime_string = dayjs(raw_datetime).format('h:mm A'); datetime_string = dayjs(raw_datetime).format('h:mm A');
break; break;
case 'week_long': case 'week_long':
datetime_string = dayjs(raw_datetime).format('dddd'); datetime_string = dayjs(raw_datetime).format('dddd');
break; break;
case 'week_medium': case 'week_medium':
datetime_string = dayjs(raw_datetime).format('ddd'); datetime_string = dayjs(raw_datetime).format('ddd');
break; break;
case 'week_short': case 'week_short':
datetime_string = dayjs(raw_datetime).format('dd'); datetime_string = dayjs(raw_datetime).format('dd');
break; break;
default: default:
// console.log(`The named format passed (${named_format}) did not match a common name. Trying to format with the named format value.`); // console.log(`The named format passed (${named_format}) did not match a common name. Trying to format with the named format value.`);
datetime_string = dayjs(raw_datetime).format(named_format); datetime_string = dayjs(raw_datetime).format(named_format);
// datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm:ss'); // datetime_string = dayjs(raw_datetime).format('YYYY-MM-DD HH:mm:ss');
} }
return datetime_string; return datetime_string;
}; };

View File

@@ -1,5 +1,5 @@
type key_val = { type key_val = {
[key: string]: any; [key: string]: any;
}; };
/* This utility function looks for any form data with the prefixed name passed and returns a new object. /* This utility function looks for any form data with the prefixed name passed and returns a new object.
@@ -12,121 +12,121 @@ type key_val = {
* Updated 2023-12-22 * Updated 2023-12-22
*/ */
export const extract_prefixed_form_data = function extract_prefixed_form_data({ export const extract_prefixed_form_data = function extract_prefixed_form_data({
prefix = null, prefix = null,
form_data = {}, form_data = {},
rm_empty_id = true, rm_empty_id = true,
rm_empty = false, rm_empty = false,
trim_values = false, trim_values = false,
bool_tf_str = false, bool_tf_str = false,
log_lvl = 0 log_lvl = 0
}: { }: {
prefix: string | null; prefix: string | null;
form_data: any; form_data: any;
rm_empty_id?: boolean; rm_empty_id?: boolean;
rm_empty?: boolean; rm_empty?: boolean;
trim_values?: boolean; trim_values?: boolean;
bool_tf_str?: boolean; bool_tf_str?: boolean;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log('*** extract_prefixed_form_data() ***'); console.log('*** extract_prefixed_form_data() ***');
if (prefix) { if (prefix) {
console.log( console.log(
`Looking for prefixed fields: ${prefix}; Removing emptry ID fields: ${rm_empty_id}; Removing empty fields: ${rm_empty}; Trim string values: ${trim_values}; Convert true/false string values to boolean: ${bool_tf_str}` `Looking for prefixed fields: ${prefix}; Removing emptry ID fields: ${rm_empty_id}; Removing empty fields: ${rm_empty}; Trim string values: ${trim_values}; Convert true/false string values to boolean: ${bool_tf_str}`
); );
} else { } else {
console.log( console.log(
`No prefix set. Looking at all fields. Removing emptry ID fields: ${rm_empty_id}; Removing empty fields: ${rm_empty}; Trim string values: ${trim_values}; Convert true/false string values to boolean: ${bool_tf_str}` `No prefix set. Looking at all fields. Removing emptry ID fields: ${rm_empty_id}; Removing empty fields: ${rm_empty}; Trim string values: ${trim_values}; Convert true/false string values to boolean: ${bool_tf_str}`
); );
} }
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Form Data:'); console.log('Form Data:');
console.log(form_data); console.log(form_data);
} }
// const data_obj: any = {}; // future TS // const data_obj: any = {}; // future TS
const data_obj: key_val = {}; const data_obj: key_val = {};
for (const field of form_data) { for (const field of form_data) {
let [obj_prop_name, obj_prop_value] = field; let [obj_prop_name, obj_prop_value] = field;
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`${obj_prop_name}: ${obj_prop_value} type=${typeof obj_prop_value}`); console.log(`${obj_prop_name}: ${obj_prop_value} type=${typeof obj_prop_value}`);
} }
// Trim string values if needed // Trim string values if needed
if (trim_values && typeof obj_prop_value === 'string') { if (trim_values && typeof obj_prop_value === 'string') {
if (log_lvl && obj_prop_value.trim() != obj_prop_value) { if (log_lvl && obj_prop_value.trim() != obj_prop_value) {
console.log('Trimming string value!'); console.log('Trimming string value!');
obj_prop_value = obj_prop_value.trim(); obj_prop_value = obj_prop_value.trim();
} }
} }
// Convert string to boolean if needed // Convert string to boolean if needed
if (bool_tf_str && typeof obj_prop_value === 'string') { if (bool_tf_str && typeof obj_prop_value === 'string') {
// console.log('Flag set for converting true/false string values to boolean!'); // console.log('Flag set for converting true/false string values to boolean!');
if (obj_prop_value.toLowerCase() === 'true') { if (obj_prop_value.toLowerCase() === 'true') {
if (log_lvl) { if (log_lvl) {
console.log('Converting string to boolean value: true'); console.log('Converting string to boolean value: true');
} }
obj_prop_value = true; obj_prop_value = true;
} else if (obj_prop_value.toLowerCase() === 'false') { } else if (obj_prop_value.toLowerCase() === 'false') {
if (log_lvl) { if (log_lvl) {
console.log('Converting string to boolean value: false'); console.log('Converting string to boolean value: false');
} }
obj_prop_value = false; obj_prop_value = false;
} }
} }
if (prefix && obj_prop_name.startsWith(prefix)) { if (prefix && obj_prop_name.startsWith(prefix)) {
// Prefix set // Prefix set
// if (obj_prop_name.startsWith(prefix)) { // if (obj_prop_name.startsWith(prefix)) {
obj_prop_name = obj_prop_name.replace(prefix, ''); obj_prop_name = obj_prop_name.replace(prefix, '');
if (log_lvl) { if (log_lvl) {
console.log(`Checking: (${prefix})${obj_prop_name} value=${obj_prop_value}`); console.log(`Checking: (${prefix})${obj_prop_name} value=${obj_prop_value}`);
} }
if (rm_empty_id && obj_prop_name.endsWith('id_random') && !obj_prop_value) { if (rm_empty_id && obj_prop_name.endsWith('id_random') && !obj_prop_value) {
if (log_lvl) { if (log_lvl) {
console.log(`Match but empty *_id_random. Ignoring/removing: ${obj_prop_name}`); console.log(`Match but empty *_id_random. Ignoring/removing: ${obj_prop_name}`);
} }
} else if (rm_empty && !obj_prop_value) { } else if (rm_empty && !obj_prop_value) {
if (log_lvl) { if (log_lvl) {
console.log(`Match but empty. Ignoring/removing: ${obj_prop_name}`); console.log(`Match but empty. Ignoring/removing: ${obj_prop_name}`);
} }
} else { } else {
if (log_lvl) { if (log_lvl) {
console.log(`Match: ${prefix})${obj_prop_name} value=${obj_prop_value}`); console.log(`Match: ${prefix})${obj_prop_name} value=${obj_prop_value}`);
} }
data_obj[obj_prop_name] = obj_prop_value; data_obj[obj_prop_name] = obj_prop_value;
} }
} else if (prefix && !obj_prop_name.startsWith(prefix)) { } else if (prefix && !obj_prop_name.startsWith(prefix)) {
// Prefix set // Prefix set
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Did not start with prefix. Ignoring'); console.log('Did not start with prefix. Ignoring');
} }
} else { } else {
// No prefix set // No prefix set
if (log_lvl) { if (log_lvl) {
console.log(`Checking: ${obj_prop_name} value=${obj_prop_value}`); console.log(`Checking: ${obj_prop_name} value=${obj_prop_value}`);
} }
if (rm_empty_id && obj_prop_name.endsWith('id_random') && !obj_prop_value) { if (rm_empty_id && obj_prop_name.endsWith('id_random') && !obj_prop_value) {
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`Match but empty *_id_random. Ignoring/removing: ${obj_prop_name}`); console.log(`Match but empty *_id_random. Ignoring/removing: ${obj_prop_name}`);
} }
} else if (rm_empty && !obj_prop_value) { } else if (rm_empty && !obj_prop_value) {
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`Match but empty. Ignoring/removing: ${obj_prop_name}`); console.log(`Match but empty. Ignoring/removing: ${obj_prop_name}`);
} }
} else { } else {
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`Match: ${obj_prop_name} value=${obj_prop_value}`); console.log(`Match: ${obj_prop_name} value=${obj_prop_value}`);
} }
data_obj[obj_prop_name] = obj_prop_value; data_obj[obj_prop_name] = obj_prop_value;
} }
} }
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(data_obj); console.log(data_obj);
} }
return data_obj; return data_obj;
}; };

View File

@@ -2,49 +2,49 @@ import type { key_str } from './ae_utils';
// Updated 2024-06-19 // Updated 2024-06-19
export function file_extension_icon(extension: string) { export function file_extension_icon(extension: string) {
// console.log('*** file_extension_icon() ***'); // console.log('*** file_extension_icon() ***');
const file_icons: key_str = { const file_icons: key_str = {
file: 'file', file: 'file',
'3gp': 'file-video', '3gp': 'file-video',
'7z': 'file-archive', '7z': 'file-archive',
aac: 'file-audio', aac: 'file-audio',
ac3: 'file-audio', ac3: 'file-audio',
aif: 'file-audio', aif: 'file-audio',
aiff: 'file-audio', aiff: 'file-audio',
avi: 'file-video', avi: 'file-video',
bmp: 'file-image', bmp: 'file-image',
csv: 'file-csv', csv: 'file-csv',
doc: 'file-word', doc: 'file-word',
docx: 'file-word', docx: 'file-word',
eps: 'file-image', eps: 'file-image',
flac: 'file-audio', flac: 'file-audio',
gif: 'file-image', gif: 'file-image',
htm: 'file-code', htm: 'file-code',
html: 'file-code', html: 'file-code',
jpeg: 'file-image', jpeg: 'file-image',
jpg: 'file-image', jpg: 'file-image',
key: 'file-powerpoint', key: 'file-powerpoint',
mkv: 'file-video', mkv: 'file-video',
mov: 'file-video', mov: 'file-video',
mp3: 'file-audio', mp3: 'file-audio',
mp4: 'file-video', mp4: 'file-video',
odp: 'file-powerpoint', odp: 'file-powerpoint',
pdf: 'file-pdf', pdf: 'file-pdf',
png: 'file-image', png: 'file-image',
ppt: 'file-powerpoint', ppt: 'file-powerpoint',
pptx: 'file-powerpoint', pptx: 'file-powerpoint',
txt: 'file-alt', txt: 'file-alt',
wav: 'file-audio', wav: 'file-audio',
webp: 'file-image', webp: 'file-image',
xls: 'file-excel', xls: 'file-excel',
xlsx: 'file-excel', xlsx: 'file-excel',
zip: 'file-archive' zip: 'file-archive'
}; };
if (file_icons[extension]) { if (file_icons[extension]) {
return file_icons[extension]; return file_icons[extension];
} else { } else {
// return null; // return null;
return file_icons['file']; return file_icons['file'];
} }
} }

View File

@@ -3,84 +3,84 @@
// Use a defined list of unacceptable characters to remove from a filename. // Use a defined list of unacceptable characters to remove from a filename.
// Updated 2024-10-18 // Updated 2024-10-18
export const clean_filename = function clean_filename( export const clean_filename = function clean_filename(
filename: any | string, filename: any | string,
unacceptable_chars: RegExp = /[ <>:"/\\|?*]/g, unacceptable_chars: RegExp = /[ <>:"/\\|?*]/g,
replacement_char: string = '_' replacement_char: string = '_'
) { ) {
// console.log('*** clean_filename() ***'); // console.log('*** clean_filename() ***');
if (!filename) { if (!filename) {
return ''; return '';
} }
const cleaned_filename = filename.replace(unacceptable_chars, replacement_char); const cleaned_filename = filename.replace(unacceptable_chars, replacement_char);
// console.log(cleaned_filename); // console.log(cleaned_filename);
return cleaned_filename; return cleaned_filename;
}; };
export const format_bytes = function format_bytes(bytes: number, decimals: number = 2) { export const format_bytes = function format_bytes(bytes: number, decimals: number = 2) {
if (bytes === 0) return '0 Bytes'; if (bytes === 0) return '0 Bytes';
const k = 1024; const k = 1024;
const dm = decimals < 0 ? 0 : decimals; const dm = decimals < 0 ? 0 : decimals;
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const i = Math.floor(Math.log(bytes) / Math.log(k)); const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}; };
// Updated 2024-08-12 // Updated 2024-08-12
export const guess_file_name = function guess_file_name(filename_string: string) { export const guess_file_name = function guess_file_name(filename_string: string) {
// console.log('*** guess_file_name() ***'); // console.log('*** guess_file_name() ***');
if (!filename_string) { if (!filename_string) {
return ''; return '';
} }
if (filename_string.includes('.')) { if (filename_string.includes('.')) {
const file_name = filename_string.substring(0, filename_string.lastIndexOf('.')); const file_name = filename_string.substring(0, filename_string.lastIndexOf('.'));
// console.log(file_name); // console.log(file_name);
return file_name; return file_name;
} else { } else {
return filename_string; return filename_string;
} }
}; };
// Updated 2024-08-12 // Updated 2024-08-12
export const guess_file_extension = function guess_file_extension(filename_string: string) { export const guess_file_extension = function guess_file_extension(filename_string: string) {
// console.log('*** guess_file_extension() ***'); // console.log('*** guess_file_extension() ***');
if (!filename_string) { if (!filename_string) {
return ''; return '';
} }
if (!filename_string.includes('.')) { if (!filename_string.includes('.')) {
return ''; return '';
} }
const file_extension = const file_extension =
filename_string.substring(filename_string.lastIndexOf('.') + 1, filename_string.length) || filename_string.substring(filename_string.lastIndexOf('.') + 1, filename_string.length) ||
filename_string; filename_string;
// console.log(file_extension); // console.log(file_extension);
return file_extension; return file_extension;
}; };
// Updated 2024-08-12 // Updated 2024-08-12
export const get_file_hash = async function get_file_hash(file) { export const get_file_hash = async function get_file_hash(file) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const file_reader = new FileReader(); const file_reader = new FileReader();
file_reader.onload = async function () { file_reader.onload = async function () {
if (file_reader.result.byteLength !== file.size) { if (file_reader.result.byteLength !== file.size) {
console.log('File was not read completely'); console.log('File was not read completely');
reject('Error reading the file'); reject('Error reading the file');
} }
const hash_buffer = await crypto.subtle.digest('SHA-256', file_reader.result); const hash_buffer = await crypto.subtle.digest('SHA-256', file_reader.result);
const hash_array = Array.from(new Uint8Array(hash_buffer)); const hash_array = Array.from(new Uint8Array(hash_buffer));
const hash_hex = hash_array.map((b) => b.toString(16).padStart(2, '0')).join(''); const hash_hex = hash_array.map((b) => b.toString(16).padStart(2, '0')).join('');
resolve(hash_hex); resolve(hash_hex);
}; };
file_reader.readAsArrayBuffer(file); file_reader.readAsArrayBuffer(file);
}); });
}; };

View File

@@ -1,43 +1,43 @@
/* Returns a list of objects that have a matching property value. */ /* Returns a list of objects that have a matching property value. */
// Updated 2023-06-28 // Updated 2023-06-28
export const get_obj_li_w_match_prop = function get_obj_li_w_match_prop({ export const get_obj_li_w_match_prop = function get_obj_li_w_match_prop({
obj_li, obj_li,
property, property,
value, value,
log_lvl = 0 log_lvl = 0
}: { }: {
obj_li: any[]; obj_li: any[];
property: string; property: string;
value: any; value: any;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log('Search Object List:', obj_li); console.log('Search Object List:', obj_li);
console.log(`Property: ${property}`); console.log(`Property: ${property}`);
console.log(`Value: ${value}`); console.log(`Value: ${value}`);
} }
if (log_lvl > 1) { if (log_lvl > 1) {
console.log(`Type Of: ${typeof value}`); console.log(`Type Of: ${typeof value}`);
} }
// Create an empty array to store the matching objects. // Create an empty array to store the matching objects.
const matching_obj_li = []; const matching_obj_li = [];
// Iterate through the list of objects. // Iterate through the list of objects.
for (const object of obj_li) { for (const object of obj_li) {
// Check if the object has the specified property and the value of the property matches the specified value. // Check if the object has the specified property and the value of the property matches the specified value.
if (object.hasOwnProperty(property)) { if (object.hasOwnProperty(property)) {
// console.log('Has property at least....', object[property], typeof object[property]); // console.log('Has property at least....', object[property], typeof object[property]);
} }
if (object.hasOwnProperty(property) && object[property] === value) { if (object.hasOwnProperty(property) && object[property] === value) {
// Add the object to the array of matching objects. // Add the object to the array of matching objects.
matching_obj_li.push(object); matching_obj_li.push(object);
} }
} }
// Return the array of matching objects. // Return the array of matching objects.
if (log_lvl > 1) { if (log_lvl > 1) {
console.log('Matching Object List:', matching_obj_li); console.log('Matching Object List:', matching_obj_li);
} }
return matching_obj_li; return matching_obj_li;
}; };

View File

@@ -1,26 +1,26 @@
// Function to check if the file (or anything) timestamp was created within the last X minutes // Function to check if the file (or anything) timestamp was created within the last X minutes
export const is_datetime_recent = function is_datetime_recent({ export const is_datetime_recent = function is_datetime_recent({
datetime, datetime,
minutes, minutes,
log_lvl = 0 log_lvl = 0
}: { }: {
datetime: string; datetime: string;
minutes: number; minutes: number;
log_lvl?: number; log_lvl?: number;
}) { }) {
if (log_lvl) { if (log_lvl) {
console.log(`*** is_datetime_recent() *** datetime=${datetime} minutes=${minutes}`); console.log(`*** is_datetime_recent() *** datetime=${datetime} minutes=${minutes}`);
} }
const now: any = new Date(); const now: any = new Date();
const then: any = new Date(datetime); const then: any = new Date(datetime);
const diff = now - then; const diff = now - then;
const diff_minutes = Math.floor(diff / 60000); const diff_minutes = Math.floor(diff / 60000);
if (diff_minutes < minutes) { if (diff_minutes < minutes) {
return true; return true;
} else { } else {
return false; return false;
} }
}; };

View File

@@ -1,199 +1,199 @@
type key_val = { type key_val = {
[key: string]: any; [key: string]: any;
}; };
// NOTE: I know there is a better more efficient way to do this, but I don't have time for that right now. // NOTE: I know there is a better more efficient way to do this, but I don't have time for that right now.
export const process_permission_checks = function process_permission_checks(access_type: string) { export const process_permission_checks = function process_permission_checks(access_type: string) {
// let access_checks = { 'access_type': null, 'super_check': null }; // let access_checks = { 'access_type': null, 'super_check': null };
const access_checks: key_val = {}; const access_checks: key_val = {};
if (access_type == 'super') { if (access_type == 'super') {
access_checks.allow_access = true; access_checks.allow_access = true;
access_checks.access_type = 'super'; access_checks.access_type = 'super';
access_checks.super_check = true; access_checks.super_check = true;
access_checks.manager_check = false; access_checks.manager_check = false;
access_checks.administrator_check = false; access_checks.administrator_check = false;
access_checks.support_check = false; access_checks.support_check = false;
access_checks.assistant_check = false; access_checks.assistant_check = false;
access_checks.trusted_check = false; access_checks.trusted_check = false;
access_checks.verified_check = false; access_checks.verified_check = false;
access_checks.provisional_check = false; access_checks.provisional_check = false;
access_checks.public_check = false; access_checks.public_check = false;
access_checks.authenticated_check = true; access_checks.authenticated_check = true;
access_checks.anonymous_check = false; access_checks.anonymous_check = false;
access_checks.super_access = true; access_checks.super_access = true;
access_checks.manager_access = true; access_checks.manager_access = true;
access_checks.administrator_access = true; access_checks.administrator_access = true;
access_checks.support_access = true; access_checks.support_access = true;
access_checks.assistant_access = true; access_checks.assistant_access = true;
access_checks.trusted_access = true; access_checks.trusted_access = true;
access_checks.verified_access = true; access_checks.verified_access = true;
access_checks.provisional_access = true; access_checks.provisional_access = true;
access_checks.public_access = true; access_checks.public_access = true;
access_checks.authenticated_access = true; access_checks.authenticated_access = true;
access_checks.anonymous_access = true; access_checks.anonymous_access = true;
} else if (access_type == 'manager') { } else if (access_type == 'manager') {
access_checks.allow_access = true; access_checks.allow_access = true;
access_checks.access_type = 'manager'; access_checks.access_type = 'manager';
access_checks.super_check = false; access_checks.super_check = false;
access_checks.manager_check = true; access_checks.manager_check = true;
access_checks.administrator_check = false; access_checks.administrator_check = false;
access_checks.support_check = false; access_checks.support_check = false;
access_checks.assistant_check = false; access_checks.assistant_check = false;
access_checks.trusted_check = false; access_checks.trusted_check = false;
access_checks.verified_check = false; access_checks.verified_check = false;
access_checks.provisional_check = false; access_checks.provisional_check = false;
access_checks.public_check = false; access_checks.public_check = false;
access_checks.authenticated_check = true; access_checks.authenticated_check = true;
access_checks.anonymous_check = false; access_checks.anonymous_check = false;
access_checks.super_access = false; access_checks.super_access = false;
access_checks.manager_access = true; access_checks.manager_access = true;
access_checks.administrator_access = true; access_checks.administrator_access = true;
access_checks.support_access = true; access_checks.support_access = true;
access_checks.assistant_access = true; access_checks.assistant_access = true;
access_checks.trusted_access = true; access_checks.trusted_access = true;
access_checks.verified_access = true; access_checks.verified_access = true;
access_checks.provisional_access = true; access_checks.provisional_access = true;
access_checks.public_access = true; access_checks.public_access = true;
access_checks.authenticated_access = true; access_checks.authenticated_access = true;
access_checks.anonymous_access = true; access_checks.anonymous_access = true;
} else if (access_type == 'administrator') { } else if (access_type == 'administrator') {
access_checks.allow_access = true; access_checks.allow_access = true;
access_checks.access_type = 'administrator'; access_checks.access_type = 'administrator';
access_checks.super_check = false; access_checks.super_check = false;
access_checks.manager_check = false; access_checks.manager_check = false;
access_checks.administrator_check = true; access_checks.administrator_check = true;
access_checks.support_check = false; access_checks.support_check = false;
access_checks.assistant_check = false; access_checks.assistant_check = false;
access_checks.trusted_check = false; access_checks.trusted_check = false;
access_checks.verified_check = false; access_checks.verified_check = false;
access_checks.provisional_check = false; access_checks.provisional_check = false;
access_checks.public_check = false; access_checks.public_check = false;
access_checks.authenticated_check = false; access_checks.authenticated_check = false;
access_checks.anonymous_check = false; access_checks.anonymous_check = false;
access_checks.super_access = false; access_checks.super_access = false;
access_checks.manager_access = false; access_checks.manager_access = false;
access_checks.administrator_access = true; access_checks.administrator_access = true;
access_checks.support_access = true; access_checks.support_access = true;
access_checks.assistant_access = true; access_checks.assistant_access = true;
access_checks.trusted_access = true; access_checks.trusted_access = true;
access_checks.verified_access = true; access_checks.verified_access = true;
access_checks.provisional_access = true; access_checks.provisional_access = true;
access_checks.public_access = true; access_checks.public_access = true;
access_checks.authenticated_access = true; access_checks.authenticated_access = true;
access_checks.anonymous_access = true; access_checks.anonymous_access = true;
} else if (access_type == 'trusted') { } else if (access_type == 'trusted') {
access_checks.allow_access = true; // Should this be true?? -2024-10-03 access_checks.allow_access = true; // Should this be true?? -2024-10-03
access_checks.access_type = 'trusted'; access_checks.access_type = 'trusted';
access_checks.super_check = false; access_checks.super_check = false;
access_checks.manager_check = false; access_checks.manager_check = false;
access_checks.administrator_check = false; access_checks.administrator_check = false;
access_checks.support_check = false; access_checks.support_check = false;
access_checks.assistant_check = false; access_checks.assistant_check = false;
access_checks.trusted_check = true; access_checks.trusted_check = true;
access_checks.verified_check = false; access_checks.verified_check = false;
access_checks.provisional_check = false; access_checks.provisional_check = false;
access_checks.public_check = false; access_checks.public_check = false;
access_checks.authenticated_check = true; access_checks.authenticated_check = true;
access_checks.anonymous_check = false; access_checks.anonymous_check = false;
access_checks.super_access = false; access_checks.super_access = false;
access_checks.manager_access = false; access_checks.manager_access = false;
access_checks.administrator_access = false; access_checks.administrator_access = false;
access_checks.support_access = false; access_checks.support_access = false;
access_checks.assistant_access = false; access_checks.assistant_access = false;
access_checks.trusted_access = true; access_checks.trusted_access = true;
access_checks.verified_access = true; access_checks.verified_access = true;
access_checks.provisional_access = true; access_checks.provisional_access = true;
access_checks.public_access = true; access_checks.public_access = true;
access_checks.authenticated_access = true; access_checks.authenticated_access = true;
access_checks.anonymous_access = true; access_checks.anonymous_access = true;
} else if (access_type == 'public') { } else if (access_type == 'public') {
access_checks.access_type = 'public'; access_checks.access_type = 'public';
access_checks.super_check = false; access_checks.super_check = false;
access_checks.manager_check = false; access_checks.manager_check = false;
access_checks.administrator_check = false; access_checks.administrator_check = false;
access_checks.support_check = false; access_checks.support_check = false;
access_checks.assistant_check = false; access_checks.assistant_check = false;
access_checks.trusted_check = false; access_checks.trusted_check = false;
access_checks.verified_check = false; access_checks.verified_check = false;
access_checks.provisional_check = false; access_checks.provisional_check = false;
access_checks.public_check = true; access_checks.public_check = true;
access_checks.authenticated_check = false; access_checks.authenticated_check = false;
access_checks.anonymous_check = false; access_checks.anonymous_check = false;
access_checks.super_access = false; access_checks.super_access = false;
access_checks.manager_access = false; access_checks.manager_access = false;
access_checks.administrator_access = false; access_checks.administrator_access = false;
access_checks.support_access = false; access_checks.support_access = false;
access_checks.assistant_access = false; access_checks.assistant_access = false;
access_checks.trusted_access = false; access_checks.trusted_access = false;
access_checks.verified_access = false; access_checks.verified_access = false;
access_checks.provisional_access = false; access_checks.provisional_access = false;
access_checks.public_access = true; access_checks.public_access = true;
access_checks.authenticated_access = true; access_checks.authenticated_access = true;
access_checks.anonymous_access = true; access_checks.anonymous_access = true;
} else if (access_type == 'authenticated') { } else if (access_type == 'authenticated') {
access_checks.access_type = 'authenticated'; access_checks.access_type = 'authenticated';
access_checks.super_check = false; access_checks.super_check = false;
access_checks.manager_check = false; access_checks.manager_check = false;
access_checks.administrator_check = false; access_checks.administrator_check = false;
access_checks.support_check = false; access_checks.support_check = false;
access_checks.assistant_check = false; access_checks.assistant_check = false;
access_checks.trusted_check = false; access_checks.trusted_check = false;
access_checks.verified_check = false; access_checks.verified_check = false;
access_checks.provisional_check = false; access_checks.provisional_check = false;
access_checks.public_check = false; access_checks.public_check = false;
access_checks.authenticated_check = true; access_checks.authenticated_check = true;
access_checks.anonymous_check = false; access_checks.anonymous_check = false;
access_checks.super_access = false; access_checks.super_access = false;
access_checks.manager_access = false; access_checks.manager_access = false;
access_checks.administrator_access = false; access_checks.administrator_access = false;
access_checks.support_access = false; access_checks.support_access = false;
access_checks.assistant_access = false; access_checks.assistant_access = false;
access_checks.trusted_access = false; access_checks.trusted_access = false;
access_checks.verified_access = false; access_checks.verified_access = false;
access_checks.provisional_access = false; access_checks.provisional_access = false;
access_checks.public_access = false; access_checks.public_access = false;
access_checks.authenticated_access = true; access_checks.authenticated_access = true;
access_checks.anonymous_access = true; access_checks.anonymous_access = true;
} else { } else {
access_checks.access_type = 'anonymous'; access_checks.access_type = 'anonymous';
access_checks.super_check = false; access_checks.super_check = false;
access_checks.manager_check = false; access_checks.manager_check = false;
access_checks.administrator_check = false; access_checks.administrator_check = false;
access_checks.support_check = false; access_checks.support_check = false;
access_checks.assistant_check = false; access_checks.assistant_check = false;
access_checks.trusted_check = false; access_checks.trusted_check = false;
access_checks.verified_check = false; access_checks.verified_check = false;
access_checks.provisional_check = false; access_checks.provisional_check = false;
access_checks.public_check = false; access_checks.public_check = false;
access_checks.authenticated_check = false; access_checks.authenticated_check = false;
access_checks.anonymous_check = true; access_checks.anonymous_check = true;
access_checks.super_access = false; access_checks.super_access = false;
access_checks.manager_access = false; access_checks.manager_access = false;
access_checks.administrator_access = false; access_checks.administrator_access = false;
access_checks.support_access = false; access_checks.support_access = false;
access_checks.assistant_access = false; access_checks.assistant_access = false;
access_checks.trusted_access = false; access_checks.trusted_access = false;
access_checks.verified_access = false; access_checks.verified_access = false;
access_checks.provisional_access = false; access_checks.provisional_access = false;
access_checks.public_access = false; access_checks.public_access = false;
access_checks.authenticated_access = false; access_checks.authenticated_access = false;
access_checks.anonymous_access = true; access_checks.anonymous_access = true;
} }
return access_checks; return access_checks;
}; };

View File

@@ -18,73 +18,73 @@ import type { key_val } from './ae_utils';
// Updated 2022-02-11 // Updated 2022-02-11
export const process_data_string = function process_data_string(data_string: string) { export const process_data_string = function process_data_string(data_string: string) {
console.log('*** process_data_string() ***'); console.log('*** process_data_string() ***');
// console.log(data_string); // console.log(data_string);
if (!data_string || data_string.length < 1) { if (!data_string || data_string.length < 1) {
console.log('No data string found.'); console.log('No data string found.');
return false; return false;
} }
const obj: key_val = {}; const obj: key_val = {};
const colon_index = data_string.indexOf(':'); const colon_index = data_string.indexOf(':');
if (colon_index) { if (colon_index) {
const data_string_type = data_string.slice(0, colon_index); const data_string_type = data_string.slice(0, colon_index);
console.log(data_string_type); console.log(data_string_type);
obj['qr_type'] = data_string_type; obj['qr_type'] = data_string_type;
if (data_string_type == 'MECARD') { if (data_string_type == 'MECARD') {
const mecard_str = data_string.slice(colon_index + 1); const mecard_str = data_string.slice(colon_index + 1);
console.log(mecard_str); console.log(mecard_str);
obj['str'] = mecard_str; obj['str'] = mecard_str;
} else if (data_string_type == 'OBJ') { } else if (data_string_type == 'OBJ') {
const key_value_str = data_string.slice(colon_index + 1); const key_value_str = data_string.slice(colon_index + 1);
console.log(key_value_str); console.log(key_value_str);
const key_value_array = key_value_str.split(','); const key_value_array = key_value_str.split(',');
// console.log(key_value_array); // console.log(key_value_array);
const ot_colon_index = key_value_array[0].indexOf(':'); const ot_colon_index = key_value_array[0].indexOf(':');
const obj_type = key_value_array[0].slice(ot_colon_index + 1); const obj_type = key_value_array[0].slice(ot_colon_index + 1);
// console.log(obj_type); // console.log(obj_type);
const oi_colon_index = key_value_array[1].indexOf(':'); const oi_colon_index = key_value_array[1].indexOf(':');
const obj_id = key_value_array[1].slice(oi_colon_index + 1); const obj_id = key_value_array[1].slice(oi_colon_index + 1);
// console.log(obj_id); // console.log(obj_id);
obj['type'] = obj_type; obj['type'] = obj_type;
obj['id'] = obj_id; obj['id'] = obj_id;
} else if (data_string_type == 'JSON') { } else if (data_string_type == 'JSON') {
const partial_json_str = data_string.slice(colon_index + 1); const partial_json_str = data_string.slice(colon_index + 1);
console.log(partial_json_str); console.log(partial_json_str);
const json_str = `{${partial_json_str}}`; const json_str = `{${partial_json_str}}`;
console.log(json_str); console.log(json_str);
obj['json'] = JSON.parse(json_str); obj['json'] = JSON.parse(json_str);
} else if (data_string_type == 'STR') { } else if (data_string_type == 'STR') {
const str = data_string.slice(colon_index + 1); const str = data_string.slice(colon_index + 1);
console.log(str); console.log(str);
obj['str'] = str; obj['str'] = str;
} else if (data_string_type == 'http' || data_string_type == 'https') { } else if (data_string_type == 'http' || data_string_type == 'https') {
console.log(`http or https: ${data_string}`); console.log(`http or https: ${data_string}`);
obj['type'] = 'url'; obj['type'] = 'url';
obj['url'] = data_string; obj['url'] = data_string;
} else { } else {
console.log('The unknown data string type was found. Returning the string part.'); console.log('The unknown data string type was found. Returning the string part.');
const unknown_str = data_string.slice(colon_index + 1); const unknown_str = data_string.slice(colon_index + 1);
console.log(unknown_str); console.log(unknown_str);
obj['str'] = unknown_str; obj['str'] = unknown_str;
} }
} else { } else {
console.log('The data string type was not found. Returning the entire string.'); console.log('The data string type was not found. Returning the entire string.');
console.log(data_string); console.log(data_string);
obj['qr_type'] = 'UNKNOWN'; obj['qr_type'] = 'UNKNOWN';
obj['str'] = data_string; obj['str'] = data_string;
// return false; // return false;
} }
console.log(obj); console.log(obj);
return obj; // Returns an object return obj; // Returns an object
}; };

View File

@@ -1,87 +1,87 @@
export function return_obj_type_path({ obj_type = null, obj_type_prop_name = null }) { export function return_obj_type_path({ obj_type = null, obj_type_prop_name = null }) {
console.log('*** return_obj_type_path() ***'); console.log('*** return_obj_type_path() ***');
let obj_type_path = null; let obj_type_path = null;
const known_obj_type_li = [ const known_obj_type_li = [
'account', 'account',
'address', 'address',
'archive', 'archive',
'archive_content', 'archive_content',
'contact', 'contact',
'event_badge', 'event_badge',
'event_exhibit', 'event_exhibit',
'event_file', 'event_file',
'event_location', 'event_location',
'event_person', 'event_person',
'event_presentation', 'event_presentation',
'event_presenter', 'event_presenter',
'event_registration', 'event_registration',
'event_session', 'event_session',
'event', 'event',
'hosted_file', 'hosted_file',
'order_line', 'order_line',
'order', 'order',
'person', 'person',
'post', 'post',
'post_comment', 'post_comment',
'user' 'user'
]; ];
const known_obj_type_li_dict = [ const known_obj_type_li_dict = [
{ name: 'account', display: 'Account', path: 'account' }, { name: 'account', display: 'Account', path: 'account' },
{ name: 'archive', display: 'Archive', path: 'archive' }, { name: 'archive', display: 'Archive', path: 'archive' },
{ name: 'address', display: 'Address', path: 'address' }, { name: 'address', display: 'Address', path: 'address' },
{ name: 'archive', display: 'Archive', path: 'archive' }, { name: 'archive', display: 'Archive', path: 'archive' },
{ name: 'archive_content', display: 'Archive Content', path: 'archive/content' }, { name: 'archive_content', display: 'Archive Content', path: 'archive/content' },
{ name: 'contact', display: 'Contact', path: 'contact' }, { name: 'contact', display: 'Contact', path: 'contact' },
{ name: 'data_store', display: 'Data Store', path: 'data_store' }, { name: 'data_store', display: 'Data Store', path: 'data_store' },
{ name: 'event_abstract', display: 'Event Abstract', path: 'event/abstract' }, { name: 'event_abstract', display: 'Event Abstract', path: 'event/abstract' },
{ name: 'event_badge', display: 'Event Badge', path: 'event/badge' }, { name: 'event_badge', display: 'Event Badge', path: 'event/badge' },
{ name: 'event_device', display: 'Event Device', path: 'event/device' }, { name: 'event_device', display: 'Event Device', path: 'event/device' },
{ name: 'event_exhibit', display: 'Event Exhibit', path: 'event/exhibit' }, { name: 'event_exhibit', display: 'Event Exhibit', path: 'event/exhibit' },
{ name: 'event_file', display: 'Event File', path: 'event/file' }, { name: 'event_file', display: 'Event File', path: 'event/file' },
{ name: 'event_location', display: 'Event Location', path: 'event/location' }, { name: 'event_location', display: 'Event Location', path: 'event/location' },
{ name: 'event_person', display: 'Event Person', path: 'event/person' }, { name: 'event_person', display: 'Event Person', path: 'event/person' },
{ name: 'event_presentation', display: 'Event Presentation', path: 'event/' }, { name: 'event_presentation', display: 'Event Presentation', path: 'event/' },
{ name: 'event_presenter', display: 'Event Presenter', path: 'event/presenter' }, { name: 'event_presenter', display: 'Event Presenter', path: 'event/presenter' },
{ name: 'event_registration', display: 'Event Registration', path: 'event/registration' }, { name: 'event_registration', display: 'Event Registration', path: 'event/registration' },
{ name: 'event_session', display: 'Event Session', path: 'event/session' }, { name: 'event_session', display: 'Event Session', path: 'event/session' },
{ name: 'event', display: 'Event', path: 'event' }, { name: 'event', display: 'Event', path: 'event' },
{ name: 'hosted_file', display: 'Hosted File', path: 'hosted_file' }, { name: 'hosted_file', display: 'Hosted File', path: 'hosted_file' },
{ name: 'journal', display: 'Journal', path: 'journal' }, { name: 'journal', display: 'Journal', path: 'journal' },
{ name: 'journal_entry', display: 'Journal Entry', path: 'journal/entry' }, { name: 'journal_entry', display: 'Journal Entry', path: 'journal/entry' },
{ name: 'order_line', display: 'Order Line', path: 'order/line' }, { name: 'order_line', display: 'Order Line', path: 'order/line' },
{ name: 'order', display: 'Order', path: 'order' }, { name: 'order', display: 'Order', path: 'order' },
{ name: 'person', display: 'Person', path: 'person' }, { name: 'person', display: 'Person', path: 'person' },
{ name: 'post', display: 'Archive', path: 'post' }, { name: 'post', display: 'Archive', path: 'post' },
{ name: 'post_comment', display: 'Archive Content', path: 'post/comment' }, { name: 'post_comment', display: 'Archive Content', path: 'post/comment' },
{ name: 'user', display: 'User', path: 'user' } { name: 'user', display: 'User', path: 'user' }
]; ];
if (obj_type) { if (obj_type) {
// Need to loop through known for safety? // Need to loop through known for safety?
obj_type_path = obj_type_prop_name.replaceAll('_', '/'); obj_type_path = obj_type_prop_name.replaceAll('_', '/');
} else if (obj_type_prop_name) { } else if (obj_type_prop_name) {
let found_obj_type_name = null; let found_obj_type_name = null;
let found_obj_type_path = null; let found_obj_type_path = null;
for (let i = 0; i < known_obj_type_li_dict.length; i++) { for (let i = 0; i < known_obj_type_li_dict.length; i++) {
// console.log(known_obj_type_li_dict[i]); // console.log(known_obj_type_li_dict[i]);
// let guessed_obj_type = prop_name.startsWith(known_obj_type_li_dict[i] // let guessed_obj_type = prop_name.startsWith(known_obj_type_li_dict[i]
if (obj_type_prop_name.startsWith(known_obj_type_li_dict[i].name)) { if (obj_type_prop_name.startsWith(known_obj_type_li_dict[i].name)) {
console.log(`Found ${known_obj_type_li_dict[i].name}`); console.log(`Found ${known_obj_type_li_dict[i].name}`);
found_obj_type_name = known_obj_type_li_dict[i].name; found_obj_type_name = known_obj_type_li_dict[i].name;
found_obj_type_path = known_obj_type_li_dict[i].path; found_obj_type_path = known_obj_type_li_dict[i].path;
// obj_type_path = obj_type_prop_name.replaceAll('_', '/'); // obj_type_path = obj_type_prop_name.replaceAll('_', '/');
obj_type_path = found_obj_type_path; obj_type_path = found_obj_type_path;
break; break;
} }
} }
} else { } else {
console.log('Missing required parameters'); console.log('Missing required parameters');
return false; return false;
} }
return obj_type_path; return obj_type_path;
} }

View File

@@ -2,123 +2,123 @@ import { to_title_case } from './ae_utils__to_title_case';
// Updated 2023-08-18 // Updated 2023-08-18
export function set_obj_prop_display_name({ export function set_obj_prop_display_name({
prop_name, prop_name,
obj_type = null, obj_type = null,
prefix_w_obj_type = true, prefix_w_obj_type = true,
prefix_all_w_obj_type = false, prefix_all_w_obj_type = false,
replace_underscores = true, replace_underscores = true,
title_case = true, title_case = true,
override = null override = null
}) { }) {
console.log('*** set_obj_prop_display_name() ***'); console.log('*** set_obj_prop_display_name() ***');
if (override) { if (override) {
return override; return override;
} }
const known_obj_type_li = [ const known_obj_type_li = [
'account', 'account',
'address', 'address',
'contact', 'contact',
'event_badge', 'event_badge',
'event_exhibit', 'event_exhibit',
'event_file', 'event_file',
'event_location', 'event_location',
'event_person', 'event_person',
'event_presentation', 'event_presentation',
'event_presenter', 'event_presenter',
'event_registration', 'event_registration',
'event_session', 'event_session',
'event', 'event',
'hosted_file', 'hosted_file',
'order_line', 'order_line',
'order', 'order',
'person', 'person',
'user' 'user'
]; ];
const known_obj_type_li_dict = [ const known_obj_type_li_dict = [
{ name: 'account', display: 'Account' }, { name: 'account', display: 'Account' },
{ name: 'address', display: 'Address' }, { name: 'address', display: 'Address' },
{ name: 'contact', display: 'Contact' }, { name: 'contact', display: 'Contact' },
{ name: 'event_badge', display: 'Event Badge' }, { name: 'event_badge', display: 'Event Badge' },
{ name: 'event_exhibit', display: 'Event Exhibit' }, { name: 'event_exhibit', display: 'Event Exhibit' },
{ name: 'event_file', display: 'Event File' }, { name: 'event_file', display: 'Event File' },
{ name: 'event_location', display: 'Event Location' }, { name: 'event_location', display: 'Event Location' },
{ name: 'event_person', display: 'Event Person' }, { name: 'event_person', display: 'Event Person' },
{ name: 'event_presentation', display: 'Event Presentation' }, { name: 'event_presentation', display: 'Event Presentation' },
{ name: 'event_presenter', display: 'Event Presenter' }, { name: 'event_presenter', display: 'Event Presenter' },
{ name: 'event_registration', display: 'Event Registration' }, { name: 'event_registration', display: 'Event Registration' },
{ name: 'event_session', display: 'Event Session' }, { name: 'event_session', display: 'Event Session' },
{ name: 'event', display: 'Event' }, { name: 'event', display: 'Event' },
{ name: 'hosted_file', display: 'Hosted File' }, { name: 'hosted_file', display: 'Hosted File' },
{ name: 'order_line', display: 'Order Line' }, { name: 'order_line', display: 'Order Line' },
{ name: 'order', display: 'Order' }, { name: 'order', display: 'Order' },
{ name: 'person', display: 'Person' }, { name: 'person', display: 'Person' },
{ name: 'user', display: 'User' } { name: 'user', display: 'User' }
]; ];
let prop_display_name = prop_name; let prop_display_name = prop_name;
if (!prefix_w_obj_type) { if (!prefix_w_obj_type) {
if (obj_type) { if (obj_type) {
prop_display_name = prop_name.replace(obj_type, ''); prop_display_name = prop_name.replace(obj_type, '');
} else { } else {
for (let i = 0; i < known_obj_type_li_dict.length; i++) { for (let i = 0; i < known_obj_type_li_dict.length; i++) {
// console.log(known_obj_type_li_dict[i]); // console.log(known_obj_type_li_dict[i]);
if (prop_name.startsWith(known_obj_type_li_dict[i].name)) { if (prop_name.startsWith(known_obj_type_li_dict[i].name)) {
// console.log(`Found ${known_obj_type_li_dict[i].name}`); // console.log(`Found ${known_obj_type_li_dict[i].name}`);
prop_display_name = prop_name.replace(known_obj_type_li_dict[i].name, ''); prop_display_name = prop_name.replace(known_obj_type_li_dict[i].name, '');
break; break;
} }
} }
// for (let i = 0; i < known_obj_type_li.length; i++) { // for (let i = 0; i < known_obj_type_li.length; i++) {
// // console.log(known_obj_type_li[i]); // // console.log(known_obj_type_li[i]);
// if (prop_name.startsWith(known_obj_type_li[i])) { // if (prop_name.startsWith(known_obj_type_li[i])) {
// console.log(`Found ${known_obj_type_li[i]}`); // console.log(`Found ${known_obj_type_li[i]}`);
// prop_display_name = prop_name.replace(known_obj_type_li[i], ''); // prop_display_name = prop_name.replace(known_obj_type_li[i], '');
// break; // break;
// } // }
// } // }
} }
} else { } else {
if (!prefix_all_w_obj_type) { if (!prefix_all_w_obj_type) {
for (let i = 0; i < known_obj_type_li.length; i++) { for (let i = 0; i < known_obj_type_li.length; i++) {
// console.log(known_obj_type_li[i]); // console.log(known_obj_type_li[i]);
let found_obj_type = null; let found_obj_type = null;
if (prop_name.startsWith(known_obj_type_li_dict[i].name)) { if (prop_name.startsWith(known_obj_type_li_dict[i].name)) {
// if (prop_name.startsWith(known_obj_type_li[i])) { // if (prop_name.startsWith(known_obj_type_li[i])) {
// console.log(`Found ${known_obj_type_li_dict[i].name}`); // console.log(`Found ${known_obj_type_li_dict[i].name}`);
found_obj_type = known_obj_type_li_dict[i].name; found_obj_type = known_obj_type_li_dict[i].name;
if (found_obj_type == obj_type) { if (found_obj_type == obj_type) {
prop_display_name = prop_name.replace(known_obj_type_li_dict[i].name, ''); prop_display_name = prop_name.replace(known_obj_type_li_dict[i].name, '');
} }
break; break;
} }
} }
// if (obj_type) { // if (obj_type) {
// prop_display_name = prop_name.replace(obj_type, ''); // prop_display_name = prop_name.replace(obj_type, '');
// } else { // } else {
} }
} }
// console.log(prop_display_name); // console.log(prop_display_name);
if (prop_display_name.search('ID')) { if (prop_display_name.search('ID')) {
} }
prop_display_name = prop_display_name.replace('id_random', 'ID'); prop_display_name = prop_display_name.replace('id_random', 'ID');
if (replace_underscores) { if (replace_underscores) {
prop_display_name = prop_display_name.replaceAll('_', ' '); prop_display_name = prop_display_name.replaceAll('_', ' ');
} }
if (title_case) { if (title_case) {
prop_display_name = to_title_case(prop_display_name); prop_display_name = to_title_case(prop_display_name);
} }
// console.log(prop_display_name); // console.log(prop_display_name);
return prop_display_name; return prop_display_name;
} }

View File

@@ -1,43 +1,44 @@
/* Adapted from: To Title Case © 2018 David Gouch | https://github.com/gouch/to-title-case */ /* Adapted from: To Title Case © 2018 David Gouch | https://github.com/gouch/to-title-case */
export function to_title_case(text_string) { export function to_title_case(text_string) {
// console.log('*** to_title_case() ***'); // console.log('*** to_title_case() ***');
const smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|v.?|vs.?|via)$/i; const smallWords =
const alphanumericPattern = /([A-Za-z0-9\u00C0-\u00FF])/; /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|v.?|vs.?|via)$/i;
const wordSeparators = /([ :–—-])/; const alphanumericPattern = /([A-Za-z0-9\u00C0-\u00FF])/;
const wordSeparators = /([ :–—-])/;
return text_string return text_string
.split(wordSeparators) .split(wordSeparators)
.map(function (current, index, array) { .map(function (current, index, array) {
if ( if (
/* Check for small words */ /* Check for small words */
current.search(smallWords) > -1 && current.search(smallWords) > -1 &&
/* Skip first and last word */ /* Skip first and last word */
index !== 0 && index !== 0 &&
index !== array.length - 1 && index !== array.length - 1 &&
/* Ignore title end and subtitle start */ /* Ignore title end and subtitle start */
array[index - 3] !== ':' && array[index - 3] !== ':' &&
array[index + 1] !== ':' && array[index + 1] !== ':' &&
/* Ignore small words that start a hyphenated phrase */ /* Ignore small words that start a hyphenated phrase */
(array[index + 1] !== '-' || (array[index - 1] === '-' && array[index + 1] === '-')) (array[index + 1] !== '-' || (array[index - 1] === '-' && array[index + 1] === '-'))
) { ) {
return current.toLowerCase(); return current.toLowerCase();
} }
/* Ignore intentional capitalization */ /* Ignore intentional capitalization */
if (current.substr(1).search(/[A-Z]|\../) > -1) { if (current.substr(1).search(/[A-Z]|\../) > -1) {
return current; return current;
} }
/* Ignore URLs */ /* Ignore URLs */
if (array[index + 1] === ':' && array[index + 2] !== '') { if (array[index + 1] === ':' && array[index + 2] !== '') {
return current; return current;
} }
/* Capitalize the first letter */ /* Capitalize the first letter */
return current.replace(alphanumericPattern, function (match) { return current.replace(alphanumericPattern, function (match) {
return match.toUpperCase(); return match.toUpperCase();
}); });
}) })
.join(''); .join('');
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,25 +1,25 @@
<script lang="ts"> <script lang="ts">
export let log_lvl: number = 0; export let log_lvl: number = 0;
export let site_google_tracking_id: string = ''; export let site_google_tracking_id: string = '';
if (log_lvl) { if (log_lvl) {
console.log(`AE Analytics: site_google_tracking_id = `, site_google_tracking_id); console.log(`AE Analytics: site_google_tracking_id = `, site_google_tracking_id);
} }
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
window.gtag = function gtag(): void { window.gtag = function gtag(): void {
window.dataLayer.push(arguments); window.dataLayer.push(arguments);
}; };
window.gtag('js', new Date()); window.gtag('js', new Date());
window.gtag('config', site_google_tracking_id); window.gtag('config', site_google_tracking_id);
if (log_lvl) { if (log_lvl) {
console.log(`AE Analytics: Google Analytics Tracking ID = `, site_google_tracking_id); console.log(`AE Analytics: Google Analytics Tracking ID = `, site_google_tracking_id);
} }
} }
</script> </script>
<svelte:head> <svelte:head>
<script async src="https://www.googletagmanager.com/gtag/js?id={site_google_tracking_id}"> <script async src="https://www.googletagmanager.com/gtag/js?id={site_google_tracking_id}">
</script> </script>
</svelte:head> </svelte:head>

Some files were not shown because too many files have changed in this diff Show More