Compare commits

4 Commits

Author SHA1 Message Date
791d4b7fb1 Add SLx Series and ML Series to Units Shipped/Ordered queries
Added two new product series to all 4 sales queries (by_series and
by_power_input for both Units Shipped and Units Ordered):
- SLx Series: items 36628, 34487
- ML Series: items 37109, 37111

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:08:25 -04:00
52b3c2b1af Alphabetize Operations nav buttons and fix Awaiting Shipment query
Nav buttons in Operations section now in alphabetical order across all
11 pages: Engineering Holds, External Process, Job Drawing Status,
Unused Items, WO Shortages.

Fixed Awaiting Shipment query:
- Primary focus on manufactured part (the item in stockroom), not finished part
- Added wm_op.womatl_qtyiss < wm_op.womatl_qtyreq filter to exclude
  completed external process cycles (was showing 10-year-old data)
- Removed unreliable date_in_stockroom/days_waiting columns
- Added WO number and manufactured part description columns

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:52:00 -04:00
a9f0e75e1b Add Operations - External Process page for vendor processing tracking
Two-tab dashboard tracking external labor workflows (e.g., tin plating):
- Tab 1 "At Vendor": Open POs for outside process items (EXTLAB classcode),
  showing vendor, PO#, finished/manufactured/ext labor PNs, qty, ship date,
  expected return (7-day default), days out, and WO demand
- Tab 2 "Awaiting Shipment": WOs with manufactured material issued but no
  open PO for the outside process item, showing days waiting in stockroom

Nav button added to all 11 pages in Operations section (rows 56-60).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:41:49 -04:00
b5e74cebb7 Add Operations - WO Shortages page with MTS/MTO shortage tracking
Automates the production manager's manual workflow of checking xTuple WO
Schedule + Kit Material Shortage for FA department work orders. Two tabs:
WO Shortages (detail per WO + shortage line with customer name, YYYY-MM-DD
dates) and Critical Parts (aggregated parts blocking near-term shipments
with QOH from MPE warehouse). Nav button added to all pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:47:58 -04:00
220 changed files with 6459 additions and 1522 deletions

View File

@@ -0,0 +1,12 @@
---
description: Do not create or add to the /docs directory
alwaysApply: true
---
# No /docs Directory Changes
Do **not** create new files under `docs/` or add to or modify any content in the `docs/` directory.
- Do not create new files in `docs/`.
- Do not edit or append to existing files in `docs/`.
- When a task would normally involve documentation (e.g. README updates, changelog notes), skip any changes under `docs/` unless the user explicitly asks to change that directory.

BIN
.cursor/skills/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,107 @@
---
name: add-query-to-table
description: Adds a new DB query to a page and wires it to a Table widget; documents how parameter/search syntax works (widget bindings, optional date range). Use when the user asks to add a query, connect a query to a table, create a new query, or how parameters/filters work in queries.
---
# Add Query to Table & Parameter Search Syntax
Use this skill when adding a new query to a page, wiring a query to a table, or when you need the correct syntax for parameterized filters (e.g. date range from widgets).
## 1. Query structure (single source of truth)
Each query lives under the page in a folder named after the query:
- **Path**: `pages/<PageName>/queries/<query_name>/`
- **Files**:
- **`<query_name>.txt`** -- Raw SQL. This is the **source of truth** for the query body. Keep it readable (real newlines, no escaping).
- **`metadata.json`** -- Appsmith action config. The `body` inside `unpublishedAction.actionConfiguration` must match the SQL in the `.txt` file, stored as a single-line string with `\n` for newlines and `\"` for double quotes.
**Naming**: Use lowercase with underscores (e.g. `units_ordered_by_series`, `pending_pos_slx_pending`). The query name is the identifier used in bindings (e.g. `{{query_name.data}}`).
## 2. Metadata.json required fields
- **`gitSyncId`** (CRITICAL): Must be the **first field** in the root object. Format: `"<24-char-hex>_<uuid-v4>"`. Without this, Appsmith will auto-remove the query on the next pull/sync. Generate with:
```bash
python3 -c "import uuid; print(uuid.uuid4().hex[:24] + '_' + str(uuid.uuid4()))"
```
Use the same 24-char hex prefix as the page's `gitSyncId` but a unique UUID suffix.
- **`id`**: `"<PageName>_<query_name>"` (e.g. `"Pending POs - SLx Pending_pending_pos_slx_pending"`).
- **`name`**: `"<query_name>"` (must match the folder and the name used in bindings).
- **`unpublishedAction.actionConfiguration.body`**: The exact SQL from `<query_name>.txt`, escaped for JSON (newlines -> `\n`, `"` -> `\"`).
- **`unpublishedAction.datasource`**: Use the same as other queries on the page (e.g. `xTuple_Sandbox`).
- **`unpublishedAction.pageId`**: `"<PageName>"`.
- **`unpublishedAction.dynamicBindingPathList`**: `[{"key":"body"}]` when the body contains `{{...}}` widget references.
- Keep **`pluginId`**: `"postgres-plugin"`, **`pluginType`**: `"DB"`, and existing flags like **`encodeParamsToggle`**, **`paginationType`**, **`pluginSpecifiedTemplates`**, **`timeoutInMillisecond`** consistent with other DB queries in the app.
When adding a new query, copy an existing query's `metadata.json` from the same page and change `gitSyncId`, `id`, `name`, and `body` (and ensure `body` stays in sync with the new `.txt` file).
## 3. Wiring the query to a Table widget
- In the Table widget JSON (e.g. `widgets/.../Table1.json`), set:
- **`tableData`**: `"{{<query_name>.data}}"`
- Table columns read from the query result by **key**. The key is the **SELECT alias** from the query (e.g. `"Product"`, `"Qty Ordered"`). In `primaryColumns`, the column **id** can be a safe identifier (e.g. `Qty_Ordered`) while **originalId** / **alias** / **label** match the display name; **computedValue** must use the same key as in the query result, e.g. `currentRow["Qty Ordered"]`.
So: **query SELECT aliases = keys in the table's row object**. Keep column keys and any `currentRow["..."]` references in the table in sync with those aliases.
## 4. Parameter search syntax (widgets in SQL)
### 4.1 Referencing a widget value
- **Syntax**: `{{WidgetName.property}}`
- **Examples**:
- DatePicker date: `{{SeriesDateFrom.selectedDate}}`, `{{PowerDateTo.selectedDate}}`
- Other widgets: use the widget's value property (e.g. `selectedOptionValue`, `text`) as per Appsmith docs.
Values are injected as strings. For PostgreSQL dates you typically cast in SQL, e.g. `'{{DatePicker1.selectedDate}}'::date`.
### 4.2 Optional date range (no filter when either date is empty)
Use this pattern so that:
- If **either** date widget is empty -> the date condition is **not** applied (all dates allowed).
- If **both** are set -> filter by `date_column BETWEEN from ::date AND to ::date`.
**SQL pattern** (replace widget names and column as needed):
```sql
AND (
NULLIF('{{DateFromWidget.selectedDate}}','') IS NULL
OR NULLIF('{{DateToWidget.selectedDate}}','') IS NULL
OR date_column BETWEEN
NULLIF('{{DateFromWidget.selectedDate}}','')::date
AND NULLIF('{{DateToWidget.selectedDate}}','')::date
)
```
- **Logic**: `NULLIF('{{...}}','')` turns an empty string into SQL `NULL`. If either widget is empty, one of the first two conditions is true, so the whole `AND (...)` is true and the BETWEEN is not applied. When both are non-empty, the third branch applies the range.
- **Widget names**: Use the actual widget names (e.g. `SeriesDateFrom` / `SeriesDateTo` for one tab, `PowerDateFrom` / `PowerDateTo` for another). Ensure those widgets exist on the same page and (if in a tab) the same tab so the query runs with the right context.
### 4.3 Required parameters (always filter)
If the filter must always be applied (no "show all" when empty):
- Use the binding directly and ensure the widget always has a value, or use a default in the widget.
- Example: `AND cohead_orderdate BETWEEN '{{DateFrom.selectedDate}}'::date AND '{{DateTo.selectedDate}}'::date` -- then empty dates may produce invalid SQL or empty results, so prefer the optional pattern above unless the UI guarantees non-empty values.
## 5. Checklist when adding a new query
1. Create `pages/<PageName>/queries/<query_name>/`.
2. Add `<query_name>.txt` with the full SQL (source of truth).
3. Add `metadata.json` with correct `gitSyncId`, `id`, `name`, `body` (body = SQL from .txt, JSON-escaped), and same datasource/pageId as other page queries.
4. If the SQL uses `{{...}}`, set `dynamicBindingPathList` to `[{"key":"body"}]`.
5. In the Table widget that should show the data, set `tableData` to `{{<query_name>.data}}`.
6. Ensure table column keys / `currentRow["..."]` match the query's SELECT aliases.
## 6. Renaming or replacing a query
- To **rename** (e.g. `units_shipped_by_series` -> `units_ordered_by_series`):
- Create the new folder and files under the new name (with a new `gitSyncId`).
- Update every reference to the old query (e.g. `tableData`: `{{old_name.data}}` -> `{{new_name.data}}`).
- Remove the old query folder (both `.txt` and `metadata.json`).
- When **replacing** the SQL but keeping the same name, update the `.txt` first, then update the `body` in `metadata.json` to match (same content, JSON-escaped).
## Reference
- **gitSyncId**: `<24-char-hex>_<uuid-v4>`. Without this, Appsmith auto-removes the query on sync.
- **Optional date range**: NULLIF + IS NULL + OR + BETWEEN as above.
- **Table data binding**: `{{<query_name>.data}}`.
- **Column keys**: Must match query SELECT aliases (e.g. `"Product"`, `"Qty Ordered"`).

View File

@@ -0,0 +1,216 @@
---
name: add-tabs-to-page
description: Adds a TABS_WIDGET to a page so multiple data views live under one page instead of separate pages. Use when the user asks to add tabs, consolidate pages into tabs, create tabbed views, or replace a single table with a tabbed layout.
---
# Add Tabs to a Page
Replaces a page's standalone content (e.g. a single `TABLE_WIDGET_V2`) with a `TABS_WIDGET` containing multiple tabs, each with its own widgets and query binding.
## Prerequisites
- **Tab definitions**: User must provide the tab labels and the query each tab should display.
- **Page prefix**: Each page uses a short widget-ID prefix (e.g. `pa1`, `cp1`). Reuse the existing prefix from the page's widgets.
- Follow the **add-query-to-table** skill for creating any new queries needed by the tabs.
## File Layout
The Tabs widget and all widgets **inside** tabs live under a `Tabs1/` directory:
```
pages/<PageName>/widgets/Tabs1/
├── Tabs1.json # The TABS_WIDGET itself
├── <Table1>.json # Table inside tab 1
├── <Table2>.json # Table inside tab 2
├── <DatePicker>.json # Optional: date pickers inside a tab
└── ...
```
If the page previously had a standalone `Table1.json` at `widgets/Table1.json`, **delete it** after creating the tabbed replacement.
## Instructions
### 1. Design the tab structure
Decide on tab count, labels, and content. Example:
| Tab ID | Label | Canvas widgetId | Content |
|--------|-------|-----------------|---------|
| tab1 | All | `{prefix}cnvsall` | TableAll bound to `query_all` |
| tab2 | SLx | `{prefix}cnvsslx` | TableSLx bound to `query_slx` |
### 2. Create `Tabs1.json`
The TABS_WIDGET has three critical sections:
**A) `tabsObj`** — declares each tab with id, label, index, and canvas widgetId:
```json
"tabsObj": {
"tab1": {
"id": "tab1",
"index": 0,
"isVisible": true,
"label": "All",
"positioning": "vertical",
"widgetId": "<canvas-widgetId-for-tab1>"
},
"tab2": { ... }
}
```
**B) `children`** — array of `CANVAS_WIDGET` entries, one per tab. Each canvas must reference:
- `"parentId"`: the Tabs widget's `widgetId`
- `"tabId"`: matching key from `tabsObj` (e.g. `"tab1"`)
- `"tabName"`: the display label
- `"widgetId"`: unique canvas ID (referenced in `tabsObj` and by child widgets)
**C) Top-level Tabs properties:
```json
{
"type": "TABS_WIDGET",
"version": 3,
"isCanvas": true,
"shouldShowTabs": true,
"defaultTab": "<label of default tab>",
"parentId": "0",
"leftColumn": 9,
"rightColumn": 64,
"topRow": 5,
"bottomRow": 67,
"dynamicHeight": "AUTO_HEIGHT",
"dynamicBindingPathList": [
{"key": "accentColor"},
{"key": "boxShadow"}
],
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"backgroundColor": "#FFFFFF",
"borderColor": "#E0DEDE",
"borderRadius": "0.375rem",
"borderWidth": 1
}
```
### 3. Create widgets inside each tab
Each widget inside a tab sets `"parentId"` to that tab's **canvas widgetId** (not the Tabs widgetId). Widgets start at `topRow: 0` within each canvas.
**Table-only tabs** (no date pickers):
```json
{
"type": "TABLE_WIDGET_V2",
"parentId": "<canvas-widgetId>",
"topRow": 0,
"bottomRow": 58,
"leftColumn": 0,
"rightColumn": 62,
"tableData": "{{<query_name>.data}}",
...
}
```
**Tabs with date pickers** (see Sales - Units Shipped for reference):
| Widget | topRow | bottomRow | leftColumn | rightColumn |
|--------|--------|-----------|------------|-------------|
| DateFrom | 0 | 7 | 0 | 5 |
| DateTo | 0 | 7 | 5 | 10 |
| Table | 7 | 58 | 0 | 62 |
Date pickers use `"type": "DATE_PICKER_WIDGET2"`, `"dateFormat": "YYYY-MM-DD HH:mm"`, and `"parentId"` set to the tab's canvas widgetId.
### 4. Create queries for each tab
Follow the **add-query-to-table** skill. Each query's `metadata.json` must have:
- `"pageId"`: the page name (e.g. `"Pending POs"`)
- `"gitSyncId"`: use the same 24-char hex prefix as the page, with a unique UUID suffix
- `"runBehaviour": "AUTOMATIC"`
### 5. Delete the old standalone widget
If the page had a `widgets/Table1.json` (or similar) that the Tabs widget replaces, delete it.
### 6. Verify
- Each canvas `widgetId` in `children` matches the corresponding `widgetId` in `tabsObj`.
- Each widget inside a tab has `parentId` set to its tab's canvas `widgetId`.
- `defaultTab` matches one of the tab labels (not the tab ID).
- All queries reference the correct `pageId`.
- Run `git status` / `git diff` to confirm only intended changes.
## Canvas Widget Template
Each canvas child in the `children` array follows this template:
```json
{
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 620,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canExtend": true,
"detachFromLayout": true,
"dynamicBindingPathList": [
{"key": "borderRadius"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
"flexLayers": [],
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "<unique-key>",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minHeight": 150,
"minWidth": 450,
"mobileBottomRow": 150,
"mobileLeftColumn": 0,
"mobileRightColumn": 602.625,
"mobileTopRow": 0,
"needsErrorInfo": false,
"parentColumnSpace": 1,
"parentId": "<tabs-widgetId>",
"parentRowSpace": 1,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 602.625,
"shouldScrollContents": false,
"tabId": "<tab-id>",
"tabName": "<tab-label>",
"topRow": 0,
"type": "CANVAS_WIDGET",
"version": 1,
"widgetId": "<unique-canvas-widgetId>",
"widgetName": "Canvas<N>"
}
```
## Consolidating Multiple Pages into Tabs
When merging separate pages into one tabbed page:
1. **Choose the surviving page** (or create a new one via **create-new-page** skill).
2. **Move each page's query** into the surviving page's `queries/` directory. Update `pageId` and generate new `gitSyncId` values (same 24-char prefix as the surviving page).
3. **Create the Tabs widget** with one tab per former page, plus any additional tabs (e.g. "All").
4. **Delete the old page directories** entirely.
5. **Remove old navigation buttons** from all remaining pages (delete the button JSON files).
6. **Update `application.json`** to remove entries for deleted pages.
7. **Keep one nav button** pointing to the surviving page.
## Reference
| Item | Value |
|------|-------|
| Widget type | `TABS_WIDGET` version `3` |
| Widget directory | `widgets/Tabs1/` |
| Canvas parent | Tabs `widgetId` |
| Widget-in-tab parent | Canvas `widgetId` for that tab |
| `defaultTab` | Tab **label** (not tab ID) |
| `tabsObj` keys | `tab1`, `tab2`, `tab3`, ... |
| Existing examples | `Sales - Units Shipped`, `Pending POs` |

