|
IDEA
|
That'd be much better than fiddling with the calendar widget for me. Is Ctrl+; and Ctrl+Shift+; free? Those are the Excel binds so that'd make the UX even smoother.
... View more
07-03-2026
01:55 PM
|
0
|
0
|
166
|
|
POST
|
Don't try to parallelize anything to do with map or layout structure in a single Pro instance, even if you find a safe way to do it it'll probably be slower than a single threaded implementation anyways. If you need to run a layout adjustment + export workflow in multiple maps you might as well run multiple Python instances, the headaches of multiprocess-specific issues aren't worth the miniscule amount of memory sharing you can achieve.
... View more
07-03-2026
11:43 AM
|
2
|
1
|
285
|
|
POST
|
Easiest Arcade expression you'll ever write: "https://www.mywesite.com/path/to/root/" + $feature.my_field You might need some more code to handle null values, other validity checks etc. but it's very easy and much better than waiting for an ETL process to run.
... View more
07-03-2026
11:37 AM
|
0
|
0
|
169
|
|
POST
|
ESRI screwed up the Field Maps update and it assumes all feature forms have the fancy new attachment items, which require upgraded attachments. If you can run Upgrade Attachments on all your tables without breaking anything, get that done. If you can't, call up your support rep and work with them to escalate this with Esri Inc.
... View more
06-30-2026
09:35 AM
|
2
|
4
|
494
|
|
POST
|
Whoops, false alarm! I left another, virtually identical map in my test experience that was tripping things up. The real issue is that map service layers have the entire service as their parent, so I need to use this modified listing to check for that: const hideDataSource = (dsJson: IMDataSourceJson, jmvDataSourceId: string, geomType: GeometryType) => {
const ds = dsManager.getDataSource(dsJson.id);
return !((ds.parentDataSource?.id ?? "").startsWith(jmvDataSourceId)) || ds.getGeometryType() !== geomType
}
... View more
06-26-2026
08:37 AM
|
0
|
0
|
218
|
|
POST
|
ExB Developer Edition 1.17.0 I'm working through a bug where a set of map service layers in a Scene is filtered out of my DataSourceSelector. My "hideDs" function takes in the current DataSource JSON, the dataSourceId of the JMV and a geometry type string, then does this: const hideDataSource = (dsJson: IMDataSourceJson, jmvDataSourceId: string, geomType: GeometryType) => {
const ds = DataSourceManager.getInstance().getDataSource(dsJson.id);
return (ds.parentDataSource?.id !== jmvDataSourceId) || ds.getGeometryType() !== geomType
} This works fine with my test Maps but when I try with a Scene, it looks like the "parentDataSource" is a completely different source with a "WEB_MAP" type, which means my filter breaks. Is this expected behaviour with Scenes in ExB? Is there a way to safely correlate the two data sources? Would selecting this source even work in widgets?
... View more
06-25-2026
05:46 PM
|
0
|
1
|
305
|
|
POST
|
I did a bit more testing and it looks like my chosen action (flash the data on the map) is actually working despite the error. Is this a benign error for all actions? I'd prefer not to dump weird errors into the console every time a user runs a task but that's better than not having it work at all.
... View more
06-12-2026
05:15 PM
|
0
|
0
|
564
|
|
POST
|
I'm working on a widget for ExB 1.17 that will select a point and a polygon feature from the map's data sources if a selection action is added to the widget. I was able to get the Extent Change message type handled pretty easily so I figured this would be fine too, but instead I get this error after the message is published: Bad jimuLayerViewId:widget_6-dataSource_2-<layer_name_here> I'm incredibly confused because the actual ID's I'm passing in look like this: dataSource_1-<layer_name_here> This means the completely separate Data Source from the other half of my map widget is getting into the message somehow? My actions look just fine in the settings panel and I don't see any obvious issues with my invoker function, anything I'm missing here? const invokeSelectionMessages = async (polyJlv: JimuLayerView, polyResult: Graphic, pointJlv: JimuLayerView, pointResult: Graphic, widgetId: string) => {
const polyDs = await polyJlv.getOrCreateLayerDataSource() as QueriableDataSource;
const pointDs = await pointJlv.getOrCreateLayerDataSource() as QueriableDataSource;
const polyId = String(polyResult.getObjectId());
const pointId = String(pointResult.getObjectId());
const polyRecord = await polyDs.loadById(polyId, true);
const pointRecord = await pointDs.loadById(pointId, true);
polyDs.selectRecordById(polyId, polyRecord);
pointDs.selectRecordById(pointId, pointRecord);
MessageManager.getInstance().publishMessage(new DataRecordsSelectionChangeMessage(
widgetId,
[polyRecord, pointRecord],
[polyDs.id, pointDs.id]
));
} I tried running two publish actions (one per data source) but that just creates two errors.
... View more
06-12-2026
05:05 PM
|
0
|
1
|
568
|
|
POST
|
Biggest thing that sticks out is: WARNING 003414: dataset does not match schema and will not be appended Did you try using the Append tool's field map option to assign the fields correctly? What you can also try is downloading the original data as a FGDB, doing the data design in another FGDB, appending the old data into the new schema, then publishing that as your service. That way you can check the validity of your data before it has to deal with ArcGIS Online.
... View more
06-08-2026
10:16 AM
|
0
|
2
|
588
|
|
POST
|
Ah, there's always something buried in the support code! I'll have to test this later but I think this does the trick: /** Scale a point symbol and return the original and new sizes. */
export async function scalePointSymbol(point: Graphic, to?: number, by?: number): Promise<[number, number]> {
if (!to && !by) {
throw new Error("Must provide at least one of \"to\" or \"by\"");
}
let prevSize: number;
let newSize: number = to ?? undefined;
switch (point.symbol.type) {
case "simple-marker":
case "point-3d":
prevSize = point.symbol.size;
newSize ||= prevSize * by;
point.symbol.size = newSize;
break;
case "text":
prevSize = point.symbol.font.size;
newSize ||= prevSize * by;
point.symbol.font.size = newSize;
break;
case "picture-marker":
const w = point.symbol.width;
const h = point.symbol.height;
const isWider = w > h;
prevSize = isWider ? w : h;
if (newSize) {
point.symbol.width = isWider ? newSize : newSize * (w / h);
point.symbol.height = isWider ? newSize * (h / w) : newSize;
} else {
point.symbol.width *= by;
point.symbol.height *= by;
newSize = prevSize * by;
}
break;
case "web-style":
point.symbol = await point.symbol.fetchCIMSymbol();
case "cim":
prevSize = getCIMSymbolSize(point.symbol);
newSize ||= prevSize * by;
scaleCIMSymbolTo(point.symbol, newSize, { preserveOutlineWidth: false });
break;
default:
throw new Error(`Graphic does not have a point symbol (${point.symbol.type})`);
}
return [prevSize, newSize]
}
... View more
06-08-2026
08:46 AM
|
0
|
0
|
355
|
|
POST
|
I need to take the 2D symbol of an arbitrary point Graphic and multiply the size by 1.5. Is there a sensible way to do this for all potential symbol types? I have simple and picture markers down but I have no idea where to begin with CIM Symbols, and I assume the 3D symbols need shader stuff to scale properly. I have the option of shoving this symbol in a separate layer and applying the scaling there if that works better. const scale = 1.5
let baseSize: number;
if (pointGraphic.symbol.size != null) {
baseSize = pointGraphic.symbol.size * scale;
pointGraphic.symbol.size = baseSize;
} else if ((pointGraphic.symbol as any)?.width != null) {
const baseWidth = (pointGraphic.symbol as any).width * scale;
const baseHeight = (pointGraphic.symbol as any).height * scale;
baseSize = baseWidth > baseHeight ? baseWidth : baseHeight;
(pointGraphic.symbol as any).width = baseWidth;
(pointGraphic.symbol as any).height = baseHeight;
} else if ((pointGraphic.symbol as any)?.font != null) {
baseSize = (pointGraphic.symbol as any).font.size * scale;
(pointGraphic.symbol as any).font.size = baseSize;
} else {
// TODO: Scale CIM point
}
... View more
06-05-2026
03:31 PM
|
0
|
2
|
470
|
|
POST
|
Webpack describes HMR on their official site as bypassing browser reloads entirely: you hit save, the page hotswaps the webpack chunks, now your webpage has the updated code ready to go, like "changing styles directly in the browser's dev tools." It also mentions this is something the "application" has to manage, which I assume is Experience Builder in this context, so we'd need someone with tons of internal ExB knowledge to weigh in on if this is feasible or not.
... View more
05-08-2026
08:24 AM
|
0
|
0
|
460
|
|
POST
|
I'm reaching the point of widget development where reloading and readding my custom widget for debugging is grinding my gears. The VSCode documentation suggests that webpack's HMR feature should just work for React, but they're using the default React toolchain, not whatever non-standard loadout the ExB team had to bolt together to get this all working. Has anyone had success getting HMR working? Is this even feasible with ExB's layout? In a perfect world I can hit save, wait for webpack to hot compile and then my next interaction with the debug browser instance pulls the hot-loaded code. At this point I'd settle for the hot-load only taking effect on remount.
... View more
05-07-2026
08:40 PM
|
0
|
2
|
539
|
| Title | Kudos | Posted |
|---|---|---|
| 1 | Wednesday | |
| 1 | Wednesday | |
| 2 | 2 weeks ago | |
| 1 | 2 weeks ago | |
| 1 | 4 weeks ago |
| Online Status |
Online
|
| Date Last Visited |
5 hours ago
|