POST
|
Hi again, Chris, An update regarding holiday pickup dates from the county local government that is using this. If the next scheduled pickup is a holiday, then the next scheduled pickup will be the Thursday of the same week. No regular services are provided on Thursdays, so the county does not outline how to handle next pickup dates if it is a Thursday. I apologize for not having this information before. The local government is VERY happy to have the My Trash Services solution, and wants to make sure it is accurate for its residents. The app usage spikes during holidays and that is when it is most important to have the correct information. Thanks for all of your help on this one, and will be happy to share the application when completed! Will actually be expanding the My Trash Services solution into a fully comprehensive Hub initiative!
... View more
06-24-2021
09:14 AM
|
0
|
1
|
2780
|
POST
|
Hi Chris, This is great! Thank you for your work on this. It is greatly appreciated! In the event that the Next Pickup Date is Christmas, which would mean the Next Pickup Date is scheduled for New Years Day which is also a 'no service' holiday, the Next Pickup Date would be the next regular pickup date in January. Simply put, there would be no pickup service the week of Christmas and New Years IF the Next Pickup Date falls on either of those days.
... View more
06-23-2021
12:52 PM
|
0
|
0
|
2787
|
POST
|
Thanks, Scott! Hey Chris! Yes, that is correct. For this year, Labor Day is on Monday 9/6 and the next pickup day will be Thursday 9/9. The pattern for those three holidays is that if the next pickup day is a holiday, then the holiday pick up date will be the Thursday immediately following the original day. For Thanksgiving, Christmas, and New Year's, you are also correct - there will be no scheduled pick up that week and normal pickup will resume the following week. Almost like a hybrid of 'Next Scheduled Pickup' and a new or modified nextPickupHoliday that considers a dictionary of specific holidays with their respective designated pickup dates.
... View more
06-18-2021
07:26 AM
|
0
|
5
|
2837
|
POST
|
Greetings, all! I am configuring the My Trash Services solution deployed from the ArcGIS Solutions App, and specifically configuring the Next Pickup Arcade expression for the Pickup [polygon] layers. The expression includes a variable for nextPickupHoliday where I can configure "Next Weekday", "Next Day", or "Next Scheduled Pickup", and the returned value will be the next weekday, next day, or next scheduled pickup day, respectively. I am seeking help to update the expression to accommodate the following scenario: If the pickup day is Memorial Day, then the next pickup day will be the following Thursday. If the pickup day is Independence Day, then the next pickup day will be the following Thursday. If the pickup day is Labor Day, then the next pickup day will be the following Thursday. If the pickup day is Thanksgiving, then there will be no pickup day that week. If the pickup day is Christmas, then there will be no pickup day that week. If thee pickup day is New Years Day, then there will be no pickup that week. So, two scenarios to this special case: (1) if the pickup day is on a specific holiday, then the next pickup day will be on a specific day of the week during that week, and (2) if the pickup day is on a specific holiday, then there will be no pickup day during that week. Since the Solutions experience updates and can change, I have included the Arcade expression below that I am using. /*If pickup occurs weekly, specify 1. If every other week specify 2, etc.*/ var pickupWeekInterval = 1; /*Specify a date in the past in which pickup occurred. This is used in the case where pickup doesn't occur every week to determine the weeks where pickup is occurring.*/ var firstPickupWeek = Date('2017-01-01'); /*If the pickup service isn't available year-round specify the first and last day of the season that pickup will occur, [[Start Month, Start Day], [[End Month, End Day]]*/ var openSeason = [[1,1],[12,31]] //Specify any holidays where pickup will not occur, [Month, Day] var holidays = [[1,1],[7,4],[12,25]] /*Specify any variable holidays where pickup will not occur, [Occurrence, Month, Day of the Week (Sunday = 0, Saturday = 6)] These are holidays that don't fall on the same date every year, i.e. Memorial Day, Labor Day, Thanksgiving [-1,5,1] corresponds to Memorial Day -> Last occurrence in May of a Monday [1,9,1] corresponds to Labor Day -> 1st occurrence in September of a Monday [4,11,4] corresponds to Thanksgiving -> 4th occurrence in November of a Thursday*/ var variableHolidays = [[-1,5,1],[1,9,1],[4,11,4]]; /*Specify if the next scheduled pickup day falls on a holiday, when will the next actual pickup be. "Next Weekday" - The pickup will occur on the next weekday after the holiday "Next Day" - The pickup will occur on the next day after the holiday "Next Scheduled Pickup" - The pickup will occur on the next scheduled day after the holiday*/ var nextPickupHoliday = "Next Weekday"; var pickupDays = []; var pickupDaysFields = [$feature.SUNDAY, $feature.MONDAY, $feature.TUESDAY, $feature.WEDNESDAY, $feature.THURSDAY, $feature.FRIDAY, $feature.SATURDAY] for (var k in pickupDaysFields) { if (pickupDaysFields[k] == 'Yes') { pickupDays[Count(pickupDays)] = k; } } if (Count(pickupDays) == 0) return; function calcRelativeHoliday(week, month, day, year) { var holiday; if (week < 0){ var lastDay = DateAdd(Date(year, month + 1, 1), -1, 'days'); var dayOfWeek = Weekday(lastDay); var dayDiff = day - dayOfWeek; if (dayDiff > 0) dayDiff -= 7; holiday = DateAdd(lastDay, dayDiff + ((week + 1) * 7), 'days'); } else{ var firstDay = Date(year, month, 1); var dayOfWeek = Weekday(firstDay); var dayDiff = day - dayOfWeek; if (dayDiff < 0) dayDiff += 7; holiday = DateAdd(firstDay, dayDiff + ((week - 1) * 7), 'days'); } return holiday; } function getNextPickupDay(fromDate) { var currentDay = Weekday(fromDate); var pickupOffset = 0; if (pickupWeekInterval > 1){ var weekDif = DateDiff(DateAdd(fromDate, 0 - currentDay, 'days'), DateAdd(firstPickupWeek, 0 - Weekday(firstPickupWeek), 'days'), 'days') / 7; weekDif = weekDif % pickupWeekInterval; if (weekDif > 0) pickupOffset = pickupWeekInterval - weekDif; } var difDays; var nextPickupDay; if (pickupOffset > 0) { nextPickupDay = pickupDays[0]; difDays = nextPickupDay - currentDay; difDays += (7 * pickupOffset); } else { for(var k in pickupDays) { if (pickupDays[k] >= currentDay) { nextPickupDay = pickupDays[k]; break; } } if (IsEmpty(nextPickupDay)) nextPickupDay = pickupDays[0]; difDays = nextPickupDay - currentDay; if (nextPickupDay < currentDay) difDays += (7 * pickupWeekInterval); } return DateAdd(fromDate, difDays, 'days'); } function getHolidays(fromDate) { var holidayDates = []; for (var k in holidays) { var holiday = Date(Year(fromDate), holidays[k][0] -1, holidays[k][1]); if (holiday < fromDate) holiday = Date(Year(fromDate) + 1, holidays[k][0] -1, holidays[k][1]); holidayDates[k] = holiday; } for (var k in variableHolidays) { var x = variableHolidays[k]; var holiday = calcRelativeHoliday(x[0], x[1]-1, x[2], Year(fromDate)); if (holiday < fromDate) holiday = calcRelativeHoliday(x[0], x[1]-1, x[2], Year(fromDate) + 1); holidayDates[Count(holidayDates)] = holiday; } return holidayDates; } function validateSeasonPickup(pickupDate) { var startSeasonMonth = openSeason[0][0]-1; var startSeasonDay = openSeason[0][1]; var endSeasonMonth = openSeason[1][0]-1; var endSeasonDay = openSeason[1][1]; if (Date(Year(pickupDate), startSeasonMonth, startSeasonDay) > Date(Year(pickupDate), endSeasonMonth, endSeasonDay)) { if (pickupDate < Date(Year(pickupDate), startSeasonMonth, startSeasonDay) && pickupDate > Date(Year(pickupDate) - 1, endSeasonMonth, endSeasonDay)) pickupDate = getNextPickupDay(Date(Year(pickupDate), startSeasonMonth, startSeasonDay)) } else { if (pickupDate < Date(Year(pickupDate), startSeasonMonth, startSeasonDay)) pickupDate = getNextPickupDay(Date(Year(pickupDate), startSeasonMonth, startSeasonDay)); else if (pickupDate > Date(Year(pickupDate), endSeasonMonth, endSeasonDay)) pickupDate = getNextPickupDay(Date(Year(pickupDate) + 1, startSeasonMonth, startSeasonDay)); } return pickupDate; } function validateHolidayPickup(pickupDate, holidayDates) { for(var k in holidayDates) { if (pickupDate == holidayDates[k]) { if (nextPickupHoliday == "Next Scheduled Pickup") { pickupDate = getNextPickupDay(DateAdd(pickupDate, 1, 'days')); } else if (nextPickupHoliday == "Next Day") { pickupDate = DateAdd(pickupDate, 1, 'days'); } else if (nextPickupHoliday == "Next Weekday") { var currentDay = Weekday(pickupDate); if (currentDay > 4) { pickupDate = DateAdd(pickupDate, 8 - currentDay, 'days'); } else { pickupDate = DateAdd(pickupDate, 1, 'days'); } } break; } } return pickupDate } var nextPickup = getNextPickupDay(Today()); nextPickup = validateSeasonPickup(nextPickup); nextPickup = validateHolidayPickup(nextPickup, getHolidays(nextPickup)); return Text(nextPickup, 'dddd, MMMM D'); I genuinely appreciate any help and suggestions for best or better practices when working with expressions. Thanks all! @ScottOppmann
... View more
06-17-2021
06:31 PM
|
0
|
8
|
2909
|
POST
|
Hi @JamesM , I was very glad to find this content on GeoNet because we are experiencing this challenge at a couple local governments that are using web map Arcade expressions to pass feature point geometry attributes as URL parameters into Survey123 forms. In some cases, staff users are submitting reports using Survey123 for property parcels, and the rounding of the Arcade calculated coordinates from 10-12 digits down to 5 digits in Survey123 is producing an offset of significant consequence when the Survey123 point feature gets misplaced on top of a different property parcel. The workaround is for staff to verify the location of the point in the map before saving the survey and to manually update it. However, if multiple surveys are submitted for a single property where the staff user is manually updating the point location each time, the points are getting scattered across the property parcel over time, and is impacting the perception of data integrity within the department. If you're able to provide some information on where this idea/issue has landed, if it will be updated in an upcoming version, and if you or others have other workarounds to improving the prevision of the mapped point when using URL center paramenters. Thanks, James!
... View more
12-16-2020
03:05 PM
|
0
|
0
|
1923
|
IDEA
|
Desire the ability to upload bookmark thumbnails. Exceptionally rare that we and the organizations with whom we work will have a web-hosted image repository. More efficient to be able to upload these thumbnail graphics, and eliminate the requirement to have an image hosting service elsewhere.
... View more
12-01-2020
07:35 AM
|
0
|
0
|
591
|
IDEA
|
It is highly desirable to have the supported capability to configure the hover label of a chart's bars, a pie's slices, and a line graph's plotted points in the popups. The use case is that not all of the data we work with use attribute names in a way that would make them an appropriate label. Instead, there is often an attribute named 'Label', and the attribute value is what the user needs to see when hovering over a chart bar, slice, or plotted point. Specific example: When configuring the My Tax Distribution application, where a table contains records for every parcel, and every record has a set of attributes designed to hold one set of information. Attributes Parcel Number or Name Tax District Name 1 Tax District Amount 1 Tax District Name 2 Tax District Amount 2 The values in the 'Tax District Name 1' will not be identical, and the same is true for the other Tax District Name attributes. Presently, when hovering over a chart bar, pie slice, or plot point, the hover label displays the attribute name, and does not provide complete or the most insightful information about the data or the data value being hovered over. This will be very important for us to take advantage of Map Viewer Beta Chart authoring. Happy to provide more details if needed. Thank you! 🙂
... View more
12-01-2020
07:30 AM
|
4
|
1
|
860
|
IDEA
|
Adding Median as an additional Statistic Type to the Dashboards Indicator widget would be nice.
... View more
08-06-2020
11:34 AM
|
1
|
0
|
488
|
POST
|
I'm working with a StoryMap Collection and attempting to change the Design settings. Am attempting to change the Navigation setting from Compact to either Tabbed or Bulleted, but the style appears to not be applied and cannot be previewed. I use Chrome as my default browser and check for updates often. Have others experienced this? Browser issue, perhaps? Other? Screenshot of the Design and Navigation style I'm attempting to apply. Tabbed and Bulleted style show not visible change when selected.
... View more
07-07-2020
06:09 AM
|
0
|
3
|
1059
|
POST
|
Hey Phil, Working internally and with Esri Support we have identified some of the Arcade Expressions we desired are simply very expensive to run in the Attribute Table widget for the large number of features we were working with. Makes sense now and we've designed other methods of getting attribute data from one feature to another by modifying workflows to include Collector and Survey123.
... View more
07-07-2020
06:04 AM
|
0
|
1
|
1149
|
POST
|
Hi all, I am configuring the Nearby Configurable App in ArcGIS Online, and the layer popup includes attributes that are sometimes null or have no value. The results in the Nearby app are displaying the text 'null' if there is no attribute value, and this is making for a less-than-optimal display. Has anyone discovered a way to hide this text from displaying if the attribute value is null without having to create an Arcade expression for every attribute? Or is this a bug?
... View more
04-24-2020
08:36 AM
|
0
|
0
|
524
|
POST
|
Greetings all, I have configured two Arcade expressions on a point layer in an ArcGIS Online web map to display each the X-coordinate and the Y-coordinate. The values display correctly in the web map popup, and in Web AppBuilder's Attribute Table widget. However, we cannot use the Export to CSV tool in the Attribute Table widget now. The result is that the 'Export to CSV' window opens, we click OK, and the window spins endlessly. When we remove the Arcade expression from the web map, then the Export to CSV capability in the AT widget works. Thoughts? Ideas? Considerations? return Round(Geometry($feature).x, 6);
... View more
03-05-2020
07:00 AM
|
0
|
3
|
1320
|
BLOG
|
Hey again Xander Bakker This expression produces the correct values in the popup, but the web map table displays 'Data Error'. I removed a Visible Scale setting on the layer so that the layer is visible when the map is launched. When I reloaded the map, the attribute table would display a hyperlink saying 'Show', and when clicked it would display the correct result. When opening the Web AppBuilder Attribute Table, the attribute columns still display '[object Promise]' when using the new Arcade expression and after removing the Scale Visibility setting. The web map and application are hosted in AGO, the data is in a local enterprise geodatabase and being served through ArcGIS Server as a Feature Layer. The map services were published using ArcMap.
... View more
02-13-2020
11:20 AM
|
0
|
0
|
6436
|
BLOG
|
Hey Xander Bakker, The Arcade expression is returning a string. The web map attribute table shows the expression attribute columns and the values say 'Show' and appear like a hyperlink (blue and clickable). When 'Show' is clicked, the 'Show' value disappears and the cell is empty. For a few minutes yesterday, clicking 'Show' would display the correct result from the Arcade expression. In Web AppBuilder, the Attribute Table widget displays the attribute columns for the Arcade expressions, but the value for all of them is text that says '[object Promise]'. This can be seen in the web application (ArcGIS Web Application ) by opening the Attribute Table. Taxpayer Name, Taxpayer Address Line 1, Taxpayer Address Line 2, Parcel ID, and Homestead Description are all Arcade expressions that return '[object Promise]' in the cell. The correct value displays in the map popup. The Arcade expression for Taxpayer Name is as follows. Note that this is used for each expression and the only difference in each of them is the name of the attribute returned from the intersecting layer. var intersectLayer = Intersects(FeatureSetByName($map,"Tax Parcels"), $feature); for (var i in intersectLayer) { return i.TAXPAYER_NAME }
... View more
02-13-2020
10:10 AM
|
0
|
0
|
6436
|
Title | Kudos | Posted |
---|---|---|
1 | 02-26-2016 10:40 AM | |
1 | 07-22-2022 10:05 AM | |
2 | 04-11-2023 10:47 AM | |
8 | 07-21-2022 06:17 AM | |
3 | 07-20-2022 02:30 PM |
Online Status |
Offline
|
Date Last Visited |
08-27-2024
03:46 AM
|