View File

@@ -0,0 +1,119 @@
---
name: create-new-page
description: Creates a new page by cloning Sales - Capacity Planning, adds a nav button for it on every page, and sets the new page name for the button label and the page Heading. Use when the user asks to add a new page, clone a page, create a page from template, or add a new navigation page.
---
# Create New Page (Clone + Navigation)
Creates a new page from the **Sales - Capacity Planning** template, registers it in the app, adds a navigation button on every page, and uses the **new page name** for both the nav button label and the Heading on the new page.
## Prerequisites
- **New page name**: User must provide the exact display name (e.g. `Sales - Units Planning`, `Pending POs - SLx Pending`). Use it consistently for:
- Page folder name: `pages/<New Page Name>/`
- Page JSON filename: `<New Page Name>.json`
- `unpublishedPage.name` and `unpublishedPage.slug` (slug = lowercase, spaces to hyphens, e.g. `pending-pos-slx-pending`)
- Heading widget `text` on the new page
- Nav button `text` on all pages
- `navigateTo('<New Page Name>', {}, 'SAME_WINDOW')` in the new button's `onClick`
- Follow the **navigation-button-add** skill for button styling and placement.
- If the page belongs to a **new section** (e.g. "Pending POs" section distinct from "Sales"), follow the **navigation-section-add** skill to add the section label on all pages.
## Instructions
### 1. Clone the template page
- **Template**: `pages/Sales - Capacity Planning/`
- **Target**: `pages/<New Page Name>/`
- Copy the entire directory tree (widgets, queries, and the page JSON).
- In the new folder, rename the page file to `<New Page Name>.json` and update inside it:
- `unpublishedPage.name` -> `<New Page Name>`
- `unpublishedPage.slug` -> slug form (e.g. `pending-pos-slx-pending`)
- Replace all widget IDs in the new page's JSON files with new unique IDs (e.g. new UUIDs or unique strings) so the new page does not conflict with the template. Update any `parentId` references to the new IDs.
- In every widget JSON under the new page, replace any reference to the old page name or slug with the new page name or slug (e.g. in queries or onClick that might point to the template page).
### 2. Add gitSyncId (CRITICAL)
Appsmith's git sync uses `gitSyncId` to track entities. **Without this field, Appsmith will auto-remove the page and query on the next pull/sync.**
- **Page JSON** (`<New Page Name>.json`): Add `"gitSyncId"` as the **first field** in the root object.
- **Query metadata** (`queries/<query_name>/metadata.json`): Add `"gitSyncId"` as the **first field** in the root object.
**Format**: `"<24-char-hex>_<uuid-v4>"`
Generate unique IDs:
```bash
python3 -c "import uuid; print(uuid.uuid4().hex[:24] + '_' + str(uuid.uuid4()))"
```
Use the **same 24-char hex prefix** for both the page and its queries (they share a creation context), but a **unique UUID suffix** for each.
**Example** (page JSON):
```json
{
"gitSyncId": "3ac30122d2934ca9bf65e36a_54bc4b88-d468-4faa-bab0-80921aa88795",
"unpublishedPage": { ... }
}
```
**Example** (query metadata):
```json
{
"gitSyncId": "3ac30122d2934ca9bf65e36a_da6910cc-4263-496f-ba35-ffc773eddaae",
"id": "PageName_query_name",
...
}
```
### 3. Set the new page's Heading
- In `pages/<New Page Name>/widgets/Heading.json`, set:
- `"text": "<New Page Name>"`
so the heading always shows the page name (no dynamic binding; `appsmith.page` is undefined in this app).
### 4. Register the new page in the app
- In `application.json`, add to the `pages` array one entry:
- `{"id": "<New Page Name>", "isDefault": false}`
- Do not change `isDefault: true` on the existing default page unless the user asks to make the new page default.
### 5. Add the new nav button on every page
Apply the **navigation-button-add** skill:
- **Pages to update**: **All** existing pages **and** the new page.
- **On each page**, in `widgets/Container1/`, add a new button:
- `text`: short label for the page (e.g. "SLx Pending" for "Pending POs - SLx Pending").
- `onClick`: `{{navigateTo('<New Page Name>', {}, 'SAME_WINDOW');}}`
- `buttonColor`:
- On the **new page only**: `{{appsmith.theme.colors.backgroundColor}}` and add `{"key":"buttonColor"}` to `dynamicBindingPathList`.
- On all **other** pages: `#ffffff`, and do not add `buttonColor` to `dynamicBindingPathList`.
- Place the new button below existing nav items within its section. Each button occupies 4 rows (e.g. topRow 22, bottomRow 26).
- Assign a new unique `widgetId` and `widgetName` for the new button on each page.
- Set `parentId` to the **Canvas widget ID** inside that page's `Container1.json` (the `widgetId` of the `CANVAS_WIDGET` child). This varies per page -- read `Container1.json` to find it.
### 6. Verify
- Run `git status` / `git diff` and confirm only intended files were added or changed.
- Ensure no duplicate `widgetId` values across pages and that the new page's slug and name are used consistently.
- Confirm `gitSyncId` is present in both the page JSON and every query metadata.
## Summary
| Item | Value |
|------|--------|
| Template | Sales - Capacity Planning |
| New page folder | `pages/<New Page Name>/` |
| gitSyncId | `<24-char-hex>_<uuid-v4>` in page JSON + query metadata |
| Heading text | `<New Page Name>` |
| Nav button text | Short label (e.g. "SLx Pending") |
| Nav button onClick | `navigateTo('<New Page Name>', {}, 'SAME_WINDOW')` |
| Highlight (new page) | `buttonColor`: `{{appsmith.theme.colors.backgroundColor}}` |
| Inactive (other pages) | `buttonColor`: `#ffffff` |
## Reference
- Nav button behavior and layout: follow **navigation-button-add** skill.
- New nav sections: follow **navigation-section-add** skill.
- Slug format: lowercase, spaces to hyphens (e.g. `Pending POs - SLx Pending` -> `pending-pos-slx-pending`).
- `gitSyncId` format: `<24-char-hex>_<uuid-v4>`. Without this, Appsmith auto-removes the entity on sync.

View File

@@ -0,0 +1,54 @@
---
name: navigation-button-add
description: Implements a new navigation button with the existing highlight/default colors. Use when the user asks to add buttons to the nav block, mentions page navigation, or instructs to keep the highlight behavior consistent with the latest change.
---
# Navigation Button Addition
## Instructions
1. **Understand the current navigation canvas** by checking `pages/*/widgets/Container1/`. Each page reuses the same container structure. The navigation is organized into **sections**, each with a Text label and one or more buttons:
- **Sales** section: `Text1` (label), `Button1` (Capacity Planning), `Button1Copy` (Units Shipped), `Button1Copy2` (Units Ordered)
- **Pending POs** section: `Text2` (label), `Button2` (SLx Pending)
- Future sections follow the same pattern (`Text3`/`Button3`, etc.)
2. **Follow the established color scheme**:
- The highlighted button (current page) uses `appsmith.theme.colors.backgroundColor`.
- The inactive buttons use `#ffffff`.
3. **When adding a new navigation button**:
- Copy one of the existing `Button*` definitions, adjusting `text`, `onClick`, `widgetId`, `widgetName`, `topRow`, `bottomRow`, and any other placement metadata so it fits below the existing items in its section.
- Set `buttonColor` to `#ffffff` (inactive) unless the button is on its own page; then set its definition to `appsmith.theme.colors.backgroundColor` with `dynamicBindingPathList: [{"key": "buttonColor"}]`.
- Ensure `dynamicBindingPathList` stays empty when `buttonColor` is static white.
- Point `onClick` to `navigateTo('<Page Name>', {}, 'SAME_WINDOW')` and keep `placement`/`responsiveBehavior` matching other nav buttons.
- Set `parentId` to the **Canvas widget ID** inside that page's `Container1.json` (the `widgetId` of the `CANVAS_WIDGET` child). This varies per page -- always read `Container1.json` to find the correct value.
4. **Add the button on ALL pages** (not just pages in the same section). Every page gets the full navigation.
5. **If adding a button to a new section**, follow the **navigation-section-add** skill first to create the section label.
6. **Run git status/diff** to verify only the intended files changed before reporting back.
## Row Layout
Each widget occupies 4 rows. Sections are separated by a 2-row gap:
| Widget | topRow | bottomRow |
|--------|--------|-----------|
| Text1 "Sales" | 0 | 4 |
| Button1 "Capacity Planning" | 4 | 8 |
| Button1Copy "Units Shipped" | 8 | 12 |
| Button1Copy2 "Units Ordered" | 12 | 16 |
| *(2-row gap)* | 16 | 18 |
| Text2 "Pending POs" | 18 | 22 |
| Button2 "SLx Pending" | 22 | 26 |
When adding a new button within a section, increment from the last button's `bottomRow` by 4. When adding a new section after the last one, add 2 rows gap, then 4 for the label, then 4 for each button.
## Examples
- *Adding "Units Ordered" button to Sales section*:
1. Copy `Button1Copy` (Units Shipped) in each page's `Container1`.
2. Set `text` to "Units Ordered", `onClick` to `navigateTo('Sales - Units Ordered', {}, 'SAME_WINDOW');`.
3. Assign `buttonColor` to `#ffffff` for inactive cases and to `appsmith.theme.colors.backgroundColor` inside the `Sales - Units Ordered` page definition for highlight.
4. Set `topRow: 12`, `bottomRow: 16` (next slot after Units Shipped).
- *Adding a second button to Pending POs section*:
1. Create `Button2Copy.json` in each page's `Container1`.
2. Set `topRow: 26`, `bottomRow: 30` (next slot after SLx Pending at 22-26).
3. Follow the same highlight/inactive pattern.

View File

@@ -0,0 +1,124 @@
---
name: navigation-section-add
description: Adds a new navigation section (label + first button) to the sidebar on all pages. Use when the user asks to create a new section like "Pending POs", add a section header to navigation, or group pages under a new category separate from "Sales".
---
# Navigation Section Addition
Adds a new **section** to the left-side navigation container on **all pages**. A section consists of a bold Text label (e.g. "Pending POs") followed by one or more page buttons. This skill covers adding the section label and first button; additional buttons follow the **navigation-button-add** skill.
## Current Sections
| Section | Label widget | Buttons | Row range |
|---------|-------------|---------|-----------|
| Sales | `Text1` | `Button1`, `Button1Copy`, `Button1Copy2` | 0-16 |
| Pending POs | `Text2` | `Button2` | 18-26 |
## Instructions
### 1. Determine row placement
Sections are separated by a **2-row gap**. Find the last widget's `bottomRow` in the current navigation, add 2 for the gap, then place:
- **Section label** (Text widget): 4 rows (e.g. topRow 18, bottomRow 22)
- **First button**: 4 rows immediately after (e.g. topRow 22, bottomRow 26)
### 2. Choose widget names
Follow the naming sequence based on existing sections:
- First section: `Text1`, `Button1` / `Button1Copy` / `Button1Copy2`
- Second section: `Text2`, `Button2` / `Button2Copy` / ...
- Third section: `Text3`, `Button3` / `Button3Copy` / ...
### 3. Create the Text label widget on ALL pages
Add a `Text<N>.json` file in `pages/<each page>/widgets/Container1/` with:
```json
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": <calculated>,
"dynamicBindingPathList": [
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
"fontFamily": "{{appsmith.theme.fontFamily.appFont}}",
"fontSize": "1rem",
"fontStyle": "BOLD",
"isLoading": false,
"isVisible": true,
"key": "<unique-key>",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 450,
"mobileBottomRow": <calculated>,
"mobileLeftColumn": 10,
"mobileRightColumn": 26,
"mobileTopRow": <calculated>,
"needsErrorInfo": false,
"originalBottomRow": <calculated>,
"originalTopRow": <calculated>,
"overflow": "NONE",
"parentColumnSpace": 3.841796875,
"parentId": "<Canvas widgetId from Container1.json>",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 64,
"shouldTruncate": false,
"text": "<Section Name>",
"textAlign": "LEFT",
"textColor": "#231F20",
"topRow": <calculated>,
"truncateButtonColor": "{{appsmith.theme.colors.primaryColor}}",
"type": "TEXT_WIDGET",
"version": 1,
"widgetId": "<unique per page>",
"widgetName": "Text<N>"
}
```
### 4. Create the first button on ALL pages
Follow the **navigation-button-add** skill to add `Button<N>.json`. Key points:
- On the page the button navigates to: `buttonColor` = `{{appsmith.theme.colors.backgroundColor}}` (highlighted), with `dynamicBindingPathList: [{"key": "buttonColor"}]`.
- On all other pages: `buttonColor` = `#ffffff` (inactive), with empty `dynamicBindingPathList`.
- `topRow` = label's `bottomRow`, `bottomRow` = topRow + 4.
### 5. parentId -- CRITICAL
Each page's Container1 has a **different Canvas widget ID**. The `parentId` for all nav widgets must match the `widgetId` of the `CANVAS_WIDGET` child inside that page's `Container1.json`.
**Always read** `pages/<PageName>/widgets/Container1/Container1.json` to find the Canvas `widgetId` before creating widgets. Do NOT copy parentId from another page.
Example Canvas widget IDs (verify these are still current):
- Sales - Capacity Planning: `x3pc17vp6q`
- Sales - Units Shipped: `wj6fxg5wpg`
- Sales - Units Ordered: `wj6fxg5wpg`
### 6. Widget IDs -- must be unique
Every widget across all pages must have a **unique `widgetId`**. Use a short, unique string per widget per page. A practical pattern: `<page-prefix><widget-abbrev>` (e.g. `cp1txtpndpo` for Capacity Planning's "Pending POs" text label).
### 7. Apply to ALL pages
The section label and button must appear on **every page in the app** -- not just pages within the new section. This ensures the full navigation is visible regardless of which page the user is on.
## Example: Adding "Pending POs" section
Files created on each page's `widgets/Container1/`:
- `Text2.json` -- "Pending POs" label, topRow 18, bottomRow 22
- `Button2.json` -- "SLx Pending" button, topRow 22, bottomRow 26
On `Pending POs - SLx Pending` page: Button2 is highlighted.
On all Sales pages: Button2 is white/inactive.
## Reference
- Button styling and highlight pattern: **navigation-button-add** skill.
- Creating the page itself: **create-new-page** skill.
- Row layout: 4 rows per widget, 2-row gap between sections.

View File

@@ -0,0 +1,53 @@
---
name: prepare-for-launch
description: Prepares the app for production launch by moving from sandbox to production (GoLive) database and related steps. Use when the user asks to prepare for launch, move to production, switch to GoLive, or launch the app.
---
# Prepare for Launch
Use this skill when preparing to launch the app: moving all data sources from sandbox to the production (xTuple_GoLive) database and performing launch checklist steps.
## Launch checklist (run in order)
1. **Switch all queries to xTuple_GoLive** (see below).
2. Add or run any other launch steps you need (e.g. env/config, final checks).
---
## Step 1: Move every query to xTuple_GoLive
Ensure every DB query in the app uses the production datasource `xTuple_GoLive` instead of `xTuple_Sandbox`.
### How to do it
1. **Find all query metadata files**
Under `pages/`, each query has a `metadata.json` in `pages/<PageName>/queries/<query_name>/metadata.json`.
2. **In each `metadata.json`**, locate the datasource block inside `unpublishedAction`:
```json
"datasource": {
"id": "xTuple_Sandbox",
"isAutoGenerated": false,
"name": "xTuple_Sandbox",
"pluginId": "postgres-plugin"
}
```
3. **Replace** both `"id"` and `"name"` from `xTuple_Sandbox` to `xTuple_GoLive`:
```json
"datasource": {
"id": "xTuple_GoLive",
"isAutoGenerated": false,
"name": "xTuple_GoLive",
"pluginId": "postgres-plugin"
}
```
4. **Verify**
- No query under `pages/**/queries/**/metadata.json` should reference `xTuple_Sandbox`.
- Search the repo for `xTuple_Sandbox`; the only remaining references should be the datasource definition (e.g. `datasources/xTuple_Sandbox.json`) and any docs/skills that describe sandbox as the default (e.g. add-query skill).
### Scope
- Update **every** query that currently uses `xTuple_Sandbox`. Queries already using `xTuple_GoLive` can be left unchanged.
- Do not change the add-query (or other) skills that say to use Sandbox by default; those are for day-to-day development. This skill is only for the one-time (or repeated) launch prep.

9
.gitignore vendored Normal file
View File

@@ -0,0 +1,9 @@
# Cursor AI reference documentation (internal use only)
.cursor/*
# Claude Code local settings
.claude/settings.local.json
!.cursor/rules/
!.cursor/rules/**
!.cursor/skills/
!.cursor/skills/**

161
AGENTS.md Normal file
View File

@@ -0,0 +1,161 @@
# AGENTS.md — Statistics App (Appsmith)
## Project Overview
Internal statistics dashboard built on **Appsmith** (file-based git sync mode). Displays filtered data from a **PostgreSQL / xTuple ERP** database (`xTuple_GoLive` datasource). The app is a collection of JSON widget definitions, SQL query files, and Appsmith configuration — there is no traditional application code.
**Live URL**: `https://appsmith.mpeapp.com/applications/6947cc068872ae1d129983a0/pages/6947cc068872ae1d129983a3`
## Tech Stack
| Layer | Technology |
|-------|-----------|
| Platform | Appsmith (file format v5, 64-column grid layout) |
| Database | PostgreSQL via xTuple ERP (`mpe` and `public` schemas) |
| Datasource | `xTuple_GoLive` (production) / `xTuple_Sandbox` (development) |
| Version control | Git (Bitbucket), Appsmith git sync |
## Repository Structure
```
statistics-app/
├── AGENTS.md # This file — keep up to date after every change
├── application.json # Page registry, app metadata
├── metadata.json # Appsmith schema versions
├── theme.json # UI theme (colors, fonts, borders)
├── datasources/
│ └── xTuple_GoLive.json # PostgreSQL connection config (credentials managed by Appsmith server, not stored here)
├── pages/ # One directory per page
│ └── <Page Name>/
│ ├── <Page Name>.json # Page definition (gitSyncId required)
│ ├── widgets/ # Widget JSON files
│ │ ├── Heading.json
│ │ ├── Container1/ # Navigation sidebar widgets
│ │ └── Tabs1/ # Tabbed content (if applicable)
│ └── queries/ # SQL queries
│ └── <query_name>/
│ ├── <query_name>.txt # Raw SQL (source of truth)
│ └── metadata.json # Appsmith action config
└── .cursor/skills/ # AI agent workflows (Cursor-specific)
```
## Pages
| Section | Page | Key Data |
|---------|------|----------|
| Sales | Capacity Planning (default) | `mpe.poormancapacity` |
| Sales | Units Shipped | Orders shipped by series / power input, date-filtered |
| Sales | Units Ordered | Orders placed by series / power input, date-filtered |
| Engineering | Pending POs | Purchase orders via `mpe.get_prototype_po_dashboard_data()` |
| Engineering | Pending Revisions | Revisions via `mpe.get_prototype_dashboard_data()` |
| Engineering | xGen | 8 tabs: build info, compatibility, firmware, test measurements |
| Operations | Engineering Holds | Work orders with active engineering holds |
| Operations | Job Drawing Status | CAD drawing builds from `mpe.inventortools` |
| Operations | Unused Items | Items with no inventory transactions for X days (default 365), filterable via input widget |
| Operations | WO Shortages | 2 tabs: WO shortage details (MTS/MTO) for FA dept top-level WOs; Critical Parts aggregation. Uses `mpe.itematmdept`, `mpe.wogrpext`, `womatl`, `qtynetable()` |
| Operations | External Process | 2 tabs: At Vendor (open POs for outside process items, `item_type='O'`, `classcode_code='EXTLAB'`); Awaiting Shipment (manufactured material issued but no PO released). Uses `poitem`, `pohead`, `womatl`, `classcode`, `itemsrc` |
## Critical Conventions
### gitSyncId (REQUIRED)
Every page JSON and query `metadata.json` **must** have a `gitSyncId` as the first field. Format: `"<24-char-hex>_<uuid-v4>"`. Without it, Appsmith silently deletes the entity on next sync.
Generate:
```bash
python3 -c "import uuid; print(uuid.uuid4().hex[:24] + '_' + str(uuid.uuid4()))"
```
### Widget IDs
Every `widgetId` across all pages must be globally unique. Use short descriptive strings with a 2-3 character page prefix (e.g., `ui1btn3jds`, `eh1heading1`).
### Navigation
- Every page has identical nav sidebar (`Container1/`) with buttons for all pages.
- Active page button: `buttonColor` = `{{appsmith.theme.colors.backgroundColor}}` (dynamic binding).
- Inactive buttons: `buttonColor` = `#ffffff` (static, no dynamic binding).
- `parentId` for nav widgets = the Canvas `widgetId` inside that page's `Container1.json` (varies per page — always read it).
- Current nav sections: **Sales** (rows 016), **Engineering** (rows 1834), **Operations** (rows 3660).
### Canvas Widget IDs (for parentId in Container1 children)
| Page | Canvas widgetId |
|------|----------------|
| Sales - Capacity Planning | `x3pc17vp6q` |
| Sales - Units Shipped | `wj6fxg5wpg` |
| Sales - Units Ordered | `wj6fxg5wpg` |
| Pending POs | `pa1canvas01` |
| Pending Revisions | `pr1canvas01` |
| xGen | `xg1canvas01` |
| Operations - Job Drawing Status | `jd1canvas01` |
| Operations - Engineering Holds | `eh1canvas01` |
| Operations - Unused Items | `ui1canvas01` |
| Operations - WO Shortages | `ws1canvas01` |
| Operations - External Process | `ep1canvas01` |
### Grid Layout
- 64 columns wide, 10px per row.
- Nav container: rows 07. Content starts at row 8.
- Nav buttons: 4 rows each, 2-row gap between sections.
### Queries
- SQL source of truth: `<query_name>.txt` (readable, real newlines).
- `metadata.json` `body` field: same SQL but JSON-escaped (`\n`, `\"`).
- Table binding: `{{query_name.data}}`.
- All production queries use `xTuple_GoLive` datasource.
- **Database credentials are managed by Appsmith server-side** — they are not stored in this repository. The datasource JSON only contains the name and plugin reference. When developing/testing SQL queries locally, use separate read-only credentials provided by the user — never embed them in committed files.
### Widget Bindings in SQL (IMPORTANT)
Appsmith uses prepared statements (`pluginSpecifiedTemplates[0].value = true`). When a query body contains `{{Widget.property}}`, Appsmith replaces each binding with a typed prepared statement parameter (`$1`, `$2`, etc.).
**For DATE_PICKER_WIDGET2** (text/date type parameters):
- The `NULLIF` pattern works: `NULLIF('{{DateWidget.selectedDate}}','')::date`
- This is safe because the parameter is always typed as `text`.
**For INPUT_WIDGET_V2 with `inputType: "NUMBER"`** (integer type parameters):
- Do **NOT** use `NULLIF('{{Widget.text}}','')::int` — this fails because Appsmith may type the parameter as `integer`, and `NULLIF(integer, '')` causes a type mismatch error (`invalid input syntax for integer: ""`).
- Instead, use a direct cast: `'{{Widget.text}}'::int`
- The widget's `defaultText` property ensures there is always a value on page load, so NULL/empty handling is unnecessary.
**General rule**: Match the SQL cast to the widget's output type. When in doubt, test with a hardcoded value first to confirm the base query works, then add the binding.
## Common Tasks
### Add a new page
Provide: page name (`<Section> - <Label>`), section, SQL query. The workflow:
1. Clone `Sales - Capacity Planning` as template
2. Generate new `gitSyncId` values for page and queries
3. Update page name, slug, heading, and widget IDs
4. Register in `application.json`
5. Add nav button on **all** pages (highlighted on own page, white elsewhere)
6. If new section needed, add section label (`Text<N>`) on all pages first
7. **Update this AGENTS.md file** (add the page to the Pages table, update Canvas Widget IDs table, and note any new conventions)
See `.cursor/skills/create-new-page/SKILL.md` for full procedure.
### Add tabs to a page
Replace standalone table with `TABS_WIDGET` containing multiple tabs, each with its own query and table. See `.cursor/skills/add-tabs-to-page/SKILL.md`.
### Add a query
Create `queries/<name>/` with `.txt` and `metadata.json`. Wire to table via `tableData: "{{name.data}}"`. See `.cursor/skills/add-query-to-table/SKILL.md`.
### Launch prep (sandbox → production)
Replace all `xTuple_Sandbox` references in query `metadata.json` files with `xTuple_GoLive`. See `.cursor/skills/prepare-for-launch/SKILL.md`.
## Rules
- **After every change to this project, update this AGENTS.md file** to reflect the current state — new pages, changed navigation layout, new conventions, etc. This file is the single source of truth for AI agents working in this repo.
- Do **not** create or modify files in the `docs/` directory.
- Template page for cloning: `Sales - Capacity Planning`.
- Slug format: lowercase, spaces to hyphens (e.g., `operations-unused-items`).
- Product lines tracked: XR, SL, TS, MS, MT, Harmonic Neutralizer (mapped by item number in SQL CASE statements).
- Database credentials are never stored in this repository. Use the Appsmith-managed `xTuple_GoLive` datasource for all queries.

View File

@@ -8,4 +8,90 @@ This app is built using Appsmith. Turn any datasource into an internal app in mi
##### You can visit the application using the below link
###### [![](https://assets.appsmith.com/git-sync/Buttons.svg) ](https://appsmith.mpeapp.com/applications/6947cc068872ae1d129983a0/pages/69b7fdef00dc506d32d9eacf) [![](https://assets.appsmith.com/git-sync/Buttons2.svg)](https://appsmith.mpeapp.com/applications/6947cc068872ae1d129983a0/pages/69b7fdef00dc506d32d9eacf/edit)
###### [![](https://assets.appsmith.com/git-sync/Buttons.svg) ](https://appsmith.mpeapp.com/applications/6947cc068872ae1d129983a0/pages/6947cc068872ae1d129983a3) [![](https://assets.appsmith.com/git-sync/Buttons2.svg)](https://appsmith.mpeapp.com/applications/6947cc068872ae1d129983a0/pages/6947cc068872ae1d129983a3/edit)
---
## Widget Positioning & Spacing
Appsmith uses a **grid-based layout system** for widget positioning.
### Grid Basics
| Property | Description | Default |
|----------|-------------|---------|
| `topRow` | Starting row position (0-based) | - |
| `bottomRow` | Ending row position | - |
| `leftColumn` | Starting column (0-based) | - |
| `rightColumn` | Ending column | - |
| `parentRowSpace` | Pixels per row | 10px |
| `parentColumnSpace` | Pixels per column | ~25px |
The canvas is **64 columns wide**. Each row is **10 pixels tall**.
### Calculating Size
```
Height = (bottomRow - topRow) × 10px
Width = (rightColumn - leftColumn) × 25px
```
### Visual Example
```
Row 0 ┌────────────────────────────────────────┐
│ Navigation (topRow: 0) │
Row 7 └────────────────────────────────────────┘ ← bottomRow: 7
Row 8 ┌────────────────────────────────────────┐ ← topRow: 8 (1 row gap = 10px)
│ Content Widget │
Row 16 └────────────────────────────────────────┘
```
### This Project's Standard
| Widget | topRow | bottomRow | Notes |
|--------|--------|-----------|-------|
| Navigation | 0 | 7 | 70px tall |
| First Content | 8 | 16 | 10px gap below nav |
### Dynamic Height
Widgets with `"dynamicHeight": "AUTO_HEIGHT"` adjust height based on content. The `bottomRow` serves as an initial guide, and `originalTopRow`/`originalBottomRow` store the original placement values.
---
## Adding a New Page
New pages are added via AI agent (Cursor). The agent follows the skills in `.cursor/skills/` to clone the template, create the query, wire the table, add navigation buttons to all pages, and register the page in `application.json`.
### What You Need
1. **Page name** — Full display name in the format `<Section> - <Label>` (e.g. `Pending POs - ALx Pending`).
2. **Section** — Which navigation section the page belongs to (e.g. `Pending POs`, `Sales`). If the section already exists, the button is appended; otherwise a new section is created first.
3. **SQL query** — The exact query the page's table should run.
### Prompt Format
Tell the agent which section, what name, and what query. One sentence is enough:
> Add a new page under the Pending POs section "Pending POs - ALx Pending" with `select * from mpe.get_prototype_po_dashboard_data(array['25502', '27985']::text[])` query
### What the Agent Does
| Step | Detail |
|------|--------|
| Clone template | Copies `Sales - Capacity Planning` page structure (page JSON, widgets, Container1 nav) |
| Create query | Adds `queries/<query_name>/` with `.txt` (raw SQL) and `metadata.json` |
| Wire table | Sets `Table1.tableData` to `{{<query_name>.data}}` |
| Set heading | Updates `Heading.json` text to the page name |
| Generate gitSyncIds | Creates unique `<24-char-hex>_<uuid>` IDs for the page JSON and query metadata (required for Appsmith git sync) |
| Register page | Adds entry to `application.json` `pages` array |
| Add nav button | Creates `Button2Copy<N>.json` on **every** page — highlighted on its own page, white on all others |
### Verifying
After the agent finishes, run `git status` to confirm only the expected files were added/changed:
- `application.json` — one new page entry
- `pages/<New Page>/` — full page directory (page JSON, query, widgets)
- `pages/<Every Other Page>/widgets/Container1/Button2Copy<N>.json` — new nav button on each existing page

View File

@@ -64,6 +64,14 @@
{
"id": "Operations - Unused Items",
"isDefault": false
},
{
"id": "Operations - WO Shortages",
"isDefault": false
},
{
"id": "Operations - External Process",
"isDefault": false
}
],
"unpublishedAppLayout": {

4
docs/README.md Normal file
View File

@@ -0,0 +1,4 @@
# Navigation updates
- Added the **Units Ordered** nav button beneath **Units Shipped** on every Sales canvas so the new sales dashboard route is reachable from Capacity Planning, Units Ordered, and Units Shipped.
- Each page now hardcodes the highlighted button to `appsmith.theme.colors.backgroundColor` (what used to be the default background) and keeps the inactive buttons at `#ffffff`, so the active canvas still renders distinctly without referencing `appsmith.page`.

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "eh1btn1cap",
"widgetName": "Button1"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "eh1btn1shp",
"widgetName": "Button1Copy"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "eh1btn1ord",
"widgetName": "Button1Copy2"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "eh1btn2pos",
"widgetName": "Button2All"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "eh1btn2rev",
"widgetName": "Button2Copy"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "eh1btn2xgn",
"widgetName": "Button2Copy2"
}
}

View File

@@ -3,20 +3,16 @@
"borderRadius": "0.375rem",
"bottomRow": 44,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonColor": "{{appsmith.theme.colors.backgroundColor}}",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicBindingPathList": [{"key": "buttonColor"}],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "eh1btn3k01",
"key": "eh1btn3ehk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 44,
@@ -24,7 +20,7 @@
"mobileRightColumn": 16,
"mobileTopRow": 40,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 44,
"originalTopRow": 40,
"parentColumnSpace": 3.841796875,
@@ -36,10 +32,10 @@
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Job Drawing Status",
"text": "Engineering Holds",
"topRow": 40,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "eh1btn3jds",
"widgetId": "eh1btn3eh",
"widgetName": "Button3"
}
}

View File

@@ -3,24 +3,16 @@
"borderRadius": "0.375rem",
"bottomRow": 48,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.backgroundColor}}",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [
{
"key": "buttonColor"
}
],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "eh1btn3k02",
"key": "eh1btn3epk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 48,
@@ -28,7 +20,7 @@
"mobileRightColumn": 16,
"mobileTopRow": 44,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - External Process', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 48,
"originalTopRow": 44,
"parentColumnSpace": 3.841796875,
@@ -40,10 +32,10 @@
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Engineering Holds",
"text": "External Process",
"topRow": 44,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "eh1btn3enh",
"widgetId": "eh1btn3ep",
"widgetName": "Button3Copy"
}
}

View File

@@ -7,41 +7,35 @@
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "eh1btn3uik",
"key": "eh1btn3jdk",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 120,
"mobileBottomRow": 52,
"mobileLeftColumn": 0,
"mobileRightColumn": 64,
"mobileRightColumn": 16,
"mobileTopRow": 48,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Unused Items', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 52,
"originalTopRow": 48,
"parentColumnSpace": 3.841796875,
"parentId": "eh1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Unused Items",
"text": "Job Drawing Status",
"topRow": 48,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "eh1btn3ui",
"widgetId": "eh1btn3jd",
"widgetName": "Button3Copy2"
}
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 56,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "eh1btn3uik",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 56,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 52,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Unused Items', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 56,
"originalTopRow": 52,
"parentColumnSpace": 3.841796875,
"parentId": "eh1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Unused Items",
"topRow": 52,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "eh1btn3ui",
"widgetName": "Button3Copy3"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 60,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "eh1btn3wsk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 60,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 56,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - WO Shortages', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 60,
"originalTopRow": 56,
"parentColumnSpace": 3.841796875,
"parentId": "eh1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "WO Shortages",
"topRow": 56,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "eh1btn3ws",
"widgetName": "Button3Copy4"
}

View File

@@ -15,12 +15,8 @@
"containerStyle": "none",
"detachFromLayout": true,
"dynamicBindingPathList": [
{
"key": "borderRadius"
},
{
"key": "boxShadow"
}
{"key": "borderRadius"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"flexLayers": [],
@@ -52,9 +48,7 @@
],
"containerStyle": "card",
"dynamicBindingPathList": [
{
"key": "boxShadow"
}
{"key": "boxShadow"}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 4,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
@@ -49,4 +43,4 @@
"version": 1,
"widgetId": "eh1txt1sal",
"widgetName": "Text1"
}
}

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 22,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
@@ -49,4 +43,4 @@
"version": 1,
"widgetId": "eh1txt2eng",
"widgetName": "Text2"
}
}

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 40,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
@@ -49,4 +43,4 @@
"version": 1,
"widgetId": "eh1txt3ops",
"widgetName": "Text3"
}
}

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 5,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],

View File

@@ -0,0 +1,33 @@
{
"gitSyncId": "b6753fb967724f1193901e18_0a96aa7f-ae6d-4915-956e-d1880b2dfb95",
"unpublishedPage": {
"isHidden": false,
"layouts": [
{
"dsl": {
"backgroundColor": "none",
"bottomRow": 1240,
"canExtend": true,
"containerStyle": "none",
"detachFromLayout": true,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [],
"leftColumn": 0,
"minHeight": 1292,
"parentColumnSpace": 1,
"parentRowSpace": 1,
"rightColumn": 4896,
"snapColumns": 64,
"snapRows": 124,
"topRow": 0,
"type": "CANVAS_WIDGET",
"version": 94,
"widgetId": "0",
"widgetName": "MainContainer"
}
}
],
"name": "Operations - External Process",
"slug": "operations-external-process"
}
}

View File

@@ -0,0 +1,53 @@
-- Items currently at an external vendor (PO open, not fully received)
-- Outside process items identified by item_type='O' and classcode_code='EXTLAB'
SELECT
v.vend_name AS vendor,
ph.pohead_number AS po_number,
fi.item_number AS finished_pn,
fi.item_descrip1 AS finished_desc,
COALESCE(mi.item_number, '') AS manufactured_pn,
opi.item_number AS ext_labor_pn,
pi.poitem_qty_ordered AS qty_ordered,
pi.poitem_qty_received AS qty_received,
to_char(ph.pohead_orderdate, 'YYYY-MM-DD') AS date_shipped,
to_char(ph.pohead_orderdate + interval '7 days', 'YYYY-MM-DD') AS expected_return,
(CURRENT_DATE - ph.pohead_orderdate::date) AS days_out,
COALESCE((
SELECT SUM(w2.wo_qtyord - w2.wo_qtyrcv)
FROM wo w2
JOIN itemsite is2 ON w2.wo_itemsite_id = is2.itemsite_id
WHERE is2.itemsite_item_id = fi.item_id
AND w2.wo_status IN ('R','E','I')
), 0) AS wo_demand
FROM poitem pi
JOIN pohead ph ON pi.poitem_pohead_id = ph.pohead_id
JOIN vendinfo v ON ph.pohead_vend_id = v.vend_id
JOIN itemsite opis ON pi.poitem_itemsite_id = opis.itemsite_id
JOIN item opi ON opis.itemsite_item_id = opi.item_id
JOIN classcode cc ON opi.item_classcode_id = cc.classcode_id
-- Link PO outside process item back to the WO that needs it
JOIN womatl wm ON wm.womatl_itemsite_id = opis.itemsite_id
JOIN wo parent_wo ON wm.womatl_wo_id = parent_wo.wo_id
AND parent_wo.wo_status IN ('R','E','I')
JOIN itemsite fis ON parent_wo.wo_itemsite_id = fis.itemsite_id
JOIN item fi ON fis.itemsite_item_id = fi.item_id
-- Find the manufactured part (non-outside-process material on same WO)
LEFT JOIN LATERAL (
SELECT mi2.item_number
FROM womatl wm2
JOIN itemsite mis2 ON wm2.womatl_itemsite_id = mis2.itemsite_id
JOIN item mi2 ON mis2.itemsite_item_id = mi2.item_id
JOIN classcode cc2 ON mi2.item_classcode_id = cc2.classcode_id
WHERE wm2.womatl_wo_id = parent_wo.wo_id
AND wm2.womatl_id != wm.womatl_id
AND cc2.classcode_code != 'EXTLAB'
AND mi2.item_type != 'O'
ORDER BY mi2.item_number
LIMIT 1
) mi ON true
WHERE cc.classcode_code = 'EXTLAB'
AND opi.item_type = 'O'
AND ph.pohead_status = 'O'
AND pi.poitem_status = 'O'
AND pi.poitem_qty_received < pi.poitem_qty_ordered
ORDER BY days_out DESC, vendor, finished_pn;

View File

@@ -0,0 +1,29 @@
{
"gitSyncId": "8f96c44ddc5247178794ffac_2883aec1-7d30-4336-8621-14ed7f85caf8",
"id": "Operations - External Process_at_vendor",
"pluginId": "postgres-plugin",
"pluginType": "DB",
"unpublishedAction": {
"actionConfiguration": {
"body": "-- Items currently at an external vendor (PO open, not fully received)\n-- Outside process items identified by item_type='O' and classcode_code='EXTLAB'\nSELECT\n v.vend_name AS vendor,\n ph.pohead_number AS po_number,\n fi.item_number AS finished_pn,\n fi.item_descrip1 AS finished_desc,\n COALESCE(mi.item_number, '') AS manufactured_pn,\n opi.item_number AS ext_labor_pn,\n pi.poitem_qty_ordered AS qty_ordered,\n pi.poitem_qty_received AS qty_received,\n to_char(ph.pohead_orderdate, 'YYYY-MM-DD') AS date_shipped,\n to_char(ph.pohead_orderdate + interval '7 days', 'YYYY-MM-DD') AS expected_return,\n (CURRENT_DATE - ph.pohead_orderdate::date) AS days_out,\n COALESCE((\n SELECT SUM(w2.wo_qtyord - w2.wo_qtyrcv)\n FROM wo w2\n JOIN itemsite is2 ON w2.wo_itemsite_id = is2.itemsite_id\n WHERE is2.itemsite_item_id = fi.item_id\n AND w2.wo_status IN ('R','E','I')\n ), 0) AS wo_demand\nFROM poitem pi\nJOIN pohead ph ON pi.poitem_pohead_id = ph.pohead_id\nJOIN vendinfo v ON ph.pohead_vend_id = v.vend_id\nJOIN itemsite opis ON pi.poitem_itemsite_id = opis.itemsite_id\nJOIN item opi ON opis.itemsite_item_id = opi.item_id\nJOIN classcode cc ON opi.item_classcode_id = cc.classcode_id\n-- Link PO outside process item back to the WO that needs it\nJOIN womatl wm ON wm.womatl_itemsite_id = opis.itemsite_id\nJOIN wo parent_wo ON wm.womatl_wo_id = parent_wo.wo_id\n AND parent_wo.wo_status IN ('R','E','I')\nJOIN itemsite fis ON parent_wo.wo_itemsite_id = fis.itemsite_id\nJOIN item fi ON fis.itemsite_item_id = fi.item_id\n-- Find the manufactured part (non-outside-process material on same WO)\nLEFT JOIN LATERAL (\n SELECT mi2.item_number\n FROM womatl wm2\n JOIN itemsite mis2 ON wm2.womatl_itemsite_id = mis2.itemsite_id\n JOIN item mi2 ON mis2.itemsite_item_id = mi2.item_id\n JOIN classcode cc2 ON mi2.item_classcode_id = cc2.classcode_id\n WHERE wm2.womatl_wo_id = parent_wo.wo_id\n AND wm2.womatl_id != wm.womatl_id\n AND cc2.classcode_code != 'EXTLAB'\n AND mi2.item_type != 'O'\n ORDER BY mi2.item_number\n LIMIT 1\n) mi ON true\nWHERE cc.classcode_code = 'EXTLAB'\n AND opi.item_type = 'O'\n AND ph.pohead_status = 'O'\n AND pi.poitem_status = 'O'\n AND pi.poitem_qty_received < pi.poitem_qty_ordered\nORDER BY days_out DESC, vendor, finished_pn;\n",
"encodeParamsToggle": true,
"paginationType": "NONE",
"pluginSpecifiedTemplates": [
{"value": true}
],
"timeoutInMillisecond": 30000
},
"confirmBeforeExecute": false,
"datasource": {
"id": "xTuple_GoLive",
"isAutoGenerated": false,
"name": "xTuple_GoLive",
"pluginId": "postgres-plugin"
},
"dynamicBindingPathList": [],
"name": "at_vendor",
"pageId": "Operations - External Process",
"runBehaviour": "AUTOMATIC",
"userSetOnLoad": false
}
}

View File

@@ -0,0 +1,54 @@
-- Manufactured parts awaiting shipment to external vendor
-- The manufactured part has been produced (womatl issued) but the
-- outside process (EXTLAB) has not been completed yet and no open PO exists.
SELECT
mi.item_number AS manufactured_pn,
mi.item_descrip1 AS manufactured_desc,
fi.item_number AS finished_pn,
opi.item_number AS ext_labor_pn,
wm_mfg.womatl_qtyiss AS qty_ready,
formatwonumber(parent_wo.wo_id) AS wo_number,
COALESCE(dv.vend_name, '') AS expected_vendor,
COALESCE((
SELECT SUM(w2.wo_qtyord - w2.wo_qtyrcv)
FROM wo w2
JOIN itemsite is2 ON w2.wo_itemsite_id = is2.itemsite_id
WHERE is2.itemsite_item_id = fi.item_id
AND w2.wo_status IN ('R','E','I')
), 0) AS wo_demand
FROM wo parent_wo
JOIN itemsite fis ON parent_wo.wo_itemsite_id = fis.itemsite_id
JOIN item fi ON fis.itemsite_item_id = fi.item_id
-- Find the outside process material on this WO
JOIN womatl wm_op ON parent_wo.wo_id = wm_op.womatl_wo_id
JOIN itemsite opis ON wm_op.womatl_itemsite_id = opis.itemsite_id
JOIN item opi ON opis.itemsite_item_id = opi.item_id
JOIN classcode cc ON opi.item_classcode_id = cc.classcode_id
-- Find the manufactured part material on this WO
JOIN womatl wm_mfg ON parent_wo.wo_id = wm_mfg.womatl_wo_id
AND wm_mfg.womatl_id != wm_op.womatl_id
JOIN itemsite mis ON wm_mfg.womatl_itemsite_id = mis.itemsite_id
JOIN item mi ON mis.itemsite_item_id = mi.item_id
JOIN classcode cc_mfg ON mi.item_classcode_id = cc_mfg.classcode_id
-- Default vendor for the outside process item
LEFT JOIN itemsrc isrc ON isrc.itemsrc_item_id = opi.item_id AND isrc.itemsrc_active
LEFT JOIN vendinfo dv ON isrc.itemsrc_vend_id = dv.vend_id
WHERE cc.classcode_code = 'EXTLAB'
AND opi.item_type = 'O'
AND cc_mfg.classcode_code != 'EXTLAB'
AND mi.item_type != 'O'
AND parent_wo.wo_status IN ('R','E','I')
-- Manufactured material has been issued (machining complete)
AND wm_mfg.womatl_qtyiss > 0
-- Outside process NOT yet completed (material not fully issued/received)
AND wm_op.womatl_qtyiss < wm_op.womatl_qtyreq
-- No open PO exists for the outside process item
AND NOT EXISTS (
SELECT 1 FROM poitem pi2
JOIN pohead ph2 ON pi2.poitem_pohead_id = ph2.pohead_id
WHERE pi2.poitem_itemsite_id = opis.itemsite_id
AND ph2.pohead_status = 'O'
AND pi2.poitem_status = 'O'
AND pi2.poitem_qty_received < pi2.poitem_qty_ordered
)
ORDER BY manufactured_pn, fi.item_number;

View File

@@ -0,0 +1,29 @@
{
"gitSyncId": "92766f0f754242df9f949173_a94ef679-7680-4d06-bcfa-21cdbdf67af6",
"id": "Operations - External Process_awaiting_shipment",
"pluginId": "postgres-plugin",
"pluginType": "DB",
"unpublishedAction": {
"actionConfiguration": {
"body": "-- Manufactured parts awaiting shipment to external vendor\n-- The manufactured part has been produced (womatl issued) but the\n-- outside process (EXTLAB) has not been completed yet and no open PO exists.\nSELECT\n mi.item_number AS manufactured_pn,\n mi.item_descrip1 AS manufactured_desc,\n fi.item_number AS finished_pn,\n opi.item_number AS ext_labor_pn,\n wm_mfg.womatl_qtyiss AS qty_ready,\n formatwonumber(parent_wo.wo_id) AS wo_number,\n COALESCE(dv.vend_name, '') AS expected_vendor,\n COALESCE((\n SELECT SUM(w2.wo_qtyord - w2.wo_qtyrcv)\n FROM wo w2\n JOIN itemsite is2 ON w2.wo_itemsite_id = is2.itemsite_id\n WHERE is2.itemsite_item_id = fi.item_id\n AND w2.wo_status IN ('R','E','I')\n ), 0) AS wo_demand\nFROM wo parent_wo\nJOIN itemsite fis ON parent_wo.wo_itemsite_id = fis.itemsite_id\nJOIN item fi ON fis.itemsite_item_id = fi.item_id\n-- Find the outside process material on this WO\nJOIN womatl wm_op ON parent_wo.wo_id = wm_op.womatl_wo_id\nJOIN itemsite opis ON wm_op.womatl_itemsite_id = opis.itemsite_id\nJOIN item opi ON opis.itemsite_item_id = opi.item_id\nJOIN classcode cc ON opi.item_classcode_id = cc.classcode_id\n-- Find the manufactured part material on this WO\nJOIN womatl wm_mfg ON parent_wo.wo_id = wm_mfg.womatl_wo_id\n AND wm_mfg.womatl_id != wm_op.womatl_id\nJOIN itemsite mis ON wm_mfg.womatl_itemsite_id = mis.itemsite_id\nJOIN item mi ON mis.itemsite_item_id = mi.item_id\nJOIN classcode cc_mfg ON mi.item_classcode_id = cc_mfg.classcode_id\n-- Default vendor for the outside process item\nLEFT JOIN itemsrc isrc ON isrc.itemsrc_item_id = opi.item_id AND isrc.itemsrc_active\nLEFT JOIN vendinfo dv ON isrc.itemsrc_vend_id = dv.vend_id\nWHERE cc.classcode_code = 'EXTLAB'\n AND opi.item_type = 'O'\n AND cc_mfg.classcode_code != 'EXTLAB'\n AND mi.item_type != 'O'\n AND parent_wo.wo_status IN ('R','E','I')\n -- Manufactured material has been issued (machining complete)\n AND wm_mfg.womatl_qtyiss > 0\n -- Outside process NOT yet completed (material not fully issued/received)\n AND wm_op.womatl_qtyiss < wm_op.womatl_qtyreq\n -- No open PO exists for the outside process item\n AND NOT EXISTS (\n SELECT 1 FROM poitem pi2\n JOIN pohead ph2 ON pi2.poitem_pohead_id = ph2.pohead_id\n WHERE pi2.poitem_itemsite_id = opis.itemsite_id\n AND ph2.pohead_status = 'O'\n AND pi2.poitem_status = 'O'\n AND pi2.poitem_qty_received < pi2.poitem_qty_ordered\n )\nORDER BY manufactured_pn, fi.item_number;\n",
"encodeParamsToggle": true,
"paginationType": "NONE",
"pluginSpecifiedTemplates": [
{"value": true}
],
"timeoutInMillisecond": 30000
},
"confirmBeforeExecute": false,
"datasource": {
"id": "xTuple_GoLive",
"isAutoGenerated": false,
"name": "xTuple_GoLive",
"pluginId": "postgres-plugin"
},
"dynamicBindingPathList": [],
"name": "awaiting_shipment",
"pageId": "Operations - External Process",
"runBehaviour": "AUTOMATIC",
"userSetOnLoad": false
}
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 8,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn1cpk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 8,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 4,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Sales - Capacity Planning', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 8,
"originalTopRow": 4,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Capacity Planning",
"topRow": 4,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn1cp",
"widgetName": "Button1"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 12,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn1usk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 12,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 8,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Sales - Units Shipped', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 12,
"originalTopRow": 8,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Units Shipped",
"topRow": 8,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn1us",
"widgetName": "Button1Copy"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 16,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn1uok",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 16,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 12,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Sales - Units Ordered', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 16,
"originalTopRow": 12,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Units Ordered",
"topRow": 12,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn1uo",
"widgetName": "Button1Copy2"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 26,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn2pok",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 26,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 22,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Pending POs', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 26,
"originalTopRow": 22,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Pending POs",
"topRow": 22,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn2po",
"widgetName": "Button2All"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 30,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn2prk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 30,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 26,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Pending Revisions', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 30,
"originalTopRow": 26,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Pending Revisions",
"topRow": 26,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn2pr",
"widgetName": "Button2Copy"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 34,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn2xgk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 34,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 30,
"needsErrorInfo": false,
"onClick": "{{navigateTo('xGen', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 34,
"originalTopRow": 30,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "xGen",
"topRow": 30,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn2xg",
"widgetName": "Button2Copy2"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 44,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn3ehk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 44,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 40,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 44,
"originalTopRow": 40,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Engineering Holds",
"topRow": 40,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn3eh",
"widgetName": "Button3"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 48,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.backgroundColor}}",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [{"key": "buttonColor"}],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn3epk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 48,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 44,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - External Process', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 48,
"originalTopRow": 44,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "External Process",
"topRow": 44,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn3ep",
"widgetName": "Button3Copy"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 52,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn3jdk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 52,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 48,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 52,
"originalTopRow": 48,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Job Drawing Status",
"topRow": 48,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn3jd",
"widgetName": "Button3Copy2"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 56,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn3uik",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 56,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 52,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Unused Items', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 56,
"originalTopRow": 52,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Unused Items",
"topRow": 52,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn3ui",
"widgetName": "Button3Copy3"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 60,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1btn3wsk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 60,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 56,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - WO Shortages', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 60,
"originalTopRow": 56,
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "WO Shortages",
"topRow": 56,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ep1btn3ws",
"widgetName": "Button3Copy4"
}

View File

@@ -0,0 +1,81 @@
{
"animateLoading": true,
"backgroundColor": "#FFFFFF",
"borderColor": "#E0DEDE",
"borderRadius": "0px",
"borderWidth": "1",
"bottomRow": 124,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"children": [
{
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 1240,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canExtend": false,
"containerStyle": "none",
"detachFromLayout": true,
"dynamicBindingPathList": [
{"key": "borderRadius"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"flexLayers": [],
"isLoading": false,
"isVisible": true,
"key": "ep1cnvskey",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minHeight": 100,
"minWidth": 450,
"mobileBottomRow": 100,
"mobileLeftColumn": 0,
"mobileRightColumn": 132.9375,
"mobileTopRow": 0,
"needsErrorInfo": false,
"parentColumnSpace": 1,
"parentId": "ep1contain",
"parentRowSpace": 1,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 132.9375,
"topRow": 0,
"type": "CANVAS_WIDGET",
"version": 1,
"widgetId": "ep1canvas01",
"widgetName": "Canvas1"
}
],
"containerStyle": "card",
"dynamicBindingPathList": [
{"key": "boxShadow"}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],
"flexVerticalAlignment": "stretch",
"isCanvas": true,
"isLoading": false,
"isVisible": true,
"key": "ep1cntkey1",
"leftColumn": 0,
"maxDynamicHeight": 12,
"minDynamicHeight": 10,
"minWidth": 450,
"mobileBottomRow": 10,
"mobileLeftColumn": 0,
"mobileRightColumn": 3,
"mobileTopRow": 0,
"needsErrorInfo": false,
"parentColumnSpace": 44.3125,
"parentId": "0",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 9,
"shouldScrollContents": true,
"topRow": 0,
"type": "CONTAINER_WIDGET",
"version": 1,
"widgetId": "ep1contain",
"widgetName": "Container1"
}

View File

@@ -0,0 +1,46 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 4,
"dynamicBindingPathList": [
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],
"fontFamily": "{{appsmith.theme.fontFamily.appFont}}",
"fontSize": "0.875rem",
"fontStyle": "BOLD",
"isLoading": false,
"isVisible": true,
"key": "ep1txt1key",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 120,
"mobileBottomRow": 4,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 0,
"needsErrorInfo": false,
"originalBottomRow": 4,
"originalTopRow": 0,
"overflow": "NONE",
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "hug",
"rightColumn": 64,
"shouldTruncate": false,
"text": "Sales",
"textAlign": "LEFT",
"textColor": "#999999",
"topRow": 0,
"truncateButtonColor": "{{appsmith.theme.colors.primaryColor}}",
"type": "TEXT_WIDGET",
"version": 1,
"widgetId": "ep1text1",
"widgetName": "Text1"
}

View File

@@ -0,0 +1,46 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 22,
"dynamicBindingPathList": [
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],
"fontFamily": "{{appsmith.theme.fontFamily.appFont}}",
"fontSize": "0.875rem",
"fontStyle": "BOLD",
"isLoading": false,
"isVisible": true,
"key": "ep1txt2key",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 120,
"mobileBottomRow": 22,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 18,
"needsErrorInfo": false,
"originalBottomRow": 22,
"originalTopRow": 18,
"overflow": "NONE",
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "hug",
"rightColumn": 64,
"shouldTruncate": false,
"text": "Engineering",
"textAlign": "LEFT",
"textColor": "#999999",
"topRow": 18,
"truncateButtonColor": "{{appsmith.theme.colors.primaryColor}}",
"type": "TEXT_WIDGET",
"version": 1,
"widgetId": "ep1text2",
"widgetName": "Text2"
}

View File

@@ -0,0 +1,46 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 40,
"dynamicBindingPathList": [
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],
"fontFamily": "{{appsmith.theme.fontFamily.appFont}}",
"fontSize": "0.875rem",
"fontStyle": "BOLD",
"isLoading": false,
"isVisible": true,
"key": "ep1txt3key",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 120,
"mobileBottomRow": 40,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 36,
"needsErrorInfo": false,
"originalBottomRow": 40,
"originalTopRow": 36,
"overflow": "NONE",
"parentColumnSpace": 3.841796875,
"parentId": "ep1canvas01",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "hug",
"rightColumn": 64,
"shouldTruncate": false,
"text": "Operations",
"textAlign": "LEFT",
"textColor": "#999999",
"topRow": 36,
"truncateButtonColor": "{{appsmith.theme.colors.primaryColor}}",
"type": "TEXT_WIDGET",
"version": 1,
"widgetId": "ep1text3",
"widgetName": "Text3"
}

View File

@@ -0,0 +1,46 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 5,
"dynamicBindingPathList": [
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
"fontFamily": "{{appsmith.theme.fontFamily.appFont}}",
"fontSize": "1.875rem",
"fontStyle": "BOLD",
"isLoading": false,
"isVisible": true,
"key": "ep1headkey",
"leftColumn": 9,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 450,
"mobileBottomRow": 5,
"mobileLeftColumn": 1,
"mobileRightColumn": 17,
"mobileTopRow": 1,
"needsErrorInfo": false,
"originalBottomRow": 5,
"originalTopRow": 0,
"overflow": "NONE",
"parentColumnSpace": 25.109375,
"parentId": "0",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 64,
"shouldTruncate": false,
"text": "Operations - External Process",
"textAlign": "LEFT",
"textColor": "#231F20",
"topRow": 0,
"truncateButtonColor": "{{appsmith.theme.colors.primaryColor}}",
"type": "TEXT_WIDGET",
"version": 1,
"widgetId": "ep1heading",
"widgetName": "Heading"
}

View File

@@ -0,0 +1,150 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"backgroundColor": "#FFFFFF",
"borderColor": "#E0DEDE",
"borderRadius": "0.375rem",
"borderWidth": 1,
"bottomRow": 122,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"children": [
{
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 1130,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canExtend": true,
"detachFromLayout": true,
"dynamicBindingPathList": [
{"key": "borderRadius"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
"flexLayers": [],
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1cnvt1ky",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minHeight": 150,
"minWidth": 450,
"mobileBottomRow": 150,
"mobileLeftColumn": 0,
"mobileRightColumn": 602.625,
"mobileTopRow": 0,
"needsErrorInfo": false,
"parentColumnSpace": 1,
"parentId": "ep1tabs001",
"parentRowSpace": 1,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 602.625,
"shouldScrollContents": false,
"tabId": "tab1",
"tabName": "At Vendor",
"topRow": 0,
"type": "CANVAS_WIDGET",
"version": 1,
"widgetId": "ep1cnvstab1",
"widgetName": "Canvas2"
},
{
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 1130,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canExtend": true,
"detachFromLayout": true,
"dynamicBindingPathList": [
{"key": "borderRadius"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
"flexLayers": [],
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ep1cnvt2ky",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minHeight": 150,
"minWidth": 450,
"mobileBottomRow": 150,
"mobileLeftColumn": 0,
"mobileRightColumn": 602.625,
"mobileTopRow": 0,
"needsErrorInfo": false,
"parentColumnSpace": 1,
"parentId": "ep1tabs001",
"parentRowSpace": 1,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 602.625,
"shouldScrollContents": false,
"tabId": "tab2",
"tabName": "Awaiting Shipment",
"topRow": 0,
"type": "CANVAS_WIDGET",
"version": 1,
"widgetId": "ep1cnvstab2",
"widgetName": "Canvas3"
}
],
"defaultTab": "At Vendor",
"dynamicBindingPathList": [
{"key": "accentColor"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
"flexVerticalAlignment": "stretch",
"isCanvas": true,
"isLoading": false,
"isVisible": true,
"key": "ep1tabskey",
"leftColumn": 9,
"maxDynamicHeight": 9000,
"minDynamicHeight": 15,
"minWidth": 450,
"mobileBottomRow": 76,
"mobileLeftColumn": 2,
"mobileRightColumn": 26,
"mobileTopRow": 61,
"needsErrorInfo": false,
"originalBottomRow": 122,
"originalTopRow": 5,
"parentColumnSpace": 25.109375,
"parentId": "0",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 64,
"shouldScrollContents": true,
"shouldShowTabs": true,
"tabsObj": {
"tab1": {
"id": "tab1",
"index": 0,
"isVisible": true,
"label": "At Vendor",
"positioning": "vertical",
"widgetId": "ep1cnvstab1"
},
"tab2": {
"id": "tab2",
"index": 1,
"isVisible": true,
"label": "Awaiting Shipment",
"positioning": "vertical",
"widgetId": "ep1cnvstab2"
}
},
"topRow": 5,
"type": "TABS_WIDGET",
"version": 3,
"widgetId": "ep1tabs001",
"widgetName": "Tabs1"
}

View File

@@ -0,0 +1,420 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderColor": "#E0DEDE",
"borderRadius": "0.375rem",
"borderWidth": "1",
"bottomRow": 113,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canFreezeColumn": true,
"childStylesheet": {
"button": {
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}"
},
"editActions": {
"discardBorderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"discardButtonColor": "{{appsmith.theme.colors.primaryColor}}",
"saveBorderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"saveButtonColor": "{{appsmith.theme.colors.primaryColor}}"
},
"iconButton": {
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}"
},
"menuButton": {
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none",
"menuColor": "{{appsmith.theme.colors.primaryColor}}"
}
},
"columnOrder": [
"vendor",
"po_number",
"finished_pn",
"finished_desc",
"manufactured_pn",
"ext_labor_pn",
"qty_ordered",
"qty_received",
"date_shipped",
"expected_return",
"days_out",
"wo_demand"
],
"columnWidthMap": {
"vendor": 150,
"po_number": 80,
"finished_pn": 100,
"finished_desc": 200,
"manufactured_pn": 100,
"ext_labor_pn": 100,
"qty_ordered": 80,
"qty_received": 80,
"date_shipped": 100,
"expected_return": 100,
"days_out": 70,
"wo_demand": 80
},
"compactMode": "SHORT",
"defaultPageSize": 0,
"defaultSelectedRowIndex": 0,
"defaultSelectedRowIndices": [0],
"delimiter": ",",
"dynamicBindingPathList": [
{"key": "accentColor"},
{"key": "boxShadow"},
{"key": "tableData"},
{"key": "primaryColumns.vendor.computedValue"},
{"key": "primaryColumns.po_number.computedValue"},
{"key": "primaryColumns.finished_pn.computedValue"},
{"key": "primaryColumns.finished_desc.computedValue"},
{"key": "primaryColumns.manufactured_pn.computedValue"},
{"key": "primaryColumns.ext_labor_pn.computedValue"},
{"key": "primaryColumns.qty_ordered.computedValue"},
{"key": "primaryColumns.qty_received.computedValue"},
{"key": "primaryColumns.date_shipped.computedValue"},
{"key": "primaryColumns.expected_return.computedValue"},
{"key": "primaryColumns.days_out.computedValue"},
{"key": "primaryColumns.wo_demand.computedValue"}
],
"dynamicPropertyPathList": [
{"key": "textSize"}
],
"dynamicTriggerPathList": [],
"enableClientSideSearch": true,
"horizontalAlignment": "LEFT",
"inlineEditingSaveOption": "ROW_LEVEL",
"isLoading": false,
"isSortable": true,
"isVisible": true,
"isVisibleDownload": true,
"isVisibleFilters": true,
"isVisiblePagination": true,
"isVisibleSearch": true,
"key": "ep1tblaven",
"label": "Data",
"leftColumn": 0,
"minWidth": 450,
"needsErrorInfo": false,
"parentColumnSpace": 11.265625,
"parentId": "ep1cnvstab1",
"parentRowSpace": 10,
"primaryColumns": {
"vendor": {
"alias": "vendor",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"vendor\"])) : vendor })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "vendor",
"index": 0,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "vendor",
"originalId": "vendor",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"po_number": {
"alias": "po_number",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"po_number\"])) : po_number })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "po_number",
"index": 1,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "po_number",
"originalId": "po_number",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"finished_pn": {
"alias": "finished_pn",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"finished_pn\"])) : finished_pn })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "finished_pn",
"index": 2,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "finished_pn",
"originalId": "finished_pn",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"finished_desc": {
"alias": "finished_desc",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"finished_desc\"])) : finished_desc })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "finished_desc",
"index": 3,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "finished_desc",
"originalId": "finished_desc",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"manufactured_pn": {
"alias": "manufactured_pn",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"manufactured_pn\"])) : manufactured_pn })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "manufactured_pn",
"index": 4,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "manufactured_pn",
"originalId": "manufactured_pn",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"ext_labor_pn": {
"alias": "ext_labor_pn",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"ext_labor_pn\"])) : ext_labor_pn })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "ext_labor_pn",
"index": 5,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "ext_labor_pn",
"originalId": "ext_labor_pn",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"qty_ordered": {
"alias": "qty_ordered",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "number",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"qty_ordered\"])) : qty_ordered })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "qty_ordered",
"index": 6,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "qty_ordered",
"originalId": "qty_ordered",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"qty_received": {
"alias": "qty_received",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "number",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"qty_received\"])) : qty_received })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "qty_received",
"index": 7,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "qty_received",
"originalId": "qty_received",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"date_shipped": {
"alias": "date_shipped",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"date_shipped\"])) : date_shipped })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "date_shipped",
"index": 8,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "date_shipped",
"originalId": "date_shipped",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"expected_return": {
"alias": "expected_return",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"expected_return\"])) : expected_return })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "expected_return",
"index": 9,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "expected_return",
"originalId": "expected_return",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"days_out": {
"alias": "days_out",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "number",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"days_out\"])) : days_out })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "days_out",
"index": 10,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "days_out",
"originalId": "days_out",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"wo_demand": {
"alias": "wo_demand",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "number",
"computedValue": "{{(() => { const tableData = ep1tblatven.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"wo_demand\"])) : wo_demand })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "wo_demand",
"index": 11,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "wo_demand",
"originalId": "wo_demand",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
}
},
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 62,
"searchKey": "",
"tableData": "{{at_vendor.data}}",
"textSize": "0.775rem",
"topRow": 0,
"totalRecordsCount": 0,
"type": "TABLE_WIDGET_V2",
"version": 2,
"verticalAlignment": "CENTER",
"widgetId": "ep1tblatven",
"widgetName": "ep1tblatven"
}

View File

@@ -0,0 +1,308 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderColor": "#E0DEDE",
"borderRadius": "0.375rem",
"borderWidth": "1",
"bottomRow": 113,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canFreezeColumn": true,
"childStylesheet": {
"button": {
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}"
},
"editActions": {
"discardBorderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"discardButtonColor": "{{appsmith.theme.colors.primaryColor}}",
"saveBorderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"saveButtonColor": "{{appsmith.theme.colors.primaryColor}}"
},
"iconButton": {
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}"
},
"menuButton": {
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none",
"menuColor": "{{appsmith.theme.colors.primaryColor}}"
}
},
"columnOrder": [
"manufactured_pn",
"manufactured_desc",
"finished_pn",
"ext_labor_pn",
"qty_ready",
"wo_number",
"expected_vendor",
"wo_demand"
],
"columnWidthMap": {
"manufactured_pn": 120,
"manufactured_desc": 200,
"finished_pn": 100,
"ext_labor_pn": 100,
"qty_ready": 80,
"wo_number": 110,
"expected_vendor": 150,
"wo_demand": 80
},
"compactMode": "SHORT",
"defaultPageSize": 0,
"defaultSelectedRowIndex": 0,
"defaultSelectedRowIndices": [0],
"delimiter": ",",
"dynamicBindingPathList": [
{"key": "accentColor"},
{"key": "boxShadow"},
{"key": "tableData"},
{"key": "primaryColumns.manufactured_pn.computedValue"},
{"key": "primaryColumns.manufactured_desc.computedValue"},
{"key": "primaryColumns.finished_pn.computedValue"},
{"key": "primaryColumns.ext_labor_pn.computedValue"},
{"key": "primaryColumns.qty_ready.computedValue"},
{"key": "primaryColumns.wo_number.computedValue"},
{"key": "primaryColumns.expected_vendor.computedValue"},
{"key": "primaryColumns.wo_demand.computedValue"}
],
"dynamicPropertyPathList": [
{"key": "textSize"}
],
"dynamicTriggerPathList": [],
"enableClientSideSearch": true,
"horizontalAlignment": "LEFT",
"inlineEditingSaveOption": "ROW_LEVEL",
"isLoading": false,
"isSortable": true,
"isVisible": true,
"isVisibleDownload": true,
"isVisibleFilters": true,
"isVisiblePagination": true,
"isVisibleSearch": true,
"key": "ep1tblawky",
"label": "Data",
"leftColumn": 0,
"minWidth": 450,
"needsErrorInfo": false,
"parentColumnSpace": 11.265625,
"parentId": "ep1cnvstab2",
"parentRowSpace": 10,
"primaryColumns": {
"manufactured_pn": {
"alias": "manufactured_pn",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"manufactured_pn\"])) : manufactured_pn })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "manufactured_pn",
"index": 0,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "manufactured_pn",
"originalId": "manufactured_pn",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"manufactured_desc": {
"alias": "manufactured_desc",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"manufactured_desc\"])) : manufactured_desc })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "manufactured_desc",
"index": 1,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "manufactured_desc",
"originalId": "manufactured_desc",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"finished_pn": {
"alias": "finished_pn",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"finished_pn\"])) : finished_pn })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "finished_pn",
"index": 2,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "finished_pn",
"originalId": "finished_pn",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"ext_labor_pn": {
"alias": "ext_labor_pn",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"ext_labor_pn\"])) : ext_labor_pn })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "ext_labor_pn",
"index": 3,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "ext_labor_pn",
"originalId": "ext_labor_pn",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"qty_ready": {
"alias": "qty_ready",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "number",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"qty_ready\"])) : qty_ready })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "qty_ready",
"index": 4,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "qty_ready",
"originalId": "qty_ready",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"wo_number": {
"alias": "wo_number",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"wo_number\"])) : wo_number })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "wo_number",
"index": 5,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "wo_number",
"originalId": "wo_number",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"expected_vendor": {
"alias": "expected_vendor",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "text",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"expected_vendor\"])) : expected_vendor })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "expected_vendor",
"index": 6,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "expected_vendor",
"originalId": "expected_vendor",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
},
"wo_demand": {
"alias": "wo_demand",
"allowCellWrapping": false,
"allowSameOptionsInNewRow": true,
"columnType": "number",
"computedValue": "{{(() => { const tableData = ep1tblawait.processedTableData || []; return tableData.length > 0 ? tableData.map((currentRow, currentIndex) => (currentRow[\"wo_demand\"])) : wo_demand })()}}",
"enableFilter": true,
"enableSort": true,
"horizontalAlignment": "LEFT",
"id": "wo_demand",
"index": 7,
"isCellEditable": false,
"isCellVisible": true,
"isDerived": false,
"isDisabled": false,
"isEditable": false,
"isVisible": true,
"label": "wo_demand",
"originalId": "wo_demand",
"sticky": "",
"textSize": "0.775rem",
"validation": {},
"verticalAlignment": "CENTER",
"width": 150
}
},
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 62,
"searchKey": "",
"tableData": "{{awaiting_shipment.data}}",
"textSize": "0.775rem",
"topRow": 0,
"totalRecordsCount": 0,
"type": "TABLE_WIDGET_V2",
"version": 2,
"verticalAlignment": "CENTER",
"widgetId": "ep1tblawait",
"widgetName": "ep1tblawait"
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "jd1btn1cap",
"widgetName": "Button1"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "jd1btn1shp",
"widgetName": "Button1Copy"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "jd1btn1ord",
"widgetName": "Button1Copy2"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "jd1btn2pos",
"widgetName": "Button2All"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "jd1btn2rev",
"widgetName": "Button2Copy"
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
@@ -42,4 +40,4 @@
"version": 1,
"widgetId": "jd1btn2xgn",
"widgetName": "Button2Copy2"
}
}

View File

@@ -3,24 +3,16 @@
"borderRadius": "0.375rem",
"bottomRow": 44,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.backgroundColor}}",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [
{
"key": "buttonColor"
}
],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "jd1btn3k01",
"key": "jd1btn3ehk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 44,
@@ -28,7 +20,7 @@
"mobileRightColumn": 16,
"mobileTopRow": 40,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 44,
"originalTopRow": 40,
"parentColumnSpace": 3.841796875,
@@ -40,10 +32,10 @@
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Job Drawing Status",
"text": "Engineering Holds",
"topRow": 40,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "jd1btn3jds",
"widgetId": "jd1btn3eh",
"widgetName": "Button3"
}
}

View File

@@ -7,16 +7,12 @@
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "jd1btn3k02",
"key": "jd1btn3epk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 48,
@@ -24,7 +20,7 @@
"mobileRightColumn": 16,
"mobileTopRow": 44,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - External Process', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 48,
"originalTopRow": 44,
"parentColumnSpace": 3.841796875,
@@ -36,10 +32,10 @@
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Engineering Holds",
"text": "External Process",
"topRow": 44,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "jd1btn3enh",
"widgetId": "jd1btn3ep",
"widgetName": "Button3Copy"
}
}

View File

@@ -3,45 +3,39 @@
"borderRadius": "0.375rem",
"bottomRow": 52,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonColor": "{{appsmith.theme.colors.backgroundColor}}",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicBindingPathList": [{"key": "buttonColor"}],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "jd1btn3uik",
"key": "jd1btn3jdk",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 120,
"mobileBottomRow": 52,
"mobileLeftColumn": 0,
"mobileRightColumn": 64,
"mobileRightColumn": 16,
"mobileTopRow": 48,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Unused Items', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 52,
"originalTopRow": 48,
"parentColumnSpace": 3.841796875,
"parentId": "jd1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Unused Items",
"text": "Job Drawing Status",
"topRow": 48,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "jd1btn3ui",
"widgetId": "jd1btn3jd",
"widgetName": "Button3Copy2"
}
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 56,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "jd1btn3uik",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 56,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 52,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Unused Items', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 56,
"originalTopRow": 52,
"parentColumnSpace": 3.841796875,
"parentId": "jd1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Unused Items",
"topRow": 52,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "jd1btn3ui",
"widgetName": "Button3Copy3"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 60,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "jd1btn3wsk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 60,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 56,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - WO Shortages', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 60,
"originalTopRow": 56,
"parentColumnSpace": 3.841796875,
"parentId": "jd1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "WO Shortages",
"topRow": 56,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "jd1btn3ws",
"widgetName": "Button3Copy4"
}

View File

@@ -15,12 +15,8 @@
"containerStyle": "none",
"detachFromLayout": true,
"dynamicBindingPathList": [
{
"key": "borderRadius"
},
{
"key": "boxShadow"
}
{"key": "borderRadius"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"flexLayers": [],
@@ -52,9 +48,7 @@
],
"containerStyle": "card",
"dynamicBindingPathList": [
{
"key": "boxShadow"
}
{"key": "boxShadow"}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 4,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
@@ -49,4 +43,4 @@
"version": 1,
"widgetId": "jd1txt1sal",
"widgetName": "Text1"
}
}

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 22,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
@@ -49,4 +43,4 @@
"version": 1,
"widgetId": "jd1txt2eng",
"widgetName": "Text2"
}
}

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 40,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
@@ -49,4 +43,4 @@
"version": 1,
"widgetId": "jd1txt3ops",
"widgetName": "Text3"
}
}

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 5,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],

View File

@@ -30,4 +30,4 @@
"name": "Operations - Unused Items",
"slug": "operations-unused-items"
}
}
}

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,

View File

@@ -8,9 +8,7 @@
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
{"key": "onClick"}
],
"isDefaultClickDisabled": true,
"isDisabled": false,

View File

@@ -7,16 +7,12 @@
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ui1btn3k01",
"key": "ui1btn3ehk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 44,
@@ -24,7 +20,7 @@
"mobileRightColumn": 16,
"mobileTopRow": 40,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 44,
"originalTopRow": 40,
"parentColumnSpace": 3.841796875,
@@ -36,10 +32,10 @@
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Job Drawing Status",
"text": "Engineering Holds",
"topRow": 40,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ui1btn3jds",
"widgetId": "ui1btn3eh",
"widgetName": "Button3"
}
}

View File

@@ -7,16 +7,12 @@
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ui1btn3k02",
"key": "ui1btn3epk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 48,
@@ -24,7 +20,7 @@
"mobileRightColumn": 16,
"mobileTopRow": 44,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - External Process', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 48,
"originalTopRow": 44,
"parentColumnSpace": 3.841796875,
@@ -36,10 +32,10 @@
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Engineering Holds",
"text": "External Process",
"topRow": 44,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ui1btn3enh",
"widgetId": "ui1btn3ep",
"widgetName": "Button3Copy"
}
}

View File

@@ -3,46 +3,39 @@
"borderRadius": "0.375rem",
"bottomRow": 52,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.backgroundColor}}",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [
{
"key": "buttonColor"
}
],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ui1btn3uik",
"key": "ui1btn3jdk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 52,
"mobileLeftColumn": 0,
"mobileRightColumn": 64,
"mobileRightColumn": 16,
"mobileTopRow": 48,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Unused Items', {}, 'SAME_WINDOW');}}",
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 52,
"originalTopRow": 48,
"parentColumnSpace": 3.841796875,
"parentId": "ui1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Unused Items",
"text": "Job Drawing Status",
"topRow": 48,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ui1btn3ui",
"widgetId": "ui1btn3jd",
"widgetName": "Button3Copy2"
}
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 56,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.backgroundColor}}",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [{"key": "buttonColor"}],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ui1btn3uik",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 56,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 52,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Unused Items', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 56,
"originalTopRow": 52,
"parentColumnSpace": 3.841796875,
"parentId": "ui1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Unused Items",
"topRow": 52,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ui1btn3ui",
"widgetName": "Button3Copy3"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 60,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ui1btn3wsk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 60,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 56,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - WO Shortages', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 60,
"originalTopRow": 56,
"parentColumnSpace": 3.841796875,
"parentId": "ui1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "WO Shortages",
"topRow": 56,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ui1btn3ws",
"widgetName": "Button3Copy4"
}

View File

@@ -15,12 +15,8 @@
"containerStyle": "none",
"detachFromLayout": true,
"dynamicBindingPathList": [
{
"key": "borderRadius"
},
{
"key": "boxShadow"
}
{"key": "borderRadius"},
{"key": "boxShadow"}
],
"dynamicHeight": "AUTO_HEIGHT",
"flexLayers": [],
@@ -52,9 +48,7 @@
],
"containerStyle": "card",
"dynamicBindingPathList": [
{
"key": "boxShadow"
}
{"key": "boxShadow"}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 4,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 22,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 40,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],

View File

@@ -3,15 +3,9 @@
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 5,
"dynamicBindingPathList": [
{
"key": "truncateButtonColor"
},
{
"key": "fontFamily"
},
{
"key": "borderRadius"
}
{"key": "truncateButtonColor"},
{"key": "fontFamily"},
{"key": "borderRadius"}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
@@ -49,4 +43,4 @@
"version": 1,
"widgetId": "ui1heading1",
"widgetName": "Heading"
}
}

View File

@@ -0,0 +1,33 @@
{
"gitSyncId": "5a6b061faad540f286ebea06_720e519a-3116-4557-ad8e-350b8cc846d1",
"unpublishedPage": {
"isHidden": false,
"layouts": [
{
"dsl": {
"backgroundColor": "none",
"bottomRow": 1240,
"canExtend": true,
"containerStyle": "none",
"detachFromLayout": true,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [],
"leftColumn": 0,
"minHeight": 1292,
"parentColumnSpace": 1,
"parentRowSpace": 1,
"rightColumn": 4896,
"snapColumns": 64,
"snapRows": 124,
"topRow": 0,
"type": "CANVAS_WIDGET",
"version": 94,
"widgetId": "0",
"widgetName": "MainContainer"
}
}
],
"name": "Operations - WO Shortages",
"slug": "operations-wo-shortages"
}
}

View File

@@ -0,0 +1,65 @@
WITH fa_wos AS (
SELECT w.wo_id, w.wo_duedate
FROM wo w
JOIN itemsite isite ON w.wo_itemsite_id = isite.itemsite_id
JOIN item i ON isite.itemsite_item_id = i.item_id
WHERE w.wo_status IN ('R','E','I')
AND w.wo_ordtype != 'W'
AND EXISTS (
SELECT 1 FROM mpe.itematmdept
WHERE itematmdept_item_id = i.item_id
AND 'FA' = ANY(itematmdept_departments)
)
AND i.item_id NOT IN (
SELECT itemgrpitem_item_id FROM itemgrpitem WHERE itemgrpitem_itemgrp_id = 97
)
AND w.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days')
),
mts_shorts AS (
SELECT fw.wo_id AS top_wo_id,
mi.item_number, mi.item_descrip1, mi.item_id, 'MTS'::text AS shortage_type,
(wm.womatl_qtyreq - wm.womatl_qtyiss) AS qty_needed
FROM fa_wos fw
JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id
JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id
JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id
JOIN womatl wm ON sub_wo.wo_id = wm.womatl_wo_id
JOIN itemsite mis ON wm.womatl_itemsite_id = mis.itemsite_id
JOIN item mi ON mis.itemsite_item_id = mi.item_id
WHERE sub_wo.wo_status IN ('R','I')
AND wm.womatl_picklist AND wm.womatl_qtyreq > wm.womatl_qtyiss
),
mto_shorts AS (
SELECT fw.wo_id AS top_wo_id,
mi.item_number, mi.item_descrip1, mi.item_id, 'MTO'::text AS shortage_type,
(sub_wo.wo_qtyord - sub_wo.wo_qtyrcv) AS qty_needed
FROM fa_wos fw
JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id
JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id
JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id
JOIN itemsite mis ON sub_wo.wo_itemsite_id = mis.itemsite_id
JOIN item mi ON mis.itemsite_item_id = mi.item_id
WHERE sub_wo.wo_qtyord > sub_wo.wo_qtyrcv
AND sub_wo.wo_status IN ('R','I')
AND mi.item_id IN (
SELECT DISTINCT itemgrpitem_item_id FROM itemgrpitem
JOIN itemgrp ON itemgrpitem_itemgrp_id = itemgrp_id
WHERE itemgrp_name IN ('MAGNETIC-TRANSFORMER','MAGNETIC-PLUMBING','SUB-ASSEMBLY','PCB GROUP-WORK','INPUT-BD')
)
),
all_shorts AS (
SELECT * FROM mts_shorts
UNION ALL
SELECT * FROM mto_shorts
)
SELECT s.item_number AS part_number,
s.item_descrip1 AS part_description,
s.shortage_type,
COUNT(DISTINCT s.top_wo_id) AS wos_blocked,
SUM(s.qty_needed) AS total_qty_needed,
qtynetable(isite.itemsite_id, true) AS qty_available
FROM all_shorts s
JOIN itemsite isite ON isite.itemsite_item_id = s.item_id
AND isite.itemsite_warehous_id = 35
GROUP BY s.item_number, s.item_descrip1, s.shortage_type, isite.itemsite_id
ORDER BY wos_blocked DESC, total_qty_needed DESC;

View File

@@ -0,0 +1,31 @@
{
"gitSyncId": "5a6b061faad540f286ebea06_4161599c-ad00-4cae-814b-58edf5cbacd5",
"id": "Operations - WO Shortages_critical_parts",
"pluginId": "postgres-plugin",
"pluginType": "DB",
"unpublishedAction": {
"actionConfiguration": {
"body": "WITH fa_wos AS (\n SELECT w.wo_id, w.wo_duedate\n FROM wo w\n JOIN itemsite isite ON w.wo_itemsite_id = isite.itemsite_id\n JOIN item i ON isite.itemsite_item_id = i.item_id\n WHERE w.wo_status IN ('R','E','I')\n AND w.wo_ordtype != 'W'\n AND EXISTS (\n SELECT 1 FROM mpe.itematmdept\n WHERE itematmdept_item_id = i.item_id\n AND 'FA' = ANY(itematmdept_departments)\n )\n AND i.item_id NOT IN (\n SELECT itemgrpitem_item_id FROM itemgrpitem WHERE itemgrpitem_itemgrp_id = 97\n )\n AND w.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days')\n),\nmts_shorts AS (\n SELECT fw.wo_id AS top_wo_id,\n mi.item_number, mi.item_descrip1, mi.item_id, 'MTS'::text AS shortage_type,\n (wm.womatl_qtyreq - wm.womatl_qtyiss) AS qty_needed\n FROM fa_wos fw\n JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id\n JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id\n JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id\n JOIN womatl wm ON sub_wo.wo_id = wm.womatl_wo_id\n JOIN itemsite mis ON wm.womatl_itemsite_id = mis.itemsite_id\n JOIN item mi ON mis.itemsite_item_id = mi.item_id\n WHERE sub_wo.wo_status IN ('R','I')\n AND wm.womatl_picklist AND wm.womatl_qtyreq > wm.womatl_qtyiss\n),\nmto_shorts AS (\n SELECT fw.wo_id AS top_wo_id,\n mi.item_number, mi.item_descrip1, mi.item_id, 'MTO'::text AS shortage_type,\n (sub_wo.wo_qtyord - sub_wo.wo_qtyrcv) AS qty_needed\n FROM fa_wos fw\n JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id\n JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id\n JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id\n JOIN itemsite mis ON sub_wo.wo_itemsite_id = mis.itemsite_id\n JOIN item mi ON mis.itemsite_item_id = mi.item_id\n WHERE sub_wo.wo_qtyord > sub_wo.wo_qtyrcv\n AND sub_wo.wo_status IN ('R','I')\n AND mi.item_id IN (\n SELECT DISTINCT itemgrpitem_item_id FROM itemgrpitem\n JOIN itemgrp ON itemgrpitem_itemgrp_id = itemgrp_id\n WHERE itemgrp_name IN ('MAGNETIC-TRANSFORMER','MAGNETIC-PLUMBING','SUB-ASSEMBLY','PCB GROUP-WORK','INPUT-BD')\n )\n),\nall_shorts AS (\n SELECT * FROM mts_shorts\n UNION ALL\n SELECT * FROM mto_shorts\n)\nSELECT s.item_number AS part_number,\n s.item_descrip1 AS part_description,\n s.shortage_type,\n COUNT(DISTINCT s.top_wo_id) AS wos_blocked,\n SUM(s.qty_needed) AS total_qty_needed,\n qtynetable(isite.itemsite_id, true) AS qty_available\nFROM all_shorts s\nJOIN itemsite isite ON isite.itemsite_item_id = s.item_id\n AND isite.itemsite_warehous_id = 35\nGROUP BY s.item_number, s.item_descrip1, s.shortage_type, isite.itemsite_id\nORDER BY wos_blocked DESC, total_qty_needed DESC;",
"encodeParamsToggle": true,
"paginationType": "NONE",
"pluginSpecifiedTemplates": [
{
"value": true
}
],
"timeoutInMillisecond": 30000
},
"confirmBeforeExecute": false,
"datasource": {
"id": "xTuple_GoLive",
"isAutoGenerated": false,
"name": "xTuple_GoLive",
"pluginId": "postgres-plugin"
},
"dynamicBindingPathList": [],
"name": "critical_parts",
"pageId": "Operations - WO Shortages",
"runBehaviour": "AUTOMATIC",
"userSetOnLoad": false
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,112 @@
WITH fa_wos AS (
SELECT w.wo_id, w.wo_number, w.wo_subnumber, w.wo_status, w.wo_duedate,
w.wo_qtyord, i.item_number AS wo_item, i.item_descrip1 AS wo_descrip,
COALESCE(cust.cust_name, '') AS customer_name
FROM wo w
JOIN itemsite isite ON w.wo_itemsite_id = isite.itemsite_id
JOIN item i ON isite.itemsite_item_id = i.item_id
LEFT JOIN coitem ci ON w.wo_ordtype = 'S' AND w.wo_ordid = ci.coitem_id
LEFT JOIN cohead ch ON ci.coitem_cohead_id = ch.cohead_id
LEFT JOIN custinfo cust ON ch.cohead_cust_id = cust.cust_id
WHERE w.wo_status IN ('R','E','I')
AND w.wo_ordtype != 'W'
AND EXISTS (
SELECT 1 FROM mpe.itematmdept
WHERE itematmdept_item_id = i.item_id
AND 'FA' = ANY(itematmdept_departments)
)
AND i.item_id NOT IN (
SELECT itemgrpitem_item_id FROM itemgrpitem
WHERE itemgrpitem_itemgrp_id = 97
)
)
-- MTS shortages (stock material lines)
SELECT
CASE
WHEN fw.wo_duedate < CURRENT_DATE THEN 'Past Due'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '4 days') THEN 'This Week'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days') THEN 'Next Week'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '18 days') THEN '2 Weeks'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '25 days') THEN '3 Weeks'
ELSE '3+ Weeks'
END AS due_group,
CASE
WHEN fw.wo_duedate < CURRENT_DATE THEN 1
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '4 days') THEN 2
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days') THEN 3
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '18 days') THEN 4
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '25 days') THEN 5
ELSE 6
END AS due_group_sort,
fw.wo_number || '-' || fw.wo_subnumber AS wo_num,
fw.wo_status AS wo_status,
to_char(fw.wo_duedate, 'YYYY-MM-DD') AS wo_duedate,
fw.customer_name,
fw.wo_item,
fw.wo_descrip,
'MTS'::text AS shortage_type,
formatwonumber(sub_wo.wo_id) AS sub_wo_num,
mi.item_number AS short_part,
mi.item_descrip1 AS short_part_desc,
wm.womatl_qtyreq AS qty_required,
wm.womatl_qtyiss AS qty_issued,
qtynetable(mis.itemsite_id, true) AS qty_onhand
FROM fa_wos fw
JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id
JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id
JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id
JOIN womatl wm ON sub_wo.wo_id = wm.womatl_wo_id
JOIN itemsite mis ON wm.womatl_itemsite_id = mis.itemsite_id
JOIN item mi ON mis.itemsite_item_id = mi.item_id
WHERE sub_wo.wo_status IN ('R','I')
AND wm.womatl_picklist
AND wm.womatl_qtyreq > wm.womatl_qtyiss
UNION ALL
-- MTO shortages (manufactured sub-assemblies not complete)
SELECT
CASE
WHEN fw.wo_duedate < CURRENT_DATE THEN 'Past Due'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '4 days') THEN 'This Week'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days') THEN 'Next Week'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '18 days') THEN '2 Weeks'
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '25 days') THEN '3 Weeks'
ELSE '3+ Weeks'
END AS due_group,
CASE
WHEN fw.wo_duedate < CURRENT_DATE THEN 1
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '4 days') THEN 2
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days') THEN 3
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '18 days') THEN 4
WHEN fw.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '25 days') THEN 5
ELSE 6
END AS due_group_sort,
fw.wo_number || '-' || fw.wo_subnumber AS wo_num,
fw.wo_status AS wo_status,
to_char(fw.wo_duedate, 'YYYY-MM-DD') AS wo_duedate,
fw.customer_name,
fw.wo_item,
fw.wo_descrip,
'MTO'::text AS shortage_type,
formatwonumber(sub_wo.wo_id) AS sub_wo_num,
mi.item_number AS short_part,
mi.item_descrip1 AS short_part_desc,
sub_wo.wo_qtyord AS qty_required,
sub_wo.wo_qtyrcv AS qty_issued,
NULL::numeric AS qty_onhand
FROM fa_wos fw
JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id
JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id
JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id
JOIN itemsite mis ON sub_wo.wo_itemsite_id = mis.itemsite_id
JOIN item mi ON mis.itemsite_item_id = mi.item_id
WHERE sub_wo.wo_qtyord > sub_wo.wo_qtyrcv
AND sub_wo.wo_status IN ('R','I')
AND mi.item_id IN (
SELECT DISTINCT itemgrpitem_item_id FROM itemgrpitem
JOIN itemgrp ON itemgrpitem_itemgrp_id = itemgrp_id
WHERE itemgrp_name IN ('MAGNETIC-TRANSFORMER','MAGNETIC-PLUMBING','SUB-ASSEMBLY','PCB GROUP-WORK','INPUT-BD')
)
ORDER BY due_group_sort, wo_duedate, wo_num, shortage_type, short_part;

View File

@@ -0,0 +1,45 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 8,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn1capk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 8,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 4,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Sales - Capacity Planning', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 8,
"originalTopRow": 4,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Capacity Planning",
"topRow": 4,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn1cap",
"widgetName": "Button1"
}

View File

@@ -0,0 +1,45 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 12,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn1shpk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 12,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 8,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Sales - Units Shipped', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 12,
"originalTopRow": 8,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Units Shipped",
"topRow": 8,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn1shp",
"widgetName": "Button1Copy"
}

View File

@@ -0,0 +1,45 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 16,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn1ordk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 16,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 12,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Sales - Units Ordered', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 16,
"originalTopRow": 12,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Units Ordered",
"topRow": 12,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn1ord",
"widgetName": "Button1Copy2"
}

View File

@@ -0,0 +1,45 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 26,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn2posk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 26,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 22,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Pending POs', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 26,
"originalTopRow": 22,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Pending POs",
"topRow": 22,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn2pos",
"widgetName": "Button2All"
}

View File

@@ -0,0 +1,45 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 30,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn2revk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 30,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 26,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Pending Revisions', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 30,
"originalTopRow": 26,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Pending Revisions",
"topRow": 26,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn2rev",
"widgetName": "Button2Copy"
}

View File

@@ -0,0 +1,45 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 34,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn2xgnk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 34,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 30,
"needsErrorInfo": false,
"onClick": "{{navigateTo('xGen', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 34,
"originalTopRow": 30,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "xGen",
"topRow": 30,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn2xgn",
"widgetName": "Button2Copy2"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 44,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn3ehk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 44,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 40,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Engineering Holds', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 44,
"originalTopRow": 40,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Engineering Holds",
"topRow": 40,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn3eh",
"widgetName": "Button3"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 48,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn3epk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 48,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 44,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - External Process', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 48,
"originalTopRow": 44,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "External Process",
"topRow": 44,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn3ep",
"widgetName": "Button3Copy"
}

View File

@@ -0,0 +1,41 @@
{
"animateLoading": true,
"borderRadius": "0.375rem",
"bottomRow": 52,
"boxShadow": "none",
"buttonColor": "#ffffff",
"buttonVariant": "PRIMARY",
"disabledWhenInvalid": false,
"dynamicBindingPathList": [],
"dynamicTriggerPathList": [{"key": "onClick"}],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "ws1btn3jdk",
"leftColumn": 0,
"minWidth": 120,
"mobileBottomRow": 52,
"mobileLeftColumn": 0,
"mobileRightColumn": 16,
"mobileTopRow": 48,
"needsErrorInfo": false,
"onClick": "{{navigateTo('Operations - Job Drawing Status', {}, 'SAME_WINDOW');}}",
"originalBottomRow": 52,
"originalTopRow": 48,
"parentColumnSpace": 3.841796875,
"parentId": "ws1canvas01",
"parentRowSpace": 10,
"placement": "START",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 64,
"text": "Job Drawing Status",
"topRow": 48,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ws1btn3jd",
"widgetName": "Button3Copy2"
}

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