{"record":{"id":"ddc0b039c7a71159","repo":"windmill-labs/windmill","slug":"aggrid-enterprise-edition-require-windmill-enterpr","errorCode":null,"errorMessage":"AgGrid Enterprise Edition require Windmill Enterprise Edition","messagePattern":"AgGrid Enterprise Edition require Windmill Enterprise Edition","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"frontend/src/lib/components/apps/editor/appUtils.ts","lineNumber":552,"sourceCode":"export function insertNewGridItem(\n\tapp: App,\n\tbuilddata: (id: string) => AppComponent,\n\tfocusedGrid: FocusedGrid | undefined,\n\tcolumns?: Record<string, any>,\n\tkeepId?: string,\n\tinitialPosition: { x: number; y: number } = { x: 0, y: 0 },\n\trecOverride?: Record<number, Size>,\n\tkeepSubgrids?: boolean,\n\tfixed?: boolean,\n\tshouldNotFindSpace?: boolean\n): string {\n\tconst id = keepId ?? getNextGridItemId(app)\n\n\tconst data = builddata(id)\n\n\tif (data.type == 'aggridcomponentee' && !get(enterpriseLicense)) {\n\t\tsendUserToast('AgGrid Enterprise Edition require Windmill Enterprise Edition', true)\n\t\tthrow Error('AgGrid Enterprise Edition require Windmill Enterprise Edition')\n\t}\n\tif (!app.subgrids) {\n\t\tapp.subgrids = {}\n\t}\n\n\t// We only want to set subgrids when we are not moving\n\tif (!keepId || keepSubgrids) {\n\t\tfor (let i = 0; i < (data.numberOfSubgrids ?? 0); i++) {\n\t\t\tapp.subgrids[`${id}-${i}`] = []\n\t\t}\n\t}\n\n\tconst key = focusedGrid\n\t\t? `${focusedGrid?.parentComponentId}-${focusedGrid?.subGridIndex ?? 0}`\n\t\t: undefined\n\n\tif (key && app.subgrids[key] === undefined) {\n\t\tlet parent = findGridItemById(app.grid, app.subgrids, key)?.data","sourceCodeStart":534,"sourceCodeEnd":570,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/frontend/src/lib/components/apps/editor/appUtils.ts#L534-L570","documentation":"Inserting an AgGrid component of type 'aggridcomponentee' (Enterprise Edition grid) requires a Windmill Enterprise Edition license. When no enterprise license is active, insertNewGridItem shows a toast and throws to block adding the component.","triggerScenarios":"Adding or pasting an aggridcomponentee component in the app editor (newItem, handlePaste, moveComponentBetweenSubgrids, moveToRoot, setUpTopBarComponentContent) while get(enterpriseLicense) is falsy.","commonSituations":"Community-edition instance trying to use EE-only AgGrid features; license expired or not loaded on the instance; duplicating/pasting an app section containing an EE grid into a community instance.","solutions":["Use the community 'aggridcomponent' instead of 'aggridcomponentee'","Obtain and activate a Windmill Enterprise Edition license (instance settings) and reload the editor","Remove the EE grid components when copying apps between community and EE instances"],"exampleFix":"// before (component def)\n{ type: 'aggridcomponentee', ... }\n// after\n{ type: 'aggridcomponent', ... }","handlingStrategy":"validation","validationCode":"import { get } from 'svelte/store'; import { enterpriseLicense } from '$lib/stores'; if (componentType === 'aggridcomponentee' && !get(enterpriseLicense)) { alert('EE AgGrid requires an Enterprise license'); }","typeGuard":"function canInsertEeGrid(licensed: boolean): boolean { return licensed; }","tryCatchPattern":"try { insertNewGridItem(app, data); } catch (e) { if (String(e.message).includes('Enterprise Edition')) { sendUserToast('Switch to the community aggridcomponent or activate an EE license.', true); } else throw e; }","preventionTips":["Use 'aggridcomponent' (community) unless the instance is licensed EE","Check the license store before templates/pastes that embed EE components","Validate EE components after copying apps between community and EE instances"],"tags":["frontend","app-editor","licensing","aggrid"],"backgroundTag":"license-required","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}