// Warm Up // Parcel name (APN) must be 9 characters long or 'RW'. //Create an attribute Rule Constraint // It is OK to have a parcel without name while creating it, but once a value is populated it must meet the business rule //Use the Arcade playground var APN = '123456789'; //var APN = 'RW' //var APN = 'BAD' if (!IsEmpty(APN)){ return ((APN =='RW') || (count(APN)==9)); } return true; // Then create a Attribute Rule Constraint var APN = $feature.name; if (!IsEmpty(APN)){ return ((APN =='RW') || (count(APN)==9)); } return true; // popup Intersect with another layer var BookPageFS = FeatureSetByName($map, 'BookPage', ["Book", "Page"], true); var BookPage = First(Intersects(BookPageFS, Geometry($feature))) return "Book: " + BookPage.Book + " Page: " + BookPage.Page; // Attribute Rule Calculation based on Intersect with another layer var BookPageFS = FeatureSetByName($datastore, 'BookPage', ["Book", "Page"], true); var BookPage = First(Intersects(BookPageFS, Geometry($feature))) if (!IsEmpty(BookPage)){ return "Book: " + BookPage.Book + " Page: " + BookPage.Page; } // Calculate field for existing data using the above expression //Attribute Rule Validation - Current Parcel Name Must be unique var parcels = FeatureSetByName($datastore, "Tax",['Name'], false); var parcelName = $feature.Name; var sql = "Name = " + "'" + parcelName + "' AND RetiredByRecord IS NULL"; var SameNameParcels = Filter(parcels, sql); if (IsEmpty($feature.RetiredByRecord) && (parcelName!='RW')){ //only check current parcels that are not 'RW' return (Count(SameNameParcels)==1); //if it's not 1 it returns false } return true; // popup to display parent parcel names var RecordID = $feature.CreatedByRecord; var sql = "RetiredByRecord = '" + RecordID + "'"; var fsHisoricParcels = FeatureSetByName($map, 'Historic Tax', ["Name"], false); var fsParentParcels = Filter(fsHisoricParcels, sql); var cnt = Count(fsParentParcels); if (cnt ==0) {return "No Parent Parcels found"} else{ var ParentParcelsNames = cnt + " Parent Parcels = "; for (var HistoricParcel in fsParentParcels){ ParentParcelsNames += (HistoricParcel.Name + "; "); } return ParentParcelsNames; } //popup to check if parcels overlap //Setting var ParcelTableName = "Tax"; //Set you parcel table geodatbase name var parcels = FeatureSetByName($datastore, ParcelTableName,['RetiredByRecord'], true); var sql = "RetiredByRecord IS NULL"; var currentParcels = Filter(parcels, sql); if (IsEmpty($feature.RetiredByRecord)){ return (Count(Overlaps(currentParcels, $feature))<1); } return true; //popup to check if parcels have Gaps (still under R&D - does not cover all use-cases) //Setting var GapTolerance = 10; //use minimal road/path width var GapUnit = 'feet'; var parcelsFS = FeatureSetByName($datastore, "Parcels",['RetiredByRecord'], true); var sql = "RetiredByRecord IS NULL"; var currentParcelsFS = Filter(parcelsFS, sql); var CountTolerance = Count(Overlaps(Buffer($feature,GapTolerance,GapUnit),currentParcelsFS)); var CountMin = Count(Overlaps(Buffer($feature,0.05,'feet'),currentParcelsFS)); return (CountMin==CountTolerance); //Attribute Rule Validation: CURRENT MUST NOT HAVE GAPS WITHIN //Setting var GapTolerance = 10; var GapUnit = 'feet'; var parcelsFS = FeatureSetByName($datastore, "Parcels",['RetiredByRecord'], true); var sql = "RetiredByRecord IS NULL"; var currentParcelsFS = Filter(parcelsFS, sql); var CountTolerance = Count(Overlaps(Buffer($feature,GapTolerance,GapUnit),currentParcelsFS)); var CountMin = Count(Overlaps(Buffer($feature,0.05,'feet'),currentParcelsFS)); return (CountMin==CountTolerance); // Constrain editing the 'sde.DEFAULT' version return !(GdbVersion($feature)=='sde.DEFAULT'); // find which groups a portal user belongs to. Returns an array. var myPortal = Portal("https://galileo.esri.com/portal/"); var currentUser = getuser(myPortal); return currentUser.groups