Files
jdescopingtool/DOCUMENTATION/search_creation_page.md
T
Joseph Doherty 26ff8d9b4f 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.
2026-01-02 07:43:29 -05:00

474 lines
17 KiB
Markdown

# Search Creation Page - Functionality Analysis
This document provides a comprehensive analysis of the legacy search creation page (`OLD/WebInterface/Views/Search/Create.cshtml`) for migration to the new .NET 10 Blazor application.
## Overview
The search creation page allows users to create complex manufacturing/ERP searches by combining various filter criteria. It uses Kendo UI for data binding and widgets, jQuery FileUpload for Excel file handling, and SignalR for real-time status updates.
---
## Page Structure
### Header Section
- **Title**: "Search"
- **Submit Button**: Triggers validation and saves the search
### Search Details Panel
| Field | Type | Behavior |
|-------|------|----------|
| Search Type | Dropdown | **Required**. Selects from 16 predefined filter combinations. Controls which filter panels are visible. |
| Name | Text input | **Required**. User-friendly name for the search. |
| Submitted At | Read-only text | Displays when search was submitted (formatted: `MM/dd/yyyy hh:mm:ss tt`) |
| Started At | Read-only text | Displays when processing started |
| Completed At | Read-only text | Displays when processing completed |
| User | Read-only text | Username of search creator (auto-populated) |
| Status | Read-only text | Current status with color coding (red background for Error status) |
| Download Results | Button | Visible only when `Status === 'Ended'`. Downloads Excel results. |
### Read-Only Mode
When a search has been submitted (`Status !== 'New'`):
- Submit button is hidden
- All inputs are disabled
- Template upload/download/clear buttons are hidden
- A warning notice is displayed with a **Copy** button to duplicate the search
---
## Valid Search Type Combinations
The system enforces 16 predefined filter combinations defined in `OLD/WebInterface/Scripts/model/models.js`:
| ID | Name | Timespan | Work Order | Item Number | Profit Center | Work Center | Component Lot | Operator | Item/Op/MIS | Extract MIS |
|----|------|----------|------------|-------------|---------------|-------------|---------------|----------|-------------|-------------|
| 10 | Work Order | | x | | | | | | | |
| 20 | Component Lot | | | | | | x | | | |
| 30 | Time Span + Profit Center | x | | | x | | | | | |
| 40 | Time Span + Work Center | x | | | | x | | | | |
| 50 | Time Span + Operator | x | | | | | | x | | |
| 60 | Time Span + Profit Center + Item Number | x | | x | x | | | | | |
| 70 | Time Span + Profit Center + Item/Operation/MIS | x | | | x | | | | x | |
| 80 | Time Span + Profit Center + Work Order + Item/Operation/MIS | x | x | | x | | | | x | |
| 90 | Time Span + Profit Center + Extract MIS | x | | | x | | | | | x |
| 100 | Time Span + Work Center + Item Number | x | | x | | x | | | | |
| 110 | Time Span + Work Center + Extract MIS | x | | | | x | | | | x |
| 120 | Time Span + Work Center + Item/Operation/MIS | x | | | | x | | | x | |
| 130 | Time Span + Work Center + Work Order + Item/Operation/MIS | x | x | | | x | | | x | |
| 140 | Time Span + Item Number | x | | x | | | | | | |
| 150 | Time Span + Work Center + Operator | x | | | | x | | x | | |
| 160 | Time Span + Profit Center + Operator | x | | | x | | | x | | |
---
## Filter Panels
### 1. Time Span Filter
**Panel Header**: "Filter by timespan"
| Field | Type | Validation | Notes |
|-------|------|------------|-------|
| Min Date | Kendo DatePicker | **Required** when filter is active. Must be valid date. | Min: Nov 1, 2002. Max: Today or Max Date if set. |
| Max Date | Kendo DatePicker | **Required** when filter is active. Must be valid date. | Min: Nov 1, 2002 or Min Date if set. Max: Today. |
**Interactions**:
- Min/Max pickers constrain each other (selecting min date sets min of max picker, and vice versa)
- Custom validation prevents invalid date text
---
### 2. Work Order Filter
**Panel Header**: "Filter by work order"
**Data Display**: Kendo Grid showing:
- Work Order Number
- Item Number (looked up from database)
**File Operations**:
| Button | Action | Endpoint |
|--------|--------|----------|
| Download Template | Downloads Excel with current data | `POST FileIO/DownloadWorkOrders``GET FileIO/DownloadWorkOrders?key` |
| Upload Data | Uploads Excel file, validates work orders against DB | `POST FileIO/UploadWorkOrders` |
| Clear Data | Clears grid after confirmation dialog | Local action |
**Upload Format**: Excel file with column "Work Order Number" (starting row 2)
**Validation**: At least one work order required when filter is active
---
### 3. Item Number Filter
**Panel Header**: "Filter by item number"
**Input Method**: Kendo ComboBox with server-side autocomplete
- Minimum 3 characters to trigger search
- Filter: "contains"
- Template displays: Item Number | Description
- Endpoint: `GET Lookup/FindItem?itemNumber=...`
**Data Display**: Kendo Grid showing:
- Item Number
- Description
- Delete action button
**Actions**:
| Button | Action |
|--------|--------|
| Add to filter | Adds selected item from combobox to grid |
| Delete (per row) | Removes item from grid |
| Clear Data | Clears grid after confirmation |
| Download Template | Downloads Excel with current items |
| Upload Data | Uploads Excel file of item numbers |
**File Operations**:
| Button | Endpoint |
|--------|----------|
| Download Template | `POST FileIO/DownloadPartNumbers``GET FileIO/DownloadPartNumbers?key` |
| Upload Data | `POST FileIO/UploadPartNumbers` |
**Upload Format**: Excel file with column "Item Number" (starting row 2)
**Validation**: At least one item required when filter is active
---
### 4. Profit Center Filter
**Panel Header**: "Filter by profit center"
**Input Method**: Kendo ComboBox with server-side autocomplete
- Minimum 3 characters to trigger search
- Filter: "contains"
- Template displays: Code | Description
- Endpoint: `GET Lookup/FindProfitCenter?profitCenter=...`
**Data Display**: Kendo Grid showing:
- Code (Profit Center)
- Description
- Delete action button
**Actions**:
| Button | Action |
|--------|--------|
| Add to filter | Adds selected profit center from combobox to grid |
| Delete (per row) | Removes profit center from grid |
| Clear Data | Clears grid after confirmation |
**No file upload/download** for this filter.
**Validation**: At least one profit center required when filter is active
---
### 5. Work Center Filter
**Panel Header**: "Filter by work center"
**Input Method**: Kendo ComboBox with server-side autocomplete
- Minimum 3 characters to trigger search
- Filter: "contains"
- Template displays: Code | Description
- Endpoint: `GET Lookup/FindWorkCenter?workCenter=...`
**Data Display**: Kendo Grid showing:
- Code (Work Center)
- Description
- Delete action button
**Actions**:
| Button | Action |
|--------|--------|
| Add to filter | Adds selected work center from combobox to grid |
| Delete (per row) | Removes work center from grid |
| Clear Data | Clears grid after confirmation |
**No file upload/download** for this filter.
**Validation**: At least one work center required when filter is active
---
### 6. Component Lot Filter
**Panel Header**: "Filter by component lot"
**Data Display**: Kendo Grid showing:
- Lot Number
- Item Number
**File Operations**:
| Button | Action | Endpoint |
|--------|--------|----------|
| Download Template | Downloads Excel with current data | `POST FileIO/DownloadComponentLots``GET FileIO/DownloadComponentLots?key` |
| Upload Data | Uploads Excel file, validates lots against DB | `POST FileIO/UploadComponentLots` |
| Clear Data | Clears grid after confirmation dialog | Local action |
**Upload Format**: Excel file with columns "Component Lot Number", "Component Item Number" (starting row 2)
**Validation**: At least one component lot required when filter is active
---
### 7. Operator Filter
**Panel Header**: "Filter by operator"
**Input Method**: Kendo ComboBox with server-side autocomplete
- Minimum 3 characters to trigger search
- Filter: "contains"
- Template displays: Address Number | User ID | Full Name
- Endpoint: `GET Lookup/FindOperator?operatorName=...`
**Data Display**: Kendo Grid showing:
- Address Number
- User ID
- Full Name
- Delete action button
**Actions**:
| Button | Action |
|--------|--------|
| Add to filter | Adds selected operator from combobox to grid |
| Delete (per row) | Removes operator from grid |
| Clear Data | Clears grid after confirmation |
**No file upload/download** for this filter.
**Validation**: At least one operator required when filter is active
---
### 8. Item/Operation/MIS Filter
**Panel Header**: "Filter By Item/Operation/MIS"
**Data Display**: Kendo Grid showing:
- Item Number
- Operation Step Number
- MIS Number
- MIS Revision
**File Operations**:
| Button | Action | Endpoint |
|--------|--------|----------|
| Download Template | Downloads Excel with current data | `POST FileIO/DownloadPartOperations``GET FileIO/DownloadPartOperations?key` |
| Upload Data | Uploads Excel file (no DB validation) | `POST FileIO/UploadPartOperations` |
| Clear Data | Clears grid after confirmation dialog | Local action |
**Upload Format**: Excel file with columns "Item Number", "Operation Number", "MIS Number", "MIS Revision" (starting row 2)
**Note**: Operation numbers with decimals are truncated to integers during upload.
**Validation**: At least one entry required when filter is active
---
### 9. Extract MIS Data Option
**Panel Header**: "Extract MIS data"
**Display**: Read-only checkbox that is automatically checked when this search type is selected. Not user-editable.
---
## API Endpoints Summary
### Search Operations
| Endpoint | Method | Purpose |
|----------|--------|---------|
| `Search/Create` | GET | Renders the search creation view |
| `Search/GetSearch?id=` | GET | Loads existing search or creates blank search |
| `Search/CopySearch?id=` | GET | Creates copy of existing search (resets status/timestamps) |
| `Search/Save` | POST | Saves search criteria, queues for processing |
| `Search/GetResults?id=` | GET | Downloads Excel results for completed search |
### Lookup/Autocomplete
| Endpoint | Method | Purpose |
|----------|--------|---------|
| `Lookup/FindItem?itemNumber=` | GET | Searches items by number (contains filter) |
| `Lookup/FindProfitCenter?profitCenter=` | GET | Searches profit centers by code |
| `Lookup/FindWorkCenter?workCenter=` | GET | Searches work centers by code |
| `Lookup/FindOperator?operatorName=` | GET | Searches operators by name |
### File I/O
| Endpoint | Method | Purpose | Template File |
|----------|--------|---------|---------------|
| `FileIO/UploadWorkOrders` | POST | Upload work order Excel | - |
| `FileIO/DownloadWorkOrders` | POST/GET | Download work order template | `work_order_template.xlsx` |
| `FileIO/UploadPartNumbers` | POST | Upload item number Excel | - |
| `FileIO/DownloadPartNumbers` | POST/GET | Download item template | `item_number_template.xlsx` |
| `FileIO/UploadComponentLots` | POST | Upload component lot Excel | - |
| `FileIO/DownloadComponentLots` | POST/GET | Download component lot template | `component_lot_template.xlsx` |
| `FileIO/UploadPartOperations` | POST | Upload item/op/MIS Excel | - |
| `FileIO/DownloadPartOperations` | POST/GET | Download item/op/MIS template | `item_operations_mis_template.xlsx` |
---
## JavaScript Architecture
### Libraries Used
- **Kendo UI**: Observable viewModel, DataSource, Grid, ComboBox, DatePicker, DropDownList, Validator, Alert, Window
- **jQuery FileUpload**: Handles Excel file uploads with iframe transport
- **SignalR 2.2.1**: Real-time status updates from server
- **js-cookie**: Cookie handling (included but usage not prominent)
- **jQuery UI**: General UI utilities
### ViewModel Structure
The page uses a Kendo Observable viewModel with the following properties:
```javascript
{
// Search details
ID: null,
Name: null,
SubmitDT: null,
StartDT: null,
EndDT: null,
UserName: null,
Status: null,
StatusColor: function(), // Returns '#FF6347' for Error, '#eee' otherwise
// Filter flags (control panel visibility)
TimeSpan_FilterFlag: false,
LotNumbers_FilterFlag: false,
PartNumbers_FilterFlag: false,
ProfitCenters_FilterFlag: false,
WorkCenters_FilterFlag: false,
ComponentLotNumbers_FilterFlag: false,
OperatorIDs_FilterFlag: false,
PartOperations_FilterFlag: false,
ExtractMisData_FilterFlag: false,
// Filter data
MinimumDT: null,
MaximumDT: null,
LotNumbers: DataSource,
PartNumbers: DataSource,
ProfitCenters: DataSource,
WorkCenters: DataSource,
ComponentLotNumbers: DataSource,
OperatorIDs: DataSource,
PartOperations: DataSource,
// Combobox selection state
PartNumbers_AddItem: null,
ProfitCenters_AddItem: null,
WorkCenters_AddItem: null,
OperatorIDs_AddItem: null,
// UI state
IsReadOnly: true,
HasResults: false,
ValidCombinations: [...], // 16 valid search types
SearchType: null
}
```
### Key Functions
| Function | Purpose |
|----------|---------|
| `viewModel.setData(data)` | Populates viewModel from server response, determines search type from filter flags |
| `viewModel.SearchType_Change()` | Shows/hides filter panels based on selected search type |
| `submitSearch()` | Extracts form data, sends to server, handles timeout/errors |
| `loadSearchDetails(id)` | Loads existing search from server |
| `copySearchDetails(id)` | Loads search for copying (resets ID to 0) |
| `showConfirmationWindow(message)` | Displays Kendo confirmation dialog, returns Promise |
| `getParameterByName(name)` | Extracts URL query parameter |
---
## SignalR Integration
### Hub Connection
- Connects to `StatusHub` via `/signalr/hubs`
- Auto-reconnects after 5 seconds on disconnect
### Events
| Event | Purpose |
|-------|---------|
| `searchUpdate` | Receives status updates when search status changes. Updates SubmitDT, StartDT, EndDT, Status, HasResults. |
### Status Values
| Status | Description | UI Behavior |
|--------|-------------|-------------|
| `New` | Not yet submitted | Editable mode |
| `Queued` | Waiting to be processed | Read-only mode |
| `Running` | Currently processing | Read-only mode |
| `Ended` | Completed successfully | Read-only mode, Download Results visible |
| `Error` | Failed | Read-only mode, Status field has red background |
---
## Validation Rules
### Form-Level Validation (Kendo Validator)
1. **Search Type**: Required
2. **Name**: Required
3. **Date Pickers**: Must be valid dates when visible
### Filter-Level Validation (Submit Handler)
When a filter panel is active, its data collection must have at least one item:
| Filter | Validation Message |
|--------|-------------------|
| Work Orders | "At least one work order must be specified for the work order filter." |
| Item Numbers | "At least one item number must be specified for the item number filter." |
| Profit Centers | "At least one profit center must be specified for the profit center filter." |
| Work Centers | "At least one work center must be specified for the work center filter." |
| Component Lots | "At least one component lot must be specified for the component lot filter." |
| Operators | "At least one operator must be specified for the operator filter." |
| Part Operations | "At least one item/operation/MIS entry must be specified for the MIS data filter." |
### Confirmation Dialogs
Shown before:
- Submitting the search
- Clearing any filter data collection
---
## File Upload/Download Flow
### Upload Flow
1. User clicks hidden file input via styled label
2. jQuery FileUpload sends file to endpoint with `autoUpload: true`
3. Server parses Excel, optionally validates against database
4. Server returns `{ WasSuccessful: true/false, Data: [...], ErrorMessage: "..." }`
5. On success, viewModel DataSource is updated with returned data
6. On failure, `alert()` displays error message
### Download Flow
1. User clicks Download Template button
2. Current data is POSTed to server
3. Server generates Excel, caches it with GUID key (1 minute TTL)
4. Server returns cache key
5. Client appends hidden iframe with `src` pointing to GET endpoint with key
6. Browser downloads file via iframe
---
## Dead Code / Legacy References
- `CheckCamstar_Flag`: Referenced in submit payload (`Create.cshtml:1343`) but no corresponding viewModel property or UI element exists. Likely deprecated functionality.
---
## Migration Considerations
### UI Framework Changes
- Replace Kendo UI with MudBlazor or similar Blazor component library
- Replace Kendo Observable with Blazor component state
- Replace Kendo DataSource with standard .NET collections
- Replace Kendo Validator with Blazor EditForm validation
### File Handling
- Replace jQuery FileUpload with Blazor file upload (InputFile component)
- Keep EPPlus for Excel generation
- Consider streaming large files
### Real-Time Updates
- Replace legacy SignalR with ASP.NET Core SignalR
- Update hub connection patterns for Blazor
### API Structure
- Keep similar endpoint structure
- Update controllers for ASP.NET Core
- Consider REST API patterns with proper HTTP methods
### State Management
- Consider Fluxor or similar state management for complex form state
- Or use cascading parameters for simpler approach