Update Lifecycle Status
UpdateLifecycleStatus.mxml
<?xml version="1.0" encoding="utf-8"?> <!-- //////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2008-2015 Esri // // All rights reserved under the copyright laws of the United States // and applicable international laws, treaties, and conventions. // // You may freely redistribute and use this software, with or without // modification, provided you include the original copyright and use // restrictions. See use restrictions in the file use_restrictions.txt. // //////////////////////////////////////////////////////////////////////////////// --> <s:Application minHeight="400" minWidth="600" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:drs="com.esri.drs.*" pageTitle="DRS Reviewer Results Update Lifecycle Status Sample"> <fx:Declarations> <!-- Create a Reviewer Results task and configure its URL and event handlers --> <drs:ReviewerResultsTask id="resultTask" url="{_soeUrl}" getResultsComplete="resultTask_getResultsCompleteHandler(event)" getReviewerSessionsComplete="resultTask_getReviewerSessionsCompleteHandler(event)" updateLifecycleStatusComplete="resultTask_updateLifecycleStatusCompleteHandler(event)" fault="faultHandler(event)" showBusyCursor="true" disableClientCaching="true"/> </fx:Declarations> <fx:Script> <![CDATA[ import com.esri.ags.FeatureSet; import com.esri.ags.layers.supportClasses.FeatureEditResult; import com.esri.drs.DataReviewerTaskEvent; import com.esri.drs.GetResultsQueryParameters; import com.esri.drs.Lifecycle; import com.esri.drs.ReviewerFilters; import com.esri.drs.ReviewerResultsTask; import com.esri.drs.ReviewerSession; import mx.collections.ArrayCollection; import mx.collections.ArrayList; import mx.controls.Alert; import mx.core.IFlexDisplayObject; import mx.events.CloseEvent; import mx.events.FlexEvent; import mx.managers.PopUpManager; import mx.rpc.Fault; import mx.rpc.events.FaultEvent; import spark.components.gridClasses.GridColumn; private var statusWindow:IFlexDisplayObject; private var popUp:UpdateStatus; // use this as the data grid's data provider [Bindable]private var _resultList:ArrayList = new ArrayList(); //RevTableFields object. Add any custom fields if required [Bindable]private var _fieldList:ArrayList = new ArrayList([{ data: 'correctionTechnician', label: 'Correction Technician' }, { data: 'verificationTechnician', label: 'Verification Technician' }, { data: 'correctionDateUtc', label: 'Correction Date' }, { data: 'verificationDateUtc', label: 'Verification Date' }, { data: 'objectId', label: 'Object Id' }, { data: 'category', label: 'Category' }, { data: 'checktitle', label: 'Checktitle' }, { data: 'resourceName', label: 'Resource Name' }, { data: 'subtype', label: 'Subtype' }, { data: 'checkName', label: 'Check Name' }, { data: 'notes', label: 'Notes' }, { data: 'severity', label: 'Severity' }, { data: 'reviewStatus', label: 'Review Status' }, { data: 'reviewTechnician', label: 'Review Technician' }, { data: 'reviewDateUtc', label: 'Review Date' }]); private var _reviewerSessionsDP:ArrayCollection = new ArrayCollection(); //Amazon instance for Data Reviewer Server. Change to your Data Reviewer Server SOE URL to run this sample in your environment private var _soeUrl:String = "http://datareviewer.arcgisonline.com/arcgis/rest/services/Samples/reviewerWriteResults/MapServer/exts/DataReviewerServer"; //Array of return field names private var _selectedFieldNames:Array = new Array("recordId","sessionId","lifecycleStatus"); //label function for displaying date as string instead of epoch value private function setCorrectionUtctoLocalDate(item:Object, column:GridColumn):String { if (item.correctionDateUtc == null) return null; var date:Date = new Date(item.correctionDateUtc); var localDate:Date = new Date(date.toLocaleString()); return localDate.toDateString(); } // Handles click event for Get Reviewer Results button private function getData_clickHandler(event:MouseEvent):void { if (returnFieldNamesList.selectedItems.length == 0 || txtRecords.text.length == 0 || selectSession.selectedItem == undefined) { Alert.show("Please fill out Get Results inputs"); return; } //Display first page displayGrid(1) } private function previousButton_clickHandler(event:MouseEvent):void { //decrement page number var pageNum:int = 1; if (int(pageNumberLabel.text) > 1) pageNum = (int(pageNumberLabel.text) - 1); var queryParameters:GetResultsQueryParameters = getQueryParamters(pageNum) var revFilters:ReviewerFilters = new ReviewerFilters(); revFilters.addAttributeFilter("SESSIONID", int(selectSession.selectedItem.name)) //get results using the ReviewerResultsTask resultTask.getResults(queryParameters, revFilters); //enable next button nextButton.enabled = true; } private function nextButton_clickHandler(event:MouseEvent):void { //increment page number var pageNum:int = 0; pageNum = (int(pageNumberLabel.text) + 1); var queryParameters:GetResultsQueryParameters = getQueryParamters(pageNum) var revFilters:ReviewerFilters = new ReviewerFilters(); revFilters.addAttributeFilter("SESSIONID", int(selectSession.selectedItem.name)) //get results using the ReviewerResultsTask resultTask.getResults(queryParameters, revFilters); } private function updateStatus_clickHandler(event:MouseEvent):void { if (grid.selectedItems == null || grid.selectedItems.length == 0) { Alert.show("Please select records from the grid"); return; } var selectedItem:Vector.<Object> = grid.selectedItems; var lifecycleList:Array = new Array(); var lifecycleStatusString:String = ""; //only push unique status in the Array for (var i:int = 0; i < selectedItem.length; i++) { if (lifecycleList.indexOf(selectedItem[i].lifecycleStatus) == -1) { lifecycleList.push(selectedItem[i].lifecycleStatus); } } lifecycleList.sort(); //get lifecycle information from the Lifecycle helper class var lifecycleHelperClass:Lifecycle = new Lifecycle(); var lifecycleInfo:Object = lifecycleHelperClass.getLifecycleInfo(lifecycleList); // create a array collection of next options of lifecycle status for selected records var lifecycleStatus:ArrayCollection = new ArrayCollection(); if (lifecycleInfo != null) { for each (var status:int in lifecycleInfo.nextLifecycleStatus) { lifecycleStatus.addItem({ name: status, label: lifecycleHelperClass.toLifecycleStatusString(status)}); } } else { Alert.show("The selected records cannot be updated to a common lifecycle status"); return; } // create popup statusWindow = PopUpManager.createPopUp(this, UpdateStatus, true); popUp = UpdateStatus(statusWindow); // set the next option of lifecycle status to the data provider of pick list in the popup popUp.lifecycleStatus = lifecycleStatus; popUp.addEventListener(CloseEvent.CLOSE, function(evt:CloseEvent) { if (popUp.revTechnician.text != "") { UpdateLifeCycleStatus(int(popUp.lifecycleStatusList.selectedItem.name), popUp.revTechnician.text.toString()); } }); } //handler for updateLifecycleStatus completed event private function resultTask_updateLifecycleStatusCompleteHandler(event:DataReviewerTaskEvent):void { displayGrid(int(pageNumberLabel.text)); PopUpManager.removePopUp(popUp); for each(var resultObject:FeatureEditResult in event.result.updateResults) { if (resultObject.success==false) { Alert.show("Error updating records from the selection"); return; } } Alert.show("Lifecycle Staus updated"); } //handler for getReviewerSessions completed event private function resultTask_getReviewerSessionsCompleteHandler(event:DataReviewerTaskEvent):void { var reviewerSessionsList:Object = resultTask.getReviewerSessionsLastResult; if (_reviewerSessionsDP != null && reviewerSessionsList != null) { _reviewerSessionsDP.removeAll(); for each (var revSession:ReviewerSession in reviewerSessionsList) { _reviewerSessionsDP.addItem({ name: revSession.sessionId, label: revSession.sessionName }); } } } // Handles the ReviewerResultsTask getResults completed event private function resultTask_getResultsCompleteHandler(event:DataReviewerTaskEvent):void { var result:FeatureSet = event.result as FeatureSet; if (result == null) { currentState = "error"; errorMsg.text = "Null FeatureSet returned"; } //create an arraylist of attributes in the non-spatial featureset else { _resultList = new ArrayList(result.attributes); currentState = "data"; } } //Handles fault private function faultHandler(event:FaultEvent, token:* = null):void { var fault:Fault = event.fault; var msg:String = fault.faultString; if (fault.content != null && fault.content as Array != null) msg = fault.content[1].message; //handle the last page error if (msg != null && msg.search("No results returned for specified query") >= 0 && int(pageNumberLabel.text) > 1) { Alert.show("You are already at last page"); pageNumberLabel.text = (int(pageNumberLabel.text) - 1).toString(); nextButton.enabled = false; } else if (msg != null && msg.search("No results returned for specified query") >= 0) { msg="No results returned for the selected Session" errorMsg.text = "Error: " + msg; currentState = "error"; } else { errorMsg.text = "Error: " + msg; currentState = "error"; } } //label function for date and lifecycle status columns private function gridLabelFunction(item:Object, column:GridColumn):String { var dataField:String=column.dataField.toString(); if (dataField=="lifecycleStatus") { var lifecycleString:Lifecycle = new Lifecycle(); if (item.lifecycleStatus==null) return null; return lifecycleString.toLifecycleStatusString(int(item.lifecycleStatus)); } else if (dataField=="verificationDateUtc" || dataField=="correctionDateUtc" || dataField=="reviewDateUtc") { var dateValue:Object=null; if (dataField=="verificationDateUtc") dateValue=item.verificationDateUtc; else if (dataField=="correctionDateUtc") dateValue=item.correctionDateUtc; else if (dataField=="reviewDateUtc") dateValue=item.reviewDateUtc; if (dateValue=="" || dateValue==null) return null; var date:Date = new Date(dateValue); var localDate:Date = new Date(date.toLocaleString()); return localDate.toDateString(); } else { var colName:String=column.dataField; return item[colName]; } } // display grid private function displayGrid(pageNumber:int):void { currentState = "data"; _selectedFieldNames = []; var columns:ArrayList = new ArrayList(); //get selected indices from the list var selectedIndices:Vector.<int> = returnFieldNamesList.selectedIndices; selectedIndices.sort(Array.NUMERIC); //add mandatory columns to the grid var gridCol:GridColumn = new GridColumn("Record Id"); gridCol.dataField="recordId"; _selectedFieldNames.push("recordId"); columns.addItem(gridCol); gridCol.width = 120; gridCol = new GridColumn("Session Id"); gridCol.dataField="sessionId"; columns.addItem(gridCol); gridCol.width = 120; _selectedFieldNames.push("sessionId"); gridCol = new GridColumn("Lifecycle Status"); gridCol.dataField="lifecycleStatus"; gridCol.width = 120; columns.addItem(gridCol); gridCol.labelFunction = gridLabelFunction; _selectedFieldNames.push("lifecycleStatus"); //Create data grid columns and set field names array based on field names selected for (var i:int = 0; i < selectedIndices.length; i++) { gridCol = new GridColumn(returnFieldNamesList.dataProvider.getItemAt(selectedIndices[i]).label); gridCol.dataField = returnFieldNamesList.dataProvider.getItemAt(selectedIndices[i]).data; _selectedFieldNames.push(returnFieldNamesList.dataProvider.getItemAt(selectedIndices[i]).data); gridCol.width = 120; gridCol.labelFunction = gridLabelFunction; columns.addItem(gridCol); } grid.columns = columns; //get query paramters. Display firt page by default var queryParameters:GetResultsQueryParameters = getQueryParamters(pageNumber); //get results using the ReviewerResultsTask var filterArray:ReviewerFilters = new ReviewerFilters(); filterArray.addAttributeFilter("SESSIONID", int(selectSession.selectedItem.name)); resultTask.getResults(queryParameters, filterArray); } private function getQueryParamters(pageNumber:int):GetResultsQueryParameters { //create query parameters var queryParameters:GetResultsQueryParameters = new GetResultsQueryParameters(); //set the number of results to be displayed queryParameters.pageSize = int(txtRecords.text); //Mandatory //set the page number of the results. Zero based index queryParameters.pageNumber = pageNumber - 1; //Mandatory queryParameters.returnFields = _selectedFieldNames; //Optional //set page number pageNumberLabel.text = pageNumber.toString(); return queryParameters; } // updates lifecycle status of selected records private function UpdateLifeCycleStatus(lifecycleStatus:int, technicianName:String):void { var revFilters:ReviewerFilters = new ReviewerFilters(); for each (var selectedItem:Object in grid.selectedItems) { revFilters.addAttributeFilter("RECORDID", parseInt(selectedItem.recordId)); } resultTask.updateLifecycleStatus(int(selectSession.selectedItem.name), lifecycleStatus, technicianName, revFilters) } ]]> </fx:Script> <!-- Data Reviewer provides the ability to retrieve Reviewer results and display in a tabular view. Each reviewer result has a life cycle status value that describes the result's state within the Reviewer quality control workflow. This sample demonstrates updating lifecycle status using the updateLifecycleStatus method in ReviewerResultsTask. --> <s:states> <s:State name="normal"/> <s:State name="data"/> <s:State name="error"/> </s:states> <s:controlBarContent> <s:Label width="100%" text="The following sample retrieves Reviewer results from an ArcGIS Data Reviewer for Server hosted on Amazon. Lifecycle status can be updated by selecting records from the grif. To run the sample against your own Data Reviewer Server, see comments in code for _soeUrl variable."/> </s:controlBarContent> <s:Scroller width="100%" height="100%"> <s:VGroup width="100%" paddingLeft="20" paddingRight="20"> <s:Form width="30%"> <s:layout> <s:FormLayout gap="-5"/> </s:layout> <s:FormHeading label="Get Reviewer Results with Paging"/> <s:FormItem label="Records per page: "> <s:TextInput id="txtRecords" width="100%" toolTip="Valid values from 1 to 1000" restrict="0-9" prompt="Number of records per page"/> </s:FormItem> <s:FormItem label="Session Name: "> <s:DropDownList id="selectSession" width="100%" dataProvider="{_reviewerSessionsDP}" creationComplete="resultTask.getReviewerSessions();" prompt="Select Session"> </s:DropDownList> </s:FormItem> <s:FormItem label="Return Fields: "> <s:List id="returnFieldNamesList" width="100%" height="150" allowMultipleSelection="true" dataProvider="{_fieldList}"/> </s:FormItem> <s:FormItem> <s:layout> <s:HorizontalLayout horizontalAlign="right"/> </s:layout> <s:Button id="getData" height="25" label="Get Results" click="getData_clickHandler(event)"/> </s:FormItem> </s:Form> <s:Spacer height="30"/> <!--Paging results--> <s:HGroup includeIn="data"> <s:Button id="previousButton" width="40" height="25" label="<" click="previousButton_clickHandler(event)"/> <s:Label id="pageNumberLabel" verticalAlign="bottom"> 1 </s:Label> <s:Button id="nextButton" width="40" height="25" label=">" click="nextButton_clickHandler(event)"/> <s:Button id="updateStatus" width="140" height="25" label="Update Status" click="updateStatus_clickHandler(event)"/> </s:HGroup> <!--Data grid containing results--> <s:Scroller id="groupGrid" width="100%" includeIn="data"> <s:VGroup paddingLeft="20" paddingRight="20"> <s:DataGrid id="grid" dataProvider="{_resultList}" horizontalScrollPolicy="auto" verticalScrollPolicy="auto" selectionMode="multipleRows"> </s:DataGrid> </s:VGroup> </s:Scroller> <!-- Error message --> <s:HGroup id="error" color="red" horizontalAlign="center" paddingTop="20" includeIn="error" itemCreationPolicy="immediate"> <s:Label id="errorMsg" fontSize="15" text="Error"/> </s:HGroup> </s:VGroup> </s:Scroller> </s:Application>
Copyright © 1995-2015 Esri. All rights reserved.
2/23/2015