coordinator-editor.ko.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. // Licensed to Cloudera, Inc. under one
  2. // or more contributor license agreements. See the NOTICE file
  3. // distributed with this work for additional information
  4. // regarding copyright ownership. Cloudera, Inc. licenses this file
  5. // to you under the Apache License, Version 2.0 (the
  6. // "License"); you may not use this file except in compliance
  7. // with the License. You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. var Coordinator = function (vm, coordinator) {
  17. function changeTracker(objectToTrack, hashFunction) {
  18. hashFunction = hashFunction || ko.toJSON;
  19. var lastCleanState = ko.observable(hashFunction(objectToTrack));
  20. var result = {
  21. somethingHasChanged : ko.dependentObservable(function() {
  22. return hashFunction(objectToTrack) != lastCleanState()
  23. }),
  24. markCurrentStateAsClean : function() {
  25. lastCleanState(hashFunction(objectToTrack));
  26. }
  27. };
  28. return function() { return result }
  29. }
  30. var self = this;
  31. self.id = ko.observable(typeof coordinator.id != "undefined" && coordinator.id != null ? coordinator.id : null);
  32. self.uuid = ko.observable(typeof coordinator.uuid != "undefined" && coordinator.uuid != null ? coordinator.uuid : UUID());
  33. self.name = ko.observable(typeof coordinator.name != "undefined" && coordinator.name != null ? coordinator.name : "").extend({ trackChange: true });
  34. self.properties = ko.mapping.fromJS(typeof coordinator.properties != "undefined" && coordinator.properties != null ? coordinator.properties : {});
  35. self.variables = ko.mapping.fromJS(typeof coordinator.variables != "undefined" && coordinator.variables != null ? coordinator.variables : []);
  36. self.variablesUI = ko.observableArray(['parameter', 'input_path', 'output_path']);
  37. self.showAdvancedFrequencyUI = ko.observable(typeof coordinator.showAdvancedFrequencyUI != "undefined" && coordinator.showAdvancedFrequencyUI != null ? coordinator.showAdvancedFrequencyUI : false);
  38. self.workflowParameters = ko.mapping.fromJS(typeof coordinator.workflowParameters != "undefined" && coordinator.workflowParameters != null ? coordinator.workflowParameters : []);
  39. self.tracker = new changeTracker(self);
  40. self.isDirty = ko.computed(function () {
  41. return self.tracker().somethingHasChanged();
  42. });
  43. self._get_parameter = function(name) {
  44. var _param = $.grep(self.properties.parameters(), function(param) {
  45. return param.name() == name;
  46. });
  47. if (_param) {
  48. return _param[0];
  49. } else {
  50. return null;
  51. }
  52. }
  53. self.start_date = self._get_parameter('start_date');
  54. self.end_date = self._get_parameter('end_date');
  55. self.properties.startDateUI = ko.observable(typeof self.start_date.value() != "undefined" && self.start_date.value().indexOf("T") > -1 ? self.start_date.value().split("T")[0] : "");
  56. self.properties.startTimeUI = ko.observable(typeof self.start_date.value() != "undefined" && self.start_date.value().indexOf("T") > -1 ? self.start_date.value().split("T")[1] : "");
  57. self.properties.endDateUI = ko.observable(typeof self.end_date.value() != "undefined" && self.end_date.value().indexOf("T") > -1 ? self.end_date.value().split("T")[0] : "");
  58. self.properties.endTimeUI = ko.observable(typeof self.end_date.value() != "undefined" && self.end_date.value().indexOf("T") > -1 ? self.end_date.value().split("T")[1] : "");
  59. self.properties.startDateUI.subscribe(function(newVal){
  60. self.setStartDate();
  61. });
  62. self.properties.startTimeUI.subscribe(function(newVal){
  63. self.setStartDate();
  64. });
  65. self.properties.endDateUI.subscribe(function(newVal){
  66. self.setEndDate();
  67. });
  68. self.properties.endTimeUI.subscribe(function(newVal){
  69. self.setEndDate();
  70. });
  71. self.setStartDate = function() {
  72. self.start_date.value(self.properties.startDateUI() + "T" + self.properties.startTimeUI());
  73. }
  74. self.setEndDate = function() {
  75. self.end_date.value(self.properties.endDateUI() + "T" + self.properties.endTimeUI());
  76. }
  77. self.properties.workflow.subscribe(function(newVal) {
  78. if (newVal) {
  79. $.get("/oozie/editor/workflow/parameters/", {
  80. "uuid": self.properties.workflow(),
  81. }, function (data) {
  82. self.workflowParameters(data.parameters);
  83. // Pre-add the variables
  84. $.each(data.parameters, function(index, param) {
  85. if (self.variables().length < data.parameters.length) {
  86. self.addVariable();
  87. }
  88. self.variables()[self.variables().length - 1].workflow_variable(param['name']);
  89. });
  90. }).fail(function (xhr, textStatus, errorThrown) {
  91. $(document).trigger("error", xhr.responseText);
  92. });
  93. }
  94. });
  95. self.properties.cron_advanced.subscribe(function(value) {
  96. if (value || ! vm.isEditing()) {
  97. coordCron.disable();
  98. } else {
  99. coordCron.enable();
  100. }
  101. });
  102. self.addVariable = function() {
  103. var _var = {
  104. 'workflow_variable': '', // Variable we want to fill in the workflow
  105. 'dataset_type': 'parameter',
  106. 'uuid': UUID(), // Dataset
  107. 'dataset_variable': '', // Aka property or URI
  108. 'show_advanced': false,
  109. 'use_done_flag': false,
  110. 'done_flag': '_SUCCESS',
  111. 'timezone': 'America/Los_Angeles',
  112. 'same_timezone': true,
  113. 'instance_choice': 'default',
  114. 'is_advanced_start_instance': false,
  115. 'start_instance': '0',
  116. 'advanced_start_instance': '${coord:current(0)}',
  117. 'is_advanced_end_instance': false,
  118. 'advanced_end_instance': '${coord:current(0)}',
  119. 'end_instance': '0',
  120. 'same_frequency': true,
  121. 'frequency_number': 1,
  122. 'frequency_unit': 'days',
  123. 'start': new Date(),
  124. 'same_start': true,
  125. 'shared_dataset_uuid': '' // If reusing a shared dataset
  126. };
  127. var _koVar = ko.mapping.fromJS(_var);
  128. for (key in _koVar) {
  129. if (_koVar.hasOwnProperty(key) && ko.isObservable(_koVar[key])) {
  130. _koVar[key].extend({ trackChange: true });
  131. }
  132. }
  133. self.variables.push(_koVar);
  134. };
  135. }
  136. var CoordinatorEditorViewModel = function (coordinator_json, credentials_json, workflows_json, can_edit_json) {
  137. var self = this;
  138. self.canEdit = ko.mapping.fromJS(can_edit_json);
  139. self.isEditing = ko.observable(coordinator_json.id == null);
  140. self.isEditing.subscribe(function(newVal){
  141. $(document).trigger("editingToggled");
  142. self.coordinator.properties.cron_advanced.valueHasMutated();
  143. });
  144. self.toggleEditing = function () {
  145. self.isEditing(! self.isEditing());
  146. };
  147. self.workflows = ko.mapping.fromJS(workflows_json);
  148. self.coordinator = new Coordinator(self, coordinator_json);
  149. self.credentials = ko.mapping.fromJS(credentials_json);
  150. self.availableTimezones = ko.observableArray(["Africa/Abidjan","Africa/Accra","Africa/Addis_Ababa","Africa/Algiers","Africa/Asmara","Africa/Asmera","Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau","Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Douala","Africa/El_Aaiun","Africa/Freetown","Africa/Gaborone","Africa/Harare","Africa/Johannesburg","Africa/Juba","Africa/Kampala","Africa/Khartoum","Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda","Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo","Africa/Sao_Tome","Africa/Timbuktu","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Anguilla","America/Antigua","America/Araguaina","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/ComodRivadavia","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Aruba","America/Asuncion","America/Atikokan","America/Atka","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Buenos_Aires","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Catamarca","America/Cayenne","America/Cayman","America/Chicago","America/Chihuahua","America/Coral_Harbour","America/Cordoba","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Ensenada","America/Fort_Wayne","America/Fortaleza","America/Glace_Bay","America/Godthab","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Indianapolis","America/Inuvik","America/Iqaluit","America/Jamaica","America/Jujuy","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/Knox_IN","America/Kralendijk","America/La_Paz","America/Lima","America/Los_Angeles","America/Louisville","America/Lower_Princes","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Mendoza","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montreal","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Rosario","America/Santa_Isabel","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Shiprock","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Virgin","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Beijing","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Calcutta","Asia/Choibalsan","Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Gaza","Asia/Harbin","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Katmandu","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh","Asia/Riyadh87","Asia/Riyadh88","Asia/Riyadh89","Asia/Saigon","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu","Asia/Thimphu","Asia/Tokyo","Asia/Ujung_Pandang","Asia/Ulaanbaatar","Asia/Ulan_Bator","Asia/Urumqi","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe","Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley","Australia/ACT","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/LHI","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/NSW","Australia/North","Australia/Perth","Australia/Queensland","Australia/South","Australia/Sydney","Australia/Tasmania","Australia/Victoria","Australia/West","Australia/Yancowinna","Brazil/Acre","Brazil/DeNoronha","Brazil/East","Brazil/West","CET","CST6CDT","Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan","Canada/Eastern","Canada/Mountain","Canada/Newfoundland","Canada/Pacific","Canada/Saskatchewan","Canada/Yukon","Chile/Continental","Chile/EasterIsland","Cuba","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT","Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11","Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5","Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0","Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12","Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3","Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8","Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC","Etc/Universal","Etc/Zulu","Europe/Amsterdam","Europe/Andorra","Europe/Athens","Europe/Belfast","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Nicosia","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Tiraspol","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Factory","GB","GB-Eire","GMT","GMT+0","GMT+1","GMT+10","GMT+11","GMT+12","GMT+13","GMT+14","GMT+2","GMT+3","GMT+4","GMT+5","GMT+6","GMT+7","GMT+8","GMT+9","GMT-0","GMT-1","GMT-10","GMT-11","GMT-12","GMT-2","GMT-3","GMT-4","GMT-5","GMT-6","GMT-7","GMT-8","GMT-9","GMT0","Greenwich","HST","Hongkong","Iceland","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Iran","Israel","Jamaica","Japan","Kwajalein","Libya","MET","MST","MST7MDT","Mexico/BajaNorte","Mexico/BajaSur","Mexico/General","Mideast/Riyadh87","Mideast/Riyadh88","Mideast/Riyadh89","NZ","NZ-CHAT","Navajo","PRC","PST8PDT","Pacific/Apia","Pacific/Auckland","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap","Poland","Portugal","ROC","ROK","Singapore","Turkey","UCT","US/Alaska","US/Aleutian","US/Arizona","US/Central","US/East-Indiana","US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan","US/Mountain","US/Pacific","US/Pacific-New","US/Samoa","Universal","W-SU","WET","Zulu"]);
  151. self.availableSettings = ko.observableArray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60]);
  152. if (coordinator_json.id == null && self.coordinator.properties.workflow()) {
  153. self.coordinator.properties.workflow.valueHasMutated();
  154. }
  155. self.workflowModalFilter = ko.observable("");
  156. self.filteredModalWorkflows = ko.computed(function() {
  157. var _filter = self.workflowModalFilter().toLowerCase();
  158. if (! _filter) {
  159. return self.workflows();
  160. }
  161. else {
  162. return ko.utils.arrayFilter(self.workflows(), function(wf) {
  163. return wf.name().toLowerCase().indexOf(_filter.toLowerCase()) > -1;
  164. });
  165. }
  166. }, self);
  167. self.getWorkflowById = function (uuid) {
  168. var _wfs = ko.utils.arrayFilter(self.workflows(), function(wf) {
  169. return wf.uuid() == uuid;
  170. });
  171. if (_wfs.length > 0){
  172. return _wfs[0];
  173. }
  174. return null;
  175. }
  176. self.save = function () {
  177. $(".jHueNotify").hide();
  178. $.post("/oozie/editor/coordinator/save/", {
  179. "coordinator": ko.mapping.toJSON(self.coordinator)
  180. }, function (data) {
  181. if (data.status == 0) {
  182. self.coordinator.id(data.id);
  183. self.coordinator.tracker().markCurrentStateAsClean();
  184. $(document).trigger("info", data.message);
  185. if (window.location.search.indexOf("coordinator") == -1) {
  186. window.location.hash = '#coordinator=' + data.id;
  187. }
  188. }
  189. else {
  190. $(document).trigger("error", data.message);
  191. }
  192. }).fail(function (xhr, textStatus, errorThrown) {
  193. $(document).trigger("error", xhr.responseText);
  194. });
  195. };
  196. self.gen_xml = function () {
  197. $(".jHueNotify").hide();
  198. logGA('gen_xml');
  199. $.post("/oozie/editor/coordinator/gen_xml/", {
  200. "coordinator": ko.mapping.toJSON(self.coordinator)
  201. }, function (data) {
  202. if (data.status == 0) {
  203. console.log(data.xml);
  204. }
  205. else {
  206. $(document).trigger("error", data.message);
  207. }
  208. }).fail(function (xhr, textStatus, errorThrown) {
  209. $(document).trigger("error", xhr.responseText);
  210. });
  211. };
  212. self.showSubmitPopup = function () {
  213. $(".jHueNotify").hide();
  214. $.get("/oozie/editor/coordinator/submit/" + self.coordinator.id(), {
  215. }, function (data) {
  216. $(document).trigger("showSubmitPopup", data);
  217. }).fail(function (xhr, textStatus, errorThrown) {
  218. $(document).trigger("error", xhr.responseText);
  219. });
  220. };
  221. };
  222. function logGA(page) {
  223. if (typeof trackOnGA == 'function') {
  224. trackOnGA('oozie/editor/coordinator/' + page);
  225. }
  226. }