소스 검색

HPCC-9868 - Create Event Scheduler Workunits Widget

Allow the ability for users to view scheduled workunits and the ability
to deschedule them.

Signed-off-by: Miguel Vazquez
<miguel.vazquez@lexisnexis.com>
Miguel Vazquez 11 년 전
부모
커밋
cb01666d6b

+ 267 - 0
esp/files/scripts/EventScheduleWorkunitWidget.js

@@ -0,0 +1,267 @@
+/*##############################################################################
+#    HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+############################################################################## */
+define([
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/i18n",
+    "dojo/i18n!./nls/common",
+    "dojo/i18n!./nls/EventScheduleWorkunitWidget",
+    "dojo/dom",
+    "dojo/dom-form",
+    "dojo/_base/array",
+    "dojo/on",
+
+    "dijit/registry",
+    "dijit/Menu",
+    "dijit/MenuItem",
+
+    "dgrid/Grid",
+    "dgrid/Keyboard",
+    "dgrid/Selection",
+    "dgrid/selector",
+    "dgrid/extensions/ColumnResizer",
+    "dgrid/extensions/DijitRegistry",
+    "dgrid/extensions/Pagination",
+
+    "hpcc/_TabContainerWidget",
+    "hpcc/TargetSelectWidget",
+    "hpcc/WUDetailsWidget",
+    "hpcc/WsWorkunits",
+    "hpcc/ESPUtil",
+    "hpcc/FilterDropDownWidget",
+
+    "dojo/text!../templates/EventScheduleWorkunitWidget.html",
+
+    "dijit/layout/BorderContainer",
+    "dijit/layout/TabContainer",
+    "dijit/layout/ContentPane",
+    "dijit/Toolbar",
+    "dijit/form/Form",
+    "dijit/form/Button",
+    "dijit/ToolbarSeparator",
+    "dijit/form/TextBox",
+    "dijit/form/DropDownButton",
+    "dijit/TooltipDialog",
+
+    "dojox/layout/TableContainer"
+], function (declare, lang, i18n, nlsCommon, nlsSpecific, dom, domForm, arrayUtil, on,
+                registry, Menu, MenuItem,
+                Grid, Keyboard, Selection, selector, ColumnResizer, DijitRegistry, Pagination,
+                _TabContainerWidget, TargetSelectWidget, WUDetailsWidget, WsWorkunits, ESPUtil, FilterDropDownWidget,
+                template) {
+    return declare("EventScheduleWorkunitWidget", [_TabContainerWidget], {
+        i18n: lang.mixin(nlsCommon, nlsSpecific),
+        templateString: template,
+        baseClass: "EventScheduleWorkunitWidget",
+
+        eventTab: null,
+        eventGrid: null,
+        filter: null,
+        clusterTargetSelect: null,
+
+        postCreate: function (args) {
+            this.inherited(arguments);
+            this.filter = registry.byId(this.id + "Filter");
+            this.eventTab = registry.byId(this.id + "_EventScheduledWorkunits");
+            this.clusterTargetSelect = registry.byId(this.id + "ClusterTargetSelect");
+        },
+
+        startup: function (args) {
+            this.inherited(arguments);
+            this.initContextMenu();
+        },
+
+        init: function (params) {
+            var context = this;
+            if (this.inherited(arguments))
+                return;
+
+            this.clusterTargetSelect.init({
+                Targets: true,
+                includeBlank: true,
+                Target: params.Cluster
+            });
+            this.initEventGrid();
+            this.selectChild(this.eventTab, true);
+
+            this.filter.on("clear", function (evt) {
+                context.refreshGrid();
+            });
+            this.filter.on("apply", function (evt) {
+                context.refreshGrid();
+            });
+        },
+
+        initTab: function () {
+            var currSel = this.getSelectedChild();
+            if (currSel && !currSel.initalized) {
+                if (currSel.id == this.eventTab.id) {
+                } else {
+                    currSel.init(currSel.params);
+                }
+            }
+        },
+
+         addMenuItem: function (menu, details) {
+            var menuItem = new MenuItem(details);
+            menu.addChild(menuItem);
+            return menuItem;
+        },
+
+        initContextMenu: function ( ) {
+            var context = this;
+            var pMenu = new Menu({
+                targetNodeIds: [this.id + "EventGrid"]
+            });
+             this.menuOpen = this.addMenuItem(pMenu, {
+                label: this.i18n.Open,
+                onClick: function () { context._onOpen(); }
+            });
+            this.menuDeschedule = this.addMenuItem(pMenu, {
+                label: this.i18n.Deschedule,
+                onClick: function () { context._onDeschedule(); }
+            });
+            pMenu.startup();
+        },
+
+        initEventGrid: function (params) {
+            var context = this;
+            var store = WsWorkunits.CreateEventScheduleStore();
+            this.eventGrid = new declare([Grid, Pagination, Selection, ColumnResizer, Keyboard, DijitRegistry, ESPUtil.GridHelper])({
+                allowSelectAll: true,
+                deselectOnRefresh: false,
+                store: store,
+                query: this.getFilter(),
+                rowsPerPage: 50,
+                pagingLinks: 1,
+                pagingTextBox: true,
+                firstLastArrows: true,
+                pageSizeOptions: [25, 50, 100],
+                columns: {
+                    col1: selector({ width: 27, selectorType: 'checkbox' }),
+                    Wuid: {
+                        label: this.i18n.Workunit, width: 180, sortable: true,
+                        formatter: function (Wuid) {
+                            return "<a href='#' class='" + context.id + "WuidClick'>" + Wuid + "</a>";
+                        }
+
+                    },
+                    Cluster: { label: this.i18n.Cluster, width: 108, sortable: true },
+                    JobName: { label: this.i18n.JobName, sortable: true },
+                    EventName: { label: this.i18n.EventName, width: 90, sortable: true },
+                    EventText: { label: this.i18n.EventText, sortable: true }
+                }
+            },
+            this.id + "EventGrid");
+            this.eventGrid.set("noDataMessage", "<span class='dojoxGridNoData'>" + this.i18n.NoScheduledEvents + "</span>");
+
+            on(document, "." + context.id + "WuidClick:click", function (evt) {
+                if (context._onRowDblClick) {
+                    var item = context.eventGrid.row(evt).data;
+                    context._onRowDblClick(item);
+                }
+            });
+            this.eventGrid.on(".dgrid-row:dblclick", function (evt) {
+                if (context._onRowDblClick) {
+                    var item = context.eventGrid.row(evt).data;
+                    context._onRowDblClick(item);
+                }
+            });
+            this.eventGrid.on(".dgrid-row:contextmenu", function (evt) {
+                if (context._onRowContextMenu) {
+                    var item = context.eventGrid.row(evt).data;
+                    var cell = context.eventGrid.cell(evt);
+                    var colField = cell.column.field;
+                    var mystring = "item." + colField;
+                    context._onRowContextMenu(item, colField, mystring);
+                }
+            });
+            this.eventGrid.onSelectionChanged(function (event) {
+                context.refreshActionState();
+            });
+            this.eventGrid.onContentChanged(function (object, removedFrom, insertedInto) {
+                context.refreshActionState();
+            });
+            this.eventGrid.startup();
+            this.refreshActionState();
+        },
+
+        refreshActionState: function () {
+            var selection = this.eventGrid.getSelected();
+            var hasSelection = selection.length > 0;
+            registry.byId(this.id + "Deschedule").set("disabled", !hasSelection);
+            registry.byId(this.id + "Open").set("disabled", !hasSelection);
+        },
+
+        _onRefresh: function (params) {
+            this.refreshGrid();
+        },
+
+        _onOpen: function (event) {
+            var selections = this.eventGrid.getSelected();
+            var firstTab = null;
+            for (var i = selections.length - 1; i >= 0; --i) {
+                var tab = this.ensurePane(this.id + "_" + selections[i].Wuid, selections[i]);
+                if (i == 0) {
+                    firstTab = tab;
+                }
+            }
+            if (firstTab) {
+                this.selectChild(firstTab, true);
+            }
+        },
+
+        _onDeschedule: function (event) {
+            if (confirm(this.i18n.DescheduleSelectedWorkunits)) {
+                var context = this;
+                var selection = this.eventGrid.getSelected();
+                WsWorkunits.WUAction(selection, "Deschedule").then(function (response) {
+                    context.refreshGrid(response);
+                });
+            }
+        },
+
+        refreshGrid: function (args) {
+            this.eventGrid.set("query", this.getFilter());
+        },
+
+        _onRowDblClick: function (item) {
+            var wuTab = this.ensurePane(this.id + "_" + item.Wuid, item);
+            this.selectChild(wuTab);
+        },
+
+        getFilter: function(){
+            return this.filter.toObject();
+        },
+
+        ensurePane: function (id, params) {
+            id = id.split(".").join("x");
+            var retVal = registry.byId(id);
+            if (!retVal) {
+                retVal = new WUDetailsWidget({
+                    id: id,
+                    title: params.Wuid,
+                    closable: true,
+                    params: {
+                        Wuid: params.Wuid
+                    }
+                });
+                this.addChild(retVal, 1);
+            }
+            return retVal;
+        }
+    });
+});

+ 3 - 1
esp/files/scripts/HPCCPlatformMainWidget.js

@@ -25,10 +25,12 @@ define([
     "dojo/text!../templates/HPCCPlatformMainWidget.html",
 
     "dijit/layout/BorderContainer",
+    "dijit/layout/TabContainer",
     "dijit/layout/ContentPane",
 
     "hpcc/ActivityWidget",
-    "hpcc/SearchResultsWidget"
+    "hpcc/SearchResultsWidget",
+    "hpcc/EventScheduleWorkunitWidget"
 
 ], function (declare, lang, i18n, nlsCommon, nlsSpecific,
                 _TabContainerWidget,

+ 17 - 1
esp/files/scripts/WsWorkunits.js

@@ -20,11 +20,18 @@ define([
     "dojo/_base/Deferred",
     "dojo/promise/all",
     "dojo/store/Observable",
-    
+
     "hpcc/ESPRequest"
 ], function (declare, lang, arrayUtil, Deferred, all, Observable,
     ESPRequest) {
 
+    var EventScheduleStore = declare([ESPRequest.Store], {
+            service: "WsWorkunits",
+            action: "WUShowScheduled",
+            responseQualifier: "WUShowScheduledResponse.Workunits.ScheduledWU",
+            idProperty: "Wuid"
+    });
+
     return {
         States: {
             0: "unknown",
@@ -70,6 +77,10 @@ define([
             return ESPRequest.send("WsWorkunits", "WUGetZAPInfo", params);
         },
 
+        WUShowScheduled: function (params) {
+            return ESPRequest.send("WsWorkunits", "WUShowScheduled", params);
+        },
+
         WUQuerysetAliasAction: function (selection, action) {
             var requests = [];
             arrayUtil.forEach(selection, function (item, idx) {
@@ -257,6 +268,11 @@ define([
             }
             return deferred.promise;
         },
+        
+        CreateEventScheduleStore: function (options) {
+            var store = new EventScheduleStore(options);
+            return Observable(store);
+        },
 
         //  Helpers  ---
         isComplete: function (stateID, actionEx) {

+ 26 - 0
esp/files/scripts/nls/EventScheduleWorkunitWidget.js

@@ -0,0 +1,26 @@
+define({ root:
+//begin v1.x content
+({
+    title: "Event Scheduler",
+    Apply: "Apply",
+    Clear: "Clear",
+    Cluster: "Cluster",
+    ClusterPH: "r?x*",
+    Deschedule: "Deschedule",
+    DescheduleSelectedWorkunits: "Deschedule Selected Workunits?",
+    EventName: "Event Name",
+    EventNamePH: "eventname",
+    EventText: "Event Text",
+    Filter: "Filter",
+    JobName: "Job Name",
+    NoScheduledEvents: "No Scheduled Events.",
+    Open: "Open",
+    OpenInNewPage: "Open In New Page",
+    Refresh: "Refresh",
+    Workunit: "Workunit"
+})
+//end v1.x content
+,
+"es": true,
+"zh": true
+});

+ 2 - 2
esp/files/scripts/nls/HPCCPlatformMainWidget.js

@@ -2,9 +2,9 @@ define({ root:
 //begin v1.x content
 ({
     title: "HPCC Platform - Home",
-
     Activity: "Activity",
-    SearchResults: "Search Results",
+    EventScheduler: "Event Scheduler",
+    SearchResults: "Search Results"
 })
 //end v1.x content
 ,

+ 21 - 0
esp/files/scripts/nls/es/EventScheduleWorkunitWidget.js

@@ -0,0 +1,21 @@
+define(
+({
+    title: "Event Scheduler",
+    Apply: "Apply",
+    Clear: "Clear",
+    Cluster: "Cluster",
+    ClusterPH: "r?x*",
+    Deschedule: "Deschedule",
+    DescheduleSelectedWorkunits: "Deschedule Selected Workunits?",
+    EventName: "Event Name",
+    EventNamePH: "eventname",
+    EventText: "Event Text",
+    Filter: "Filter",
+    JobName: "Job Name",
+    NoScheduledEvents: "No Scheduled Events.",
+    Open: "Open",
+    OpenInNewPage: "Open In New Page",
+    Refresh: "Refresh",
+    Workunit: "Workunit"
+})
+);

+ 2 - 2
esp/files/scripts/nls/es/HPCCPlatformMainWidget.js

@@ -1,8 +1,8 @@
 define(
 ({
     title: "HPCC Platform - Home",
-
     Activity: "Activity",
-    SearchResults: "Search Results",
+    EventScheduler: "Event Scheduler",
+    SearchResults: "Search Results"
 })
 );

+ 21 - 0
esp/files/scripts/nls/zh/EventScheduleWorkunitWidget.js

@@ -0,0 +1,21 @@
+define(
+({
+    title: "Event Scheduler",
+    Apply: "Apply",
+    Clear: "Clear",
+    Cluster: "Cluster",
+    ClusterPH: "r?x*",
+    Deschedule: "Deschedule",
+    DescheduleSelectedWorkunits: "Deschedule Selected Workunits?",
+    EventName: "Event Name",
+    EventNamePH: "eventname",
+    EventText: "Event Text",
+    Filter: "Filter",
+    JobName: "Job Name",
+    NoScheduledEvents: "No Scheduled Events.",
+    Open: "Open",
+    OpenInNewPage: "Open In New Page",
+    Refresh: "Refresh",
+    Workunit: "Workunit"
+})
+);

+ 2 - 2
esp/files/scripts/nls/zh/HPCCPlatformMainWidget.js

@@ -1,8 +1,8 @@
 define(
 ({
     title: "HPCC Platform - Home",
-
     Activity: "Activity",
-    SearchResults: "Search Results",
+    EventScheduler: "Event Scheduler",
+    SearchResults: "Search Results"
 })
 );

+ 24 - 0
esp/files/templates/EventScheduleWorkunitWidget.html

@@ -0,0 +1,24 @@
+<div class="${baseClass}">
+  <div id="${id}BorderContainer" class="${baseClass}BorderContainer" style="width: 100%; height: 100%" data-dojo-type="dijit.layout.BorderContainer">
+    <div id="${id}TabContainer" data-dojo-props="region: 'center', tabPosition: 'top'" style="width: 100%; height: 100%" data-dojo-type="dijit.layout.TabContainer">
+      <div id="${id}_EventScheduledWorkunits" style="width: 100%; height: 100%" data-dojo-props='title:"${i18n.title}"' data-dojo-type="dijit.layout.BorderContainer">
+        <div id="${id}QueryToolbar" class="topPanel" data-dojo-props="region: 'top'" data-dojo-type="dijit.Toolbar">
+          <div id="${id}Refresh" data-dojo-attach-event="onClick:_onRefresh" data-dojo-type="dijit.form.Button" data-dojo-props='iconClass:"iconRefresh"'>${i18n.Refresh}</div>
+          <span data-dojo-type="dijit.ToolbarSeparator"></span>
+          <div id="${id}Open" data-dojo-attach-event="onClick:_onOpen" data-dojo-type="dijit.form.Button">${i18n.Open}</div>
+          <div id="${id}Deschedule" data-dojo-attach-event="onClick:_onDeschedule" data-dojo-type="dijit.form.Button">${i18n.Deschedule}</div>
+          <span data-dojo-type="dijit.ToolbarSeparator"></span>
+          <div id="${id}Filter" data-dojo-type="FilterDropDownWidget">
+            <input id="${id}EventName" title="${i18n.EventName}:" name="EventName" colspan="2" data-dojo-props="trim: true, placeHolder:'${i18n.EventNamePH}'" data-dojo-type="dijit.form.TextBox" />
+            <input id="${id}ClusterTargetSelect" title="${i18n.Cluster}:" name="Cluster" colspan="2" data-dojo-props="trim:true, placeHolder:'${i18n.ClusterPH}'" data-dojo-type="TargetSelectWidget" />
+          </div>
+          <span data-dojo-type="dijit.ToolbarSeparator"></span>
+          <div id="${id}NewPage" class="right" data-dojo-attach-event="onClick:_onNewPage" data-dojo-props="iconClass:'iconNewPage', showLabel:false" data-dojo-type="dijit.form.Button">${i18n.OpenInNewPage}</div>
+        </div>
+        <div id="${id}GridCP" style="padding: 0px; border:0px; border-color:none; overflow: hidden" data-dojo-props="region: 'center'" data-dojo-type="dijit.layout.ContentPane">
+          <div id="${id}EventGrid"></div>
+        </div>
+      </div>
+    </div>
+  </div><!--end of border container-->
+</div>

+ 2 - 0
esp/files/templates/HPCCPlatformMainWidget.html

@@ -6,6 +6,8 @@
         <div id="${id}TabContainer" data-dojo-props="region: 'center', tabPosition: 'top'" style="width: 100%; height: 100%" data-dojo-type="dijit.layout.StackContainer">
             <div id="${id}_Activity" title="${i18n.Activity}" data-dojo-type="ActivityWidget">
             </div>
+            <div id="${id}_Event" title="${i18n.EventScheduler}" data-dojo-type="EventScheduleWorkunitWidget">
+            </div>
             <div id="${id}_Search" title="${i18n.SearchResults}" data-dojo-type="SearchResultsWidget">
             </div>
         </div>