Tags: arganollc/aotbrowser
Tags
Add tree search, URL deep linking, clipboard copy, and improved X++ s… …yntax highlighting (#40) * Add tree search and URL deep linking features Tree Search: - Search button opens a dialog to enter search text - Recursively walks the tree to find matching nodes (case-insensitive) - Next/Prev buttons navigate between matches with wrap-around - Search state clears when switching to a different object URL Deep Linking: - New ARBAOTBrowserUrlHelper class builds shareable URLs - init() parses ObjectType, ObjectName, TreePath query parameters - Copy Link button in action pane shows the URL in the infolog - URL format: ?mi=ARBAOTBrowser&ObjectType=Table&ObjectName=CustTable Co-authored-by: Copilot <[email protected]> * Implement clipboard copy via extensible control Replace info()-based Copy Link with a proper browser clipboard copy using a JavaScript extensible control pattern: - ARBClipboardHelperBuild: design-time build class - ARBClipboardHelperControl: runtime control with FormProperty - ARBClipboardHelper form: transient dialog hosting the control - ARBClipboardHelper class: static copyToClipboard() entry point - HTML/JS resources using navigator.clipboard.writeText() The dialog opens briefly when Copy Link is clicked, copies the URL to the browser clipboard via JavaScript, then auto-closes after 2s. Co-authored-by: Copilot <[email protected]> * Deploy web resources to webroot in Mount.ps1 Extensible control resources (HTML/JS) must be copied to the IIS webroot/resources/ folder for the browser to load them. Add an automatic deployment step to Mount.ps1 that copies resource content from AxResource/ResourceContent/ to the webroot. Co-authored-by: Copilot <[email protected]> * Fix deep linking: use getClientURLQueryValue instead of HttpContext HttpContext::Current is null during form init() in D365FO's SPA architecture. Replace with Global::getClientURLQueryValue() which uses SessionContext to access the original browser URL parameters. Co-authored-by: Copilot <[email protected]> * Include tree path in Copy Link URL for node-level deep linking CopyLinkButton now captures the currently selected tree node path via ARBAOTBrowserUrlHelper::getSelectedTreePath() and includes it as a TreePath parameter in the URL. When opened, the form navigates directly to that tree node. Co-authored-by: Copilot <[email protected]> * Refactor tree search to Docentric inline pattern Replace dialog-based tree search with inline filter group using the Docentric pattern (DocReportUserDefinedPlaceholderExpressionDesigner). Changes: - Add TreeSearchFilterGroup with StringControl + Prev/Next buttons inside DetailsNavigationList, above the ObjectTree - TreeSearchButton in action pane now toggles filter group visibility - Pre-build ascending/descending search index lists after tree construction (buildSearchTreeItems/buildSearchTreeItemsRecursive) - Use match() for wildcard-aware search via findTreeItem() - Remove old dialog-based methods (treeSearchExecute, treeSearchClear, treeSearchCollectMatches, treeSearchNavigate) Co-authored-by: Copilot <[email protected]> * Fix tree search button label and search logic - Remove ImageOnly display so Search button shows text label - Rewrite findTreeItem to skip-past-current approach instead of fragile +1/-1 index arithmetic - Use strContains for plain text (case-insensitive substring match), reserve match() for wildcard patterns (* and ?) - Change findTreeItem to public for DataControl access Co-authored-by: Copilot <[email protected]> * Remove search button image, add Enter key to trigger search - Remove NormalImage from Search toggle button (text-only display) - Add enter() override on TreeSearchString so pressing Enter triggers Find Next automatically Co-authored-by: Copilot <[email protected]> * Simplify tree search: always visible, search-as-you-type - Remove Search toggle button from action pane (no longer needed) - Show TreeSearchFilterGroup always (remove Visible=No) - Replace enter() with modified() on TreeSearchString so search triggers automatically as the user types and tabs/clicks away Co-authored-by: Copilot <[email protected]> * Normalize form XML formatting Co-authored-by: Copilot <[email protected]> * Improve X++ syntax highlighting in code viewer - Replace C#-centric keyword list with accurate X++ keywords - Add: final, implements, retry, next, firstonly, forupdate, nofetch, forceselectorder, crosscompany, display, edit, server, client, ttsbegin/ttscommit/ttsabort, changecompany, mod, div, and more - Remove 30+ C#-only keywords (async, await, unsafe, stackalloc, etc.) - Replace type keywords with X++ types (int64, utcdatetime, guid, anytype, boolean, container, tableId, fieldId, classId, etc.) - Add XML doc comment (///) highlighting as String.Doc token type - Add label literal (@sys12345, @module:Label) highlighting as Name.Label - Add intrinsic function highlighting (classStr, tableStr, enumStr, etc.) as Name.Builtin with green bold styling - Add ClassName:: static access highlighting (class name as Name.Class) - Separate operators from punctuation for distinct visual styling - Add macro usage (#MacroName) highlighting as Comment.Preproc - Add additional preprocessor directives (globaldefine, defjob, etc.) Co-authored-by: Copilot <[email protected]> * Fix BP warnings: add XML doc headers, fix strFmt, protect constructor - Add XML doc summary to ARBClipboardHelperBuild and ARBClipboardHelperControl - Fix HTML-encoded summary tags in ARBClipboardHelper and ARBAOTBrowserUrlHelper - Change ARBClipboardHelperControl constructor from public to protected - Remove unnecessary strFmt() call on label with no format args - Add missing returns tag on TreeSearchString.modified() doc header Co-authored-by: Copilot <[email protected]> * Fix BP issues and warnings * Add missing X++ keywords from official LanguageService scanner Cross-referenced our lexer against the official Tokens enum from Microsoft.Dynamics.Framework.Tools.LanguageService.Parser and added 15 missing keywords: - event, eventhandler (event handling) - firstonly100, firstonly1000 (select hints) - from (insert_recordset ... from) - generateonly (select modifier) - hint, index (index hint) - optimisticlock, pessimisticlock, repeatableread (concurrency) - print (debug output) - reverse (select ordering) - set, unchecked (misc keywords) Co-authored-by: Copilot <[email protected]> * Remove debug web resource deployment from Mount.ps1 Co-authored-by: Copilot <[email protected]> * Remove extra file --------- Co-authored-by: Caleb Blanchard <[email protected]> Co-authored-by: Copilot <[email protected]>
Add BP suppression files and table key data (#39) * Add BP suppression files * Add ARBTableKeyFieldMetadata table for primary key exposure Add new table, data entity, and supporting artifacts to expose primary index and replacement key field information for each table. New artifacts: - ARBTableKeyFieldMetadata table: stores one record per field per key with TableName, IndexName, FieldName, KeyType, and FieldPosition - ARBTableKeyFieldMetadataEntity: read-only OData entity - ARBTableKeyFieldMetadataEntityStaging: DMF staging table - ARBMetadataKeyType EDT (String, size 40) - ARBMetadataFieldPosition EDT (Int32) Modified artifacts: - ARBTableMetadataPopulateService: added processKeys and processKeyIndex methods to extract PrimaryIndex and ReplacementKey fields per table - ARBTableMetadata form: added Keys tab with grid for key field browsing - ARBTableMetadataEntityMaintain/View privileges: added entity permissions - Labels: added KeyType, Keys, IndexName, FieldPosition, TableKeyFieldMetadata, TableKeyFieldMetadataDevDoc - VS project and documentation updated Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Caleb Blanchard <[email protected]> Co-authored-by: Copilot <[email protected]>
Add SQL Name for tables (#35) Co-authored-by: Caleb Blanchard <[email protected]>
PreviousNext