Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/), new .NET 10 Blazor solution (NEW/), OpenSpec specifications, documentation, and project configuration.
This commit is contained in:
+494
@@ -0,0 +1,494 @@
|
||||
# JDE Scoping Tool (LotFinder) - Legacy Web UI Documentation
|
||||
|
||||
This document describes the layout, look and feel, and navigation of the legacy .NET Framework 4.8 web application located in `OLD/WebInterface/`.
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Technology Stack](#technology-stack)
|
||||
2. [Visual Design & Theming](#visual-design--theming)
|
||||
3. [Page Layout Structure](#page-layout-structure)
|
||||
4. [Navigation Flow](#navigation-flow)
|
||||
5. [View Inventory](#view-inventory)
|
||||
6. [UI Components & Patterns](#ui-components--patterns)
|
||||
7. [Real-Time Features](#real-time-features)
|
||||
8. [Form Interactions](#form-interactions)
|
||||
9. [File Structure Reference](#file-structure-reference)
|
||||
|
||||
---
|
||||
|
||||
## Technology Stack
|
||||
|
||||
| Technology | Version | Purpose |
|
||||
|------------|---------|---------|
|
||||
| ASP.NET MVC | 5 | Web framework |
|
||||
| Bootstrap | 3.0.0 | Responsive CSS framework |
|
||||
| Kendo UI | 2019.2.619 | Enterprise UI components |
|
||||
| jQuery | 1.10.2 | DOM manipulation |
|
||||
| jQuery UI | 1.9.0 | UI widgets (datepicker support) |
|
||||
| SignalR | 2.2.1 | Real-time bidirectional communication |
|
||||
| jQuery File Upload | - | File upload handling |
|
||||
|
||||
---
|
||||
|
||||
## Visual Design & Theming
|
||||
|
||||
### Color Palette
|
||||
|
||||
The application uses Bootstrap's default color scheme with the **inverse navbar** (dark theme):
|
||||
|
||||
| Element | Color | Usage |
|
||||
|---------|-------|-------|
|
||||
| Navbar background | `#222` (dark gray) | Fixed top navigation |
|
||||
| Navbar brand text | `#9d9d9d` (light gray) | "JDE Scoping Tool" title |
|
||||
| Primary buttons | `#337ab7` (blue) | Submit, Login, action buttons |
|
||||
| Success background | `#dff0d8` (light green) | Completed status, Download Results |
|
||||
| Danger background | `#f2dede` (light red) | Error states, validation errors |
|
||||
| Warning background | `#fcf8e3` (light yellow) | Readonly notices |
|
||||
| Default background | `#eeeeee` (light gray) | Neutral states |
|
||||
| Error status color | `#FF6347` (tomato red) | Error status field |
|
||||
|
||||
### Typography
|
||||
|
||||
- **Font**: Browser default (system fonts)
|
||||
- **Kendo UI**: Uses Bootstrap theme styling for consistent appearance
|
||||
|
||||
### Layout Dimensions
|
||||
|
||||
```css
|
||||
body {
|
||||
padding-top: 50px; /* Space for fixed navbar */
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.body-content {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Page Layout Structure
|
||||
|
||||
### Master Layout (`_Layout.cshtml`)
|
||||
|
||||
```
|
||||
+----------------------------------------------------------+
|
||||
| [Navbar - Fixed Top] |
|
||||
| +------------------------------------------------------+ |
|
||||
| | JDE Scoping Tool [Username] [Login/Logout] | |
|
||||
| +------------------------------------------------------+ |
|
||||
+----------------------------------------------------------+
|
||||
| |
|
||||
| [Page Content - Container] |
|
||||
| +------------------------------------------------------+ |
|
||||
| | | |
|
||||
| | @RenderBody() | |
|
||||
| | | |
|
||||
| +------------------------------------------------------+ |
|
||||
| |
|
||||
| -------------------------------------------------------- |
|
||||
| [Footer: JDE Scoping Tool Version 4] |
|
||||
+----------------------------------------------------------+
|
||||
```
|
||||
|
||||
### Navbar Components
|
||||
|
||||
1. **Brand link**: "JDE Scoping Tool" - links to Home/Index
|
||||
2. **Hamburger menu**: Collapsible on mobile (3 icon bars)
|
||||
3. **Logon control** (right-aligned):
|
||||
- Unauthenticated: `[Login]` button
|
||||
- Authenticated: `Username [Logout]`
|
||||
|
||||
---
|
||||
|
||||
## Navigation Flow
|
||||
|
||||
```
|
||||
+----------------+
|
||||
| Login Page |
|
||||
| /Account/Login |
|
||||
+-------+--------+
|
||||
|
|
||||
[LDAP Authentication]
|
||||
|
|
||||
v
|
||||
+----------------------------------------------------------+
|
||||
| AUTHENTICATED AREA |
|
||||
+----------------------------------------------------------+
|
||||
| |
|
||||
| +------------------+ |
|
||||
| | Home/Index |-----> Redirects to |
|
||||
| +------------------+ Search/Index |
|
||||
| |
|
||||
| +------------------+ +--------------------+ |
|
||||
| | Search/Index |<------>| Search/Create | |
|
||||
| | (My Searches) | | (New/Edit Search) | |
|
||||
| +------------------+ +--------------------+ |
|
||||
| | | |
|
||||
| v v |
|
||||
| +------------------+ +--------------------+ |
|
||||
| | Search/Queue | | Download Results | |
|
||||
| | (All Searches) | | (Excel file) | |
|
||||
| +------------------+ +--------------------+ |
|
||||
| |
|
||||
| +------------------+ |
|
||||
| | RefreshStatus | (Admin: Cache sync status) |
|
||||
| +------------------+ |
|
||||
| |
|
||||
+----------------------------------------------------------+
|
||||
|
||||
Error States:
|
||||
- /Account/NotAuthorized -> Access denied page
|
||||
- /InvalidUA/InvalidUserAgent -> Browser not supported
|
||||
- Error.cshtml -> Generic error page
|
||||
```
|
||||
|
||||
### Page Descriptions
|
||||
|
||||
| Page | URL | Purpose |
|
||||
|------|-----|---------|
|
||||
| Login | `/Account/Login` | LDAP authentication form |
|
||||
| My Searches | `/Search/Index` | List user's saved searches |
|
||||
| New/Edit Search | `/Search/Create?id=X` | Create or view a search |
|
||||
| Copy Search | `/Search/Create?copySearchID=X` | Copy existing search |
|
||||
| Search Queue | `/Search/Queue` | Monitor all queued searches |
|
||||
| Refresh Status | `/RefreshStatus` | View data cache sync history |
|
||||
|
||||
---
|
||||
|
||||
## View Inventory
|
||||
|
||||
### Core Views
|
||||
|
||||
| View File | Title | Description |
|
||||
|-----------|-------|-------------|
|
||||
| `Views/Shared/_Layout.cshtml` | (Master) | Main layout template |
|
||||
| `Views/Account/Login.cshtml` | "Login" | Username/password form |
|
||||
| `Views/Account/NotAuthorized.cshtml` | "Authorization Error" | Access denied message |
|
||||
| `Views/Search/Index.cshtml` | "Searches" | Kendo Grid of user's searches |
|
||||
| `Views/Search/Create.cshtml` | "Search" | Complex search form (1459 lines) |
|
||||
| `Views/Search/Queue.cshtml` | "Search Queue" | Real-time queue monitor |
|
||||
| `Views/RefreshStatus/Index.cshtml` | "Cache Refresh Status" | Data sync history table |
|
||||
| `Views/InvalidUA/InvalidUserAgent.cshtml` | "Unapproved Browser" | IE/Chrome only warning |
|
||||
| `Views/Shared/Error.cshtml` | "Error" | Generic error page |
|
||||
|
||||
### Editor Templates (Kendo UI)
|
||||
|
||||
Located in `Views/Shared/EditorTemplates/`:
|
||||
|
||||
- `Currency.cshtml`, `Date.cshtml`, `DateTime.cshtml`
|
||||
- `Email.cshtml`, `EmailAddress.cshtml`
|
||||
- `Integer.cshtml`, `Number.cshtml`
|
||||
- `Password.cshtml`, `String.cshtml`
|
||||
- `Time.cshtml`, `Url.cshtml`
|
||||
- `GridForeignKey.cshtml`
|
||||
|
||||
---
|
||||
|
||||
## UI Components & Patterns
|
||||
|
||||
### Bootstrap Components Used
|
||||
|
||||
| Component | Usage |
|
||||
|-----------|-------|
|
||||
| `navbar navbar-inverse navbar-fixed-top` | Top navigation bar |
|
||||
| `container` | Content wrapper |
|
||||
| `panel panel-default` | Grouped form sections |
|
||||
| `form-horizontal` | Horizontal form layout |
|
||||
| `form-group` | Form field grouping |
|
||||
| `form-control` | Input styling |
|
||||
| `btn btn-primary/default/success` | Buttons |
|
||||
| `alert alert-danger/warning` | Notification messages |
|
||||
| `col-md-*` | Grid columns |
|
||||
|
||||
### Kendo UI Components Used
|
||||
|
||||
| Component | Usage |
|
||||
|-----------|-------|
|
||||
| `kendo.ui.Grid` | Data tables with sorting, paging |
|
||||
| `kendo.ui.ComboBox` | Autocomplete dropdowns |
|
||||
| `kendo.ui.DatePicker` | Date selection |
|
||||
| `kendo.ui.DropDownList` | Search type selection |
|
||||
| `kendo.ui.Validator` | Form validation |
|
||||
| `kendo.ui.Alert` | Modal alert dialogs |
|
||||
| `kendo.data.DataSource` | Data binding |
|
||||
| `kendo.observable` | MVVM view models |
|
||||
|
||||
### Common UI Patterns
|
||||
|
||||
#### 1. Panel with Header and Body
|
||||
```html
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
Panel Title
|
||||
<div class="btn-group" style="float: right;">
|
||||
[Action Buttons]
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body container">
|
||||
[Form Fields / Grid]
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
#### 2. Page Header with Actions
|
||||
```html
|
||||
<h2>
|
||||
Page Title
|
||||
<span class="btn-group" style="padding-left: 25px;">
|
||||
<a class="btn btn-sm btn-primary">Primary Action</a>
|
||||
<a class="btn btn-sm btn-default">Secondary Action</a>
|
||||
</span>
|
||||
</h2>
|
||||
```
|
||||
|
||||
#### 3. Readonly Warning Notice
|
||||
```html
|
||||
<div class="alert alert-warning" data-bind="visible: IsReadOnly">
|
||||
<strong>Note:</strong> search is readonly...
|
||||
<button class="btn btn-default" id="copyBTN">Copy</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Real-Time Features
|
||||
|
||||
### SignalR Hub Integration
|
||||
|
||||
The application uses SignalR for real-time status updates:
|
||||
|
||||
```javascript
|
||||
// Connection setup
|
||||
var statusHub = $.connection.statusHub;
|
||||
|
||||
// Event handlers
|
||||
statusHub.client.statusUpdate = function(statusUpdate) {
|
||||
// Update status display
|
||||
};
|
||||
|
||||
statusHub.client.searchUpdate = function(searchUpdate) {
|
||||
// Update search grid
|
||||
};
|
||||
|
||||
// Start connection with auto-reconnect
|
||||
$.connection.hub.start().done(function() { });
|
||||
|
||||
$.connection.hub.disconnected(function() {
|
||||
setTimeout(function() {
|
||||
$.connection.hub.start();
|
||||
}, 5000); // Reconnect after 5 seconds
|
||||
});
|
||||
```
|
||||
|
||||
### Real-Time Updates
|
||||
|
||||
| Event | Triggered When | UI Update |
|
||||
|-------|----------------|-----------|
|
||||
| `searchUpdate` | Search status changes | Grid row updates |
|
||||
| `statusUpdate` | Worker service status changes | Status panel updates |
|
||||
|
||||
---
|
||||
|
||||
## Form Interactions
|
||||
|
||||
### Search/Index Page
|
||||
|
||||
**My Searches Grid:**
|
||||
- Columns: Name, Submitted (formatted date), Status, Actions
|
||||
- Sortable with multi-column support
|
||||
- Pageable (10 per page)
|
||||
- Row double-click opens search in new window
|
||||
- "View" button opens search in new window
|
||||
|
||||
**Action Buttons:**
|
||||
- "Start New Search" - Opens `/Search/Create` (new window)
|
||||
- "View Search Queue" - Opens `/Search/Queue` (new window)
|
||||
|
||||
### Search/Create Page
|
||||
|
||||
**Search Details Panel:**
|
||||
|
||||
| Field | Type | Behavior |
|
||||
|-------|------|----------|
|
||||
| Search Type | Dropdown | Changes visible filter sections |
|
||||
| Name | Text input | Required, editable when New |
|
||||
| Submitted At | Text (readonly) | Shows submit timestamp |
|
||||
| Started At | Text (readonly) | Shows processing start |
|
||||
| Completed At | Text (readonly) | Shows completion time |
|
||||
| User | Text (readonly) | Shows owner username |
|
||||
| Status | Text (readonly) | Color-coded background |
|
||||
| Download Results | Button | Visible when status=Ended |
|
||||
|
||||
**Filter Sections (shown based on Search Type):**
|
||||
|
||||
| Section | Controls |
|
||||
|---------|----------|
|
||||
| Timespan | Min Date (datepicker), Max Date (datepicker) |
|
||||
| Work Order | Grid, Upload/Download/Clear buttons |
|
||||
| Item Number | ComboBox (autocomplete), Add button, Grid |
|
||||
| Profit Center | ComboBox (autocomplete), Add button, Grid |
|
||||
| Work Center | ComboBox (autocomplete), Add button, Grid |
|
||||
| Component Lot | Grid, Upload/Download/Clear buttons |
|
||||
| Operator | ComboBox (autocomplete), Add button, Grid |
|
||||
| Item/Operation/MIS | Grid, Upload/Download/Clear buttons |
|
||||
| Extract MIS Data | Checkbox (readonly display) |
|
||||
|
||||
**Valid Search Type Combinations:**
|
||||
|
||||
```javascript
|
||||
// From models.js - 16 valid combinations
|
||||
1. "Work Order"
|
||||
2. "Component Lot"
|
||||
3. "Time Span + Profit Center"
|
||||
4. "Time Span + Work Center"
|
||||
5. "Time Span + Operator"
|
||||
6. "Time Span + Profit Center + Item Number"
|
||||
7. "Time Span + Profit Center + Item/Operation/MIS"
|
||||
8. "Time Span + Profit Center + Work Order + Item/Operation/MIS"
|
||||
9. "Time Span + Profit Center + Extract MIS"
|
||||
10. "Time Span + Work Center + Item Number"
|
||||
11. "Time Span + Work Center + Extract MIS"
|
||||
12. "Time Span + Work Center + Item/Operation/MIS"
|
||||
13. "Time Span + Work Center + Work Order + Item/Operation/MIS"
|
||||
14. "Time Span + Item Number"
|
||||
15. "Time Span + Work Center + Operator"
|
||||
16. "Time Span + Profit Center + Operator"
|
||||
```
|
||||
|
||||
**Button States:**
|
||||
|
||||
| Status | Submit | Copy | Download |
|
||||
|--------|--------|------|----------|
|
||||
| New | Visible | Hidden | Hidden |
|
||||
| Queued/Running | Hidden | Visible | Hidden |
|
||||
| Ended | Hidden | Visible | Visible |
|
||||
| Error | Hidden | Visible | Hidden |
|
||||
|
||||
### Search/Queue Page
|
||||
|
||||
**Status Panel:**
|
||||
- Status Message (readonly text)
|
||||
- Last Update Timestamp (readonly text)
|
||||
|
||||
**Queue Grid:**
|
||||
- Columns: Owner, Name, Submitted, Started, Ended, Status
|
||||
- Sortable with multi-column support
|
||||
- Pageable (20 per page)
|
||||
- Searches removed when status=Ended or Error
|
||||
|
||||
### Login Page
|
||||
|
||||
Simple horizontal form:
|
||||
- Username (text input, 400px width)
|
||||
- Password (password input, 400px width)
|
||||
- Login button (btn-primary)
|
||||
- Error messages in alert-danger divs
|
||||
|
||||
---
|
||||
|
||||
## File Structure Reference
|
||||
|
||||
### Views Directory
|
||||
```
|
||||
Views/
|
||||
├── _ViewStart.cshtml # Sets default layout
|
||||
├── web.config # View configuration
|
||||
├── Account/
|
||||
│ ├── Login.cshtml # Login form
|
||||
│ └── NotAuthorized.cshtml # Access denied
|
||||
├── InvalidUA/
|
||||
│ └── InvalidUserAgent.cshtml # Browser warning
|
||||
├── RefreshStatus/
|
||||
│ └── Index.cshtml # Cache status table
|
||||
├── Search/
|
||||
│ ├── Index.cshtml # My searches grid
|
||||
│ ├── Create.cshtml # Search form (1459 lines)
|
||||
│ └── Queue.cshtml # Queue monitor
|
||||
└── Shared/
|
||||
├── _Layout.cshtml # Master layout
|
||||
├── Error.cshtml # Error page
|
||||
└── EditorTemplates/ # Kendo editor templates
|
||||
```
|
||||
|
||||
### JavaScript Files
|
||||
```
|
||||
Scripts/
|
||||
├── Custom/
|
||||
│ ├── widgets.js # Kendo widget extensions
|
||||
│ ├── kendoHelpers.js # Grid/DataSource helpers
|
||||
│ ├── confirmationDialog.js # Confirmation modal
|
||||
│ └── model/models.js # View models, ValidCombinations
|
||||
├── Vendor/
|
||||
│ ├── jquery-1.10.2.js
|
||||
│ ├── jquery-ui-1.9.0.min.js
|
||||
│ ├── jquery.validate.js
|
||||
│ ├── jquery.validate.unobtrusive.js
|
||||
│ ├── jquery.signalR-2.2.1.js
|
||||
│ ├── bootstrap.js
|
||||
│ ├── modernizr-2.6.2.js
|
||||
│ └── respond.js
|
||||
├── jQuery.FileUpload/ # File upload plugin
|
||||
│ ├── jquery.fileupload.js
|
||||
│ ├── jquery.iframe-transport.js
|
||||
│ ├── jquery.fileupload-process.js
|
||||
│ └── jquery.fileupload-ui.js
|
||||
├── js-cookie/
|
||||
│ └── js.cookie.js
|
||||
└── kendo/2019.2.619/ # Full Kendo UI suite
|
||||
├── kendo.all.min.js
|
||||
├── kendo.aspnetmvc.min.js
|
||||
├── jszip.min.js
|
||||
└── kendo.modernizr.custom.js
|
||||
```
|
||||
|
||||
### CSS/Styling Files
|
||||
```
|
||||
Content/
|
||||
├── Site.css # Custom styles (minimal)
|
||||
├── bootstrap.css # Bootstrap 3.0.0
|
||||
├── bootstrap.min.css
|
||||
├── themes/base/ # jQuery UI theme
|
||||
├── jQuery.FileUpload/css/ # File upload styling
|
||||
└── kendo/2019.2.619/ # Kendo themes
|
||||
├── kendo.common-bootstrap.min.css
|
||||
├── kendo.bootstrap.min.css
|
||||
├── kendo.mobile.all.min.css
|
||||
├── kendo.dataviz.min.css
|
||||
├── kendo.dataviz.bootstrap.min.css
|
||||
├── fonts/ # DejaVu fonts
|
||||
└── images/ # Kendo sprites
|
||||
```
|
||||
|
||||
### Controllers
|
||||
```
|
||||
Controllers/
|
||||
├── CrudController.cs # Base controller
|
||||
├── AccountController.cs # Login/Logout
|
||||
├── HomeController.cs # Redirect to Search
|
||||
├── SearchController.cs # Main search operations
|
||||
├── FileIOController.cs # Excel upload/download
|
||||
├── LookupController.cs # Autocomplete APIs
|
||||
├── SessionController.cs # Session management
|
||||
└── InvalidUAController.cs # Browser validation
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration Notes for Blazor WebAssembly
|
||||
|
||||
When migrating to Blazor WebAssembly, consider these UI/UX elements to preserve:
|
||||
|
||||
1. **Layout**: Bootstrap 5 navbar with similar dark theme
|
||||
2. **Grids**: MudBlazor DataGrid or similar component
|
||||
3. **Forms**: Cascading validation, panel-based grouping
|
||||
4. **Real-time**: SignalR Core for status updates
|
||||
5. **Autocomplete**: Server-filtered dropdowns with debounce
|
||||
6. **File uploads**: InputFile component with progress
|
||||
7. **Dialogs**: Confirmation modals before destructive actions
|
||||
8. **State**: Similar readonly/editable state management
|
||||
9. **Date formatting**: MM/dd/yyyy hh:mm:ss tt pattern
|
||||
10. **Valid combinations**: Same 16 search type combinations
|
||||
Reference in New Issue
Block a user