This page captures business rules enforced by this library.
Field
Value
Statement
No navigation data is loaded when the control is running in the Visual Studio designer.
Trigger
The control's DesignMode property is true when GetNavigationData is invoked.
Enforcement
GetNavigationData (SAIFMenu.vb, SAIFMenuTop.vb) returns Nothing immediately without touching session or NavigationContext.
Outcome
No session or database access occurs at design time; the designer surface renders using the design-mode placeholder paths instead.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Navigation data is loaded at most once per ASP.NET session and reused for the remainder of the session.
Trigger
GetNavigationData finds a non-null value under Session("navdata").
Enforcement
The cached NavigationContext is returned directly, bypassing construction.
Outcome
Menu/authorization data does not reflect changes made to the user's authorised items until the session ends and a new one begins.*
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The menu user is the Windows logon identity with the domain prefix removed, trimmed and upper-cased.
Trigger
Session("navdata") is empty (first access in the session).
Enforcement
HttpContext.Current.Request.LogonUserIdentity.Name is read, the substring after the last \ is taken, trimmed, and upper-cased.
Outcome
The resulting normalized user ID becomes the sole input used to resolve authorised menu items.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Menu content is scoped to the signed-in user's authorised items — the user ID is the sole NavigationContext constructor input.
Trigger
First access to navigation data in the session.
Enforcement
New NavigationContext(userid) is constructed and stored in Session("navdata").
Outcome
Subsequent renders read the user's authorised items from the session-cached collection instead of querying Oracle again.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The hosting page must be (or be castable to) ViewPageBase; otherwise page-level integration is skipped.
Trigger
Control OnInit / Page_PreLoad.
Enforcement
The control casts Page to ViewPageBase, storing it in m_Page; the cast fails silently (Nothing) when the page isn't a ViewPageBase.
Outcome
ViewID-based session/view-state keys become empty strings and page-lifecycle integration (PreLoad handling) is skipped when the host page is not a ViewPageBase.*
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
A zero-sized default-submit image button is rendered first so pressing Enter does not trigger favourites maintenance.
Trigger
Control tree construction (BuildMenuIcons).
Enforcement
imgDefaultOnSubmit / imgTopDefaultOnSubmit, a zero-sized SAIFImageButton, is added to the control tree ahead of other icons.
Outcome
Pressing Enter on the page submits through this hidden button rather than triggering the favourites-maintenance or other icon actions.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The left menu control tree is rebuilt on every page load.
Trigger
SAIFMenu.OnLoad.
Enforcement
CreateControls runs unconditionally on every page load, rebuilding the context box, favourites, and applications sections.
Outcome
No caching of the rendered control tree across postbacks; the menu is always rebuilt from current authorisation/preference state.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-008: F12 without Ctrl selects and focuses the context box
Field
Value
Statement
Pressing F12 without Ctrl selects and focuses the context search box.
Trigger
SAIFMenu.OnLoad registers a page startup script.
Enforcement
A client script binds key code 123 (F12) without Ctrl to select and focus the context textbox.
Outcome
Users can jump to the context search box via a single keystroke.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Pressing Enter in the context box posts back through the hidden EC link button rather than submitting the form normally.
Trigger
Same OnLoad script registration.
Enforcement
Enter-key handling is wired to post back through the hidden EC LinkButton instead of the browser's default form submission.
Outcome
Enter-key submissions always route through m_EnterControl_Click, ensuring MenuNavigate("ContextValue", "ENTER") fires consistently.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Watermark scripts are registered once per page.
Trigger
SAIFMenu.OnLoad.
Enforcement
RegisterClientScriptBlock guards against duplicate registration using a per-page key.
Outcome
The js_waterMark_Focus / js_waterMark_Blur functions are emitted only once even if multiple SAIFMenu instances exist.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The context box supports three display modes: normal, read-only and hidden.
Trigger
SAIFMenu.InitializeControls.
Enforcement
The ContextViewStyle switch renders an editable, read-only, or hidden textbox depending on ContextViewStyleEnum.
Outcome
Hosting pages control the interactivity of the context search box without needing to conditionally omit the control.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
An empty context box displays its label as watermark text styled watermark.
Trigger
InitializeControls, Normal mode with an empty ContextValue and a non-empty ContextLabel.
Enforcement
The label text is written into the textbox and styled with the watermark CSS class.
Outcome
Users see a placeholder prompt instead of an empty box.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-013: The watermark clears on focus and is restored on blur
Field
Value
Statement
The watermark clears on focus and is restored on blur when the box is left empty.
Trigger
Client-side focus/blur events on the context textbox.
Enforcement
js_waterMark_Focus / js_waterMark_Blur scripts toggle the watermark text and CSS class.
Outcome
The watermark behaves like placeholder text without using the HTML5 placeholder attribute.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Single quotes in the context label are escaped before being emitted into JavaScript.
Trigger
InitializeControls attaches OnFocus / OnBlur handlers.
Enforcement
The ContextLabel value has single quotes escaped before being concatenated into the inline JavaScript call.
Outcome
A label containing a single quote does not break the generated script, though other characters remain unescaped.*
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
A context box still showing its watermark label is treated as empty.
Trigger
Reading the ContextValue property.
Enforcement
If the textbox text equals the watermark label, ContextValue returns String.Empty rather than the literal label text.
Outcome
Callers never see the watermark prompt text as a real user-entered value.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The context value is upper-cased when UpperCaseContextValue is set.
Trigger
Reading ContextValue with UpperCaseContextValue = True.
Enforcement
The returned string is upper-cased before being handed back to the caller.
Outcome
Callers relying on case-insensitive matching receive normalized input.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Setting the context value raises OnContextChanged with the previous and new values.
Trigger
Assignment to the ContextValue property.
Enforcement
The setter trims (and optionally upper-cases) the incoming value, then raises OnContextChanged(oldValue, newValue).
Outcome
Hosting pages can react to context changes (e.g., re-querying data) without polling the textbox themselves.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Design mode shows three placeholder favourites rather than live data.
Trigger
AddFavorites when DesignMode is true.
Enforcement
Three static Favorite 1–Favorite 3 links are emitted instead of querying NavigationData.
Outcome
The control has a representative appearance in the Visual Studio designer without requiring a live session.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Favourites are displayed in MenuOrder sequence.
Trigger
AddFavorites at run time with a non-empty Favorites collection.
Enforcement
The collection is sorted by MenuOrder before link generation (delegated to clsMenuAuthorizedItemCollection).
Outcome
Favourites appear in the sequence configured by menu administration rather than an arbitrary order.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Favourite link IDs embed the menu item sequence number so clicks can be resolved back to the item.
Trigger
AddFavorites link construction.
Enforcement
Each LinkButton ID is built as <controlId>fav_LB<MenuItemSeqNum>.
Outcome
LinkButtonClick can parse the sequence number back out of the ID to resolve which item was clicked.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
A favourite's tooltip combines its menu category and the item tooltip.
Trigger
AddFavorites link construction.
Enforcement
The ToolTip is set to <MenuCategory> - <ToolTip>.
Outcome
Hovering a favourite shows both its category and page-specific tooltip text.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The favourite matching the current page is highlighted with favoriteitem-selected.
Trigger
AddFavorites link construction, comparing MenuPageSeqNum to the current item.
Enforcement
CSS class is set to favoriteitem-selected for a match, otherwise favoriteitem.
Outcome
The user can visually identify which favourite corresponds to the page they are viewing.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The "Change Password" link is offered only to external clients.
Trigger
AddFavorites, after rendering favourite links.
Enforcement
If AppGlobal.EnvironmentService.IsClientExternal appends a "Change Password" link (ChangePWLink) to the favourites list.
Outcome
Internal users, whose passwords are managed by domain policy, do not see a self-service password link.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The applications list is an accordion 120 pixels wide with a 250 ms transition.
Trigger
AddLinks when ShowApps is true.
Enforcement
An AjaxControlToolkit.Accordion (UMenu) is constructed with a fixed 120-pixel width, header CSS classes applicationitem / application-current, and a 250 ms transition at 50 frames per second.
Outcome
The applications accordion has a consistent size and animation across all hosting pages.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Application items are ordered by menu category then menu order.
Trigger
AddLinks, before pane construction.
Enforcement
Items are sorted using two SortParm entries (MenuCategory, MenuOrder) via clsMenuAuthorizedItemCollection.SortMulti.
Outcome
Categories and their items render in a predictable, administrator-configured sequence.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
One accordion pane is created per menu category.
Trigger
AddLinks iteration over sorted items.
Enforcement
A new AccordionPane is opened whenever the category code changes from the previous item.
Outcome
Items sharing a category are grouped under a single collapsible pane.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
A category pane is created only when it contains at least one visible item.
Trigger
AddLinks category-change detection.
Enforcement
A pane is opened only when the category contains at least one item with IsVisible = True.
Outcome
Categories whose items are all hidden do not produce an empty, unusable pane.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-028: Pane IDs must be non-empty, non-reserved, and unique
Field
Value
Statement
Pane IDs must be non-empty, must not equal _Header and must be unique; violations throw ApplicationException.
Trigger
AddLinks pane creation.
Enforcement
A pane ID that is empty, equals _Header, or duplicates an existing pane throws ApplicationException("Bad Menu Pane ID: …").
Outcome
Malformed or colliding menu category configuration surfaces as a hard failure rather than a silently broken accordion.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Only items flagged IsVisible are rendered as menu links.
Trigger
AddLinks and BuildLinkCollection item iteration.
Enforcement
A LinkButton is added only If Item.IsVisible.
Outcome
Items flagged not visible are excluded from both the left accordion and the top link row even if they are present in the authorised collection.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The application link for the current page is highlighted with applicationitemselected.
Trigger
AddLinks link construction.
Enforcement
CSS class applicationitemselected is applied when the item matches the current page; otherwise application-submenu.
Outcome
The active application link is visually distinguished in the accordion.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The accordion opens on the pane matching SelectedCategory.
Trigger
AddLinks / SelectCategoryInMenu, when SelectedCategory is set.
Enforcement
The accordion's selected pane index is set to match the pane whose ID corresponds to SelectedCategory.
Outcome
The applications section opens directly to the category relevant to the current page rather than always defaulting to the first pane.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The context value is preserved in session before any menu-driven postback navigation.
Trigger
ExpandClick, NavigateToItem, m_EnterControl_Click.
Enforcement
The current ContextValue is written to Session("CVTextBox" & ViewID) before the accordion is rebuilt or navigation occurs.
Outcome
The user's in-progress search text survives the postback and is restored by Page_PreLoad.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-033: The applications section toggles between expanded and collapsed
Field
Value
Statement
The applications section toggles between expanded (apps-minus.gif) and collapsed (apps-plus.gif).
Trigger
ExpandClick (clicking the expand/collapse icon).
Enforcement
The toggle image source alternates between apps-minus.gif (Collapse) and apps-plus.gif (Expand), and ShowApps is set accordingly.
Outcome
The user gets consistent visual feedback for the applications pane's expanded/collapsed state.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-034: Expanding the applications section rebuilds and re-selects the category
Field
Value
Statement
Expanding the applications section rebuilds the accordion and re-selects the current category.
Trigger
ExpandClick, expanding branch.
Enforcement
AddLinks (rendering logic) is re-invoked and the previously selected category is re-applied.
Outcome
Re-expanding the applications section restores the same category context the user had before collapsing it.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-035: The expand/collapse choice is saved as a user preference
Field
Value
Statement
The expanded/collapsed choice is saved as user preference SHOWAPPS (Y/N) at application scope.
Trigger
ExpandClick, when a clsPreferences instance is available.
Enforcement
Preferences.Add("SHOWAPPS", "Y"/"N", PrefScope.AppLevel) followed by Preferences.Save().
Outcome
The expand/collapse choice persists across sessions for the user, via SAIF.Framework.Preferences in Oracle (DB user CLM).
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Session keys are namespaced by the page's ViewID, falling back to an empty string.
Trigger
Page_PreLoad in both controls.
Enforcement
m_Page.ViewID (or empty string when not a ViewPageBase) is captured and used as a suffix on session/view-state keys.
Outcome
Multiple concurrent views in the same session do not collide on shared session state.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The saved SHOWAPPS preference is applied only on the initial (non-postback) request for an authenticated user.
Trigger
SAIFMenu.Page_PreLoad, Not IsPostBack and an authenticated identity.
Enforcement
ShowApps is set from the stored SHOWAPPS preference only under this condition.
Outcome
The saved preference is not reapplied (and cannot override in-session toggling) on every postback.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-038: The applications list defaults to expanded when no preference is stored
Field
Value
Statement
With no stored SHOWAPPS preference the applications list defaults to expanded.
Trigger
Same Page_PreLoad branch, no stored preference value.
Enforcement
ShowApps defaults to True (expanded) when no SHOWAPPS preference exists.
Outcome
First-time users see the applications pane expanded rather than collapsed.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-039: The current page is resolved once and cached in view state
Field
Value
Statement
The current page is resolved once and then cached in view state.
Trigger
Page_PreLoad in both controls, when the current page is not yet cached.
Enforcement
NavigationData.GetCurrentPage() is called and the result stored in view state (CurrentPage).
Outcome
The comparatively expensive current-page lookup happens at most once per postback cycle.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The context value is restored from session on the initial request only.
Trigger
SAIFMenu.Page_PreLoad, Not IsPostBack.
Enforcement
ContextValue is set from Session("CVTextBox" & ViewID) when present.
Outcome
A search value entered before a menu-driven navigation reappears in the context box on the destination page's first render.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-041: Preferences are keyed by the user-name portion of DOMAIN\user
Field
Value
Statement
Preferences are keyed by the user name portion of DOMAIN\user.
Trigger
SAIFMenu.Preferences property access.
Enforcement
HttpContext.Current.User.Identity.Name.Split("\"c) yields the account name used as the clsPreferences user key.
Outcome
Preferences are scoped to the individual signed-in account, not the domain-qualified name.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Preferences are stored under the fixed application code BOMENU.
Trigger
Same Preferences property access.
Enforcement
New clsPreferences(username, "BOMENU") hard-codes the application scope.
Outcome
All menu layout preferences for this control are grouped under a single, well-known application code regardless of hosting page.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-043: Preference handling is skipped for non DOMAIN\user identities
Field
Value
Statement
If the identity is not in DOMAIN\user form, preference handling is skipped entirely.
Trigger
Preferences property access, names.Count <> 2.
Enforcement
The property returns Nothing, and all callers (ExpandClick, Page_PreLoad) skip preference read/write when it is Nothing.
Outcome
Non-domain-qualified identities (or unauthenticated requests) never attempt a preference database call.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The change-password link redirects to /BusinessOnline/Changepassword.aspx carrying the view ID as __SAIFPID.
Trigger
LinkButtonClick, link ID contains ChangePWLink.
Enforcement
Response.Redirect("/BusinessOnline/Changepassword.aspx?__SAIFPID=" & ViewID).
Outcome
External users are taken directly to the password-change page, bypassing the normal MenuNavigate event pattern, carrying the view ID for correlation.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The clicked menu item is identified by the numeric suffix after _LB in the link ID.
Trigger
LinkButtonClick in both controls.
Enforcement
The substring following _LB in the link's ID is parsed as the menu item sequence number.
Outcome
A single generic click handler can resolve any rendered link back to its authorised menu item.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Navigation targets are taken from the authorised item's ApplicationPath and PageLink — a user can only navigate to items present in their authorised collection.
Trigger
NavigateToItem, after resolving the sequence number.
Enforcement
NavigationData.MenuAuthorizedItems.Item(ItemSeq) supplies ApplicationPath and PageLink; no other source of navigation targets exists.
Outcome
A user cannot navigate through the menu to a page outside their authorised item collection.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The control never navigates itself; it raises MenuNavigate for the host page to act on.
Trigger
NavigateToItem completion.
Enforcement
The resolved target is passed to MenuNavigate(ApplicationPath, PageLink), an event, rather than a direct Response.Redirect.
Outcome
The hosting page retains full control over how (or whether) navigation is actually performed.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
A malformed link ID or failed navigation is silently ignored.
Trigger
LinkButtonClick, any exception during sequence parsing or navigation.
Enforcement
An empty Catch block swallows the exception.
Outcome
A malformed ID or failed lookup produces no visible error and no navigation, rather than a crash or user-facing message.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
BR-MENU-049: The favourites configuration icon navigates to the favourite maintenance page
Field
Value
Statement
The favourites configuration icon navigates to MenuCache / frmFavoriteMaint.aspx.
Trigger
MenuImage_Click, imgFavoriteConfig clicked.
Enforcement
MenuNavigate("MenuCache", "frmFavoriteMaint.aspx") is raised.
Outcome
Favourite list maintenance is delegated entirely to a separate page outside this library.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
The hidden default-submit button raises DefaultOnSubmit so the page controls Enter-key behaviour.
Trigger
MenuImage_Click, imgDefaultOnSubmit / imgTopDefaultOnSubmit clicked.
Enforcement
DefaultOnSubmit() event is raised instead of any navigation or toolbar event.
Outcome
The hosting page defines its own Enter-key behaviour without the menu forcing a specific action.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Pressing Enter in the context box raises MenuNavigate("ContextValue", "ENTER").
Trigger
m_EnterControl_Click (hidden EC LinkButton postback).
Enforcement
The context value is stored in session, then MenuNavigate("ContextValue", "ENTER") is raised.
Outcome
Hosting pages can treat Enter-in-context-box as a distinct navigation intent from a menu-link click.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Top page links are rendered inside a TopMenuApp-row panel within the topmenubox container.
Trigger
SAIFMenuTop.CreateChildControls.
Enforcement
The generated LinkButtons are added to a TopMenuApp-row panel nested in the topmenubox navigation panel.
Outcome
Consistent DOM/CSS structure for the top link row across all hosting pages.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Every toolbar icon is a SAIFImageButton registered in the menu-button dictionary under its control ID.
Trigger
SAIFMenuTop.BuildMenuIcons (CreateChildControls).
Enforcement
Each icon is instantiated as SAIFImageButton, wired to MenuImage_Click, and registered in the clsMenuButton dictionary under its control ID.
Outcome
Every toolbar action shares the same rendering/behaviour contract and can be looked up generically by ID.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Toolbar button state is serialized into view state keyed by ClientID plus the logical button name.
Trigger
MenuButtonSet / MenuButtonGet.
Enforcement
clsMenuButton instances are persisted into ViewState keyed by ClientID plus the logical button name.
Outcome
Toolbar button visibility/enabled/tooltip state survives postbacks without re-deriving it from the authorised page every time.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Design mode shows three placeholder page links.
Trigger
BuildLinkCollection, DesignMode true.
Enforcement
Three static Page 1–Page 3 links are emitted instead of querying navigation data.
Outcome
The control has a representative designer appearance without a live session.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Top links show only the authorised items of the currently selected category, in MenuOrder sequence.
Trigger
BuildLinkCollection at run time.
Enforcement
Items are sorted by MenuOrder, then only MenuAuthorizedItems.AppItemsByCategory(SelectedCategory) is iterated.
Outcome
The top row shows only the pages belonging to the category currently selected in the left menu, in administrator-configured order.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Top link IDs are prefixed top_LB plus the menu item sequence number.
Trigger
BuildLinkCollection link construction.
Enforcement
Each LinkButton ID is top_LB<MenuItemSeqNum>.
Outcome
LinkButtonClick can parse the sequence number back out to resolve the clicked item, matching the pattern used for favourites.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
The top link for the current page is highlighted with TopMenuApp-rowSelected.
Trigger
BuildLinkCollection link construction, matching current item.
Enforcement
CSS class TopMenuApp-rowSelected is applied to the matching link.
Outcome
The user can see which top-row page they are currently viewing.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Toolbar buttons appear only when the current authorised page enables them (IsDisplayInsert, IsDisplaySave, IsDisplayDelete, IsDisplayPrint, IsDisplayDownload, IsDisplaySavePreferences, IsDisplayHelp).
Trigger
SAIFMenuTop.Page_PreLoad, non-postback.
Enforcement
Each button's Visible / Enabled is set from the matching clsMenuAuthorizedItem flag.
Outcome
Toolbar actions not permitted for the current page are hidden and disabled, independent of the user's overall menu authorisation.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Toolbar tooltips are taken from the current page's configured tooltips.
Trigger
Same Page_PreLoad pass.
Enforcement
Page-defined tooltip text is copied onto the print, insert, save, delete, and download buttons.
Outcome
Toolbar icons show page-specific guidance rather than a single generic tooltip.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
The one-click guard script and flag variable are registered once per page.
Trigger
BuildClientOneClickJavascript.
Enforcement
RegisterClientScriptBlock guards the mnuWasClicked flag and mnuOneClickOnly function against duplicate emission.
Outcome
Multiple toolbar buttons share one client-side one-click guard without duplicating script blocks.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Rendered icon image, access key and tooltip are synchronised from the logical button model before rendering.
Trigger
SAIFMenuTop.OnPreRender.
Enforcement
For each icon with a matching clsMenuButton, the image URL, access key, and tooltip are updated only when they differ from the currently rendered values.
Outcome
Icon appearance stays consistent with the toolbar model even if a button's image/tooltip changed since the icon was created.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Access-key tooltips are prefixed Alt+, or Shift+Alt+ on Firefox 2 and later.
Trigger
OnPreRender, per toolbar icon with an access key.
Enforcement
AccessKeyPrefix inspects IsFirefox (Firefox 2+) to choose between Alt+ and Shift+Alt+ prefixes for the tooltip text.
Outcome
The displayed keyboard-shortcut hint matches the actual browser-specific access-key combination.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Activity indicators and form-disabling are applied to all toolbar icons together via EnableButtonIndicators.
Trigger
OnPreRender, per toolbar icon.
Enforcement
When EnableButtonIndicators is true, each icon's EnableIndicator / DisableFormControlsOnClick are turned on together.
Outcome
All toolbar icons share the same activity-indicator behaviour as a single library-wide setting.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
When indicators are off, one-click buttons are guarded client-side by mnuOneClickOnly.
Trigger
OnPreRender, EnableButtonIndicators false.
Enforcement
One-click buttons receive onclick="javascript:mnuOneClickOnly(this);".
Outcome
Double-submission is still guarded client-side even without the visual activity indicator.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
The toolbar container is rendered only when at least one toolbar button is visible.
Trigger
RenderControl.
Enforcement
ShowToolBar is evaluated before opening the toolbar div; the container is omitted entirely when no button is visible.
Outcome
Pages with no permitted toolbar actions do not render an empty toolbar strip.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Each toolbar icon renders only when its logical button is visible.
Trigger
RenderControl icon emission.
Enforcement
Each icon's markup is conditioned on the logical button's Visible flag.
Outcome
Hidden actions produce no DOM element at all, not just a CSS-hidden one.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
A disabled button renders a _d-suffixed image variant and an ASP.NET-disabled control.
Trigger
RenderControl / DisableIcon, when a button is disabled.
Enforcement
DisableIcon swaps in a _d-suffixed image variant and marks the ASP.NET control disabled.
Outcome
A visible-but-disabled action is visually distinguished (greyed icon) and cannot be clicked.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Toolbar icons render in fixed groups: right icons, then insert/save/delete/edit/cancel/submit, then print/preview/email/download/calculate.
Trigger
RenderControl.
Enforcement
Icons render in the fixed order: right-hand icons, then insert/save/delete/edit/cancel/submit, then print/preview/email/download/calculate.
Outcome
Toolbar layout is identical across every hosting page regardless of which buttons are visible.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
A pipe separator image is rendered after the insert/save/delete group.
Trigger
RenderControl, after the insert/save/delete/edit/cancel/submit group.
Enforcement
A pipe-separator image is rendered before the print/preview/email/download/calculate group.
Outcome
The two logical toolbar groups are visually separated.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Rendering failures are reported in-page as message, source and stack trace rather than raised.
Trigger
RenderControl (both controls), any unhandled exception during rendering.
Enforcement
The exception's message, source, and stack trace are caught and written directly into the rendered page rather than re-thrown.
Outcome
A rendering failure is visible to any viewer of the page, including full stack-trace detail — an information-disclosure risk in production.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
Field
Value
Statement
Every image button carries CSS class SAIFImageButton.
Trigger
SAIFImageButton.PreRender.
Enforcement
The control's CSS class is set to SAIFImageButton.
Outcome
Consistent base styling is guaranteed for every image button instance regardless of caller configuration.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFImageButton.vb
Field
Value
Statement
Enabling the indicator switches the class to SAIFImageButtonIndicator and publishes the DisableFormControls attribute.
Trigger
PreRender, EnableIndicator true.
Enforcement
CSS class switches to SAIFImageButtonIndicator and a DisableFormControls attribute is published on the rendered element.
Outcome
Client-side script can identify indicator-enabled buttons and disable the form while the AJAX action is in flight.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFImageButton.vb
Field
Value
Statement
ImageButton.js is registered once per page and only when the indicator is enabled.
Trigger
RegisterClientScripts, EnableIndicator true.
Enforcement
/Resources/Scripts/Controls/ImageButton.js is registered via a per-page duplicate-registration guard.
Outcome
The indicator's client script is loaded only when needed and never duplicated on a page with multiple indicator buttons.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFImageButton.vb
Field
Value
Statement
Each toolbar icon maps to exactly one ToolBarButton enum value raised to the host page.
Trigger
SAIFMenuTop.MenuImage_Click.
Enforcement
The clicked icon's ID is mapped to a single ToolBarButton enum value, which is passed to the raised ToolbarClick event.
Outcome
Host pages receive a strongly-typed, unambiguous indication of which toolbar action was invoked.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
The help icon raises both ToolbarClick(Help) and MenuNavigate("", "Help").
Trigger
MenuImage_Click, mnuHelp clicked.
Enforcement
Both ToolbarClick(ToolBarButton.Help) and MenuNavigate("", "Help") are raised for the same click.
Outcome
Host pages can handle Help either as a toolbar action or as a navigation event, or both.
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Field
Value
Statement
Toolbar click handling does not re-check button visibility or enabled state on the server.
Trigger
MenuImage_Click, any toolbar icon click.
Enforcement
Visibility/enabled guard checks exist only as commented-out code; the click handler raises its event unconditionally.
Outcome
A postback forged to target a hidden or disabled toolbar action still raises the corresponding event; the hosting page must re-validate the action server-side.*
Source
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
Notes
Mark inferred statements with * and unknown statements with **. Do not use bold inline confidence labels.
No business rule in this library involves direct database access; the two delegated persistence paths (menu authorization data and the SHOWAPPS preference) are documented in Database tables .
Note: Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with ** could not be confirmed; treat as unknown until verified.
Sources
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb
SAIF.Presentation.Web.Controls.V2.Menu/SAIFImageButton.vb