Skip to content

Commit

Permalink
Df scheduler subscription required panel (#175)
Browse files Browse the repository at this point in the history
* DP-115 Add API call scheduling capabilities to platform

- Add subscription_required panel to Scheduler tab
  • Loading branch information
yaroslavmo committed Dec 20, 2019
1 parent 712fae6 commit 6605347
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 35 deletions.
85 changes: 55 additions & 30 deletions app/admin_components/adf-scheduler/dreamfactory-scheduler.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ angular.module('dfScheduler', ['ngRoute', 'dfUtility'])
$scope.$broadcast('toolbar:paginate:scheduler:destroy');
});

$scope.schedulerEnabled = false;
$scope.subscription_required = false;

// load data

$scope.apiData = null;
Expand All @@ -66,34 +69,55 @@ angular.module('dfScheduler', ['ngRoute', 'dfUtility'])

$scope.dataLoading = true;

// eventlist is loaded only as needed to improve user experience
var apis = ['scheduler', 'service_list'];
var errorFunc = function (error) {
var msg = 'There was an error loading data for the Scheduler tab. Please try refreshing your browser and logging in again.';
if (error && error.error && (error.error.code === 401 || error.error.code === 403)) {
msg = 'To use the Scheduler tab your role must allow GET access to system/scheduler. To create, update, or delete scheduled tasks you need POST, PUT, DELETE access to /system/scheduler and/or /system/scheduler/*.';
$location.url('/home');
}
var messageOptions = {
module: 'Scheduler',
provider: 'dreamfactory',
type: 'error',
message: msg
};
dfNotify.error(messageOptions);
};

dfApplicationData.getApiData(apis).then(
// first get system data to decide whether to load other data
dfApplicationData.getApiData(['system']).then(
function (response) {
var newApiData = {};
apis.forEach(function (value, index) {
newApiData[value] = response[index].resource ? response[index].resource : response[index];
angular.forEach(response[0].resource, function (value) {
if (value.name === 'scheduler') {
$scope.schedulerEnabled = true;
}
});
$scope.apiData = newApiData;
if (init) {
$scope.$broadcast('toolbar:paginate:scheduler:load');
if (!$scope.schedulerEnabled) {
// scheduler not enabled, disable UI
$scope.subscription_required = true;
/* Disable ability to navigate to create */
$scope.links[1].path = $scope.links[0].path;
} else {
// eventlist is loaded only as needed to improve user experience
var apis = ['scheduler', 'service_list'];

dfApplicationData.getApiData(apis).then(
function (response) {
var newApiData = {};
apis.forEach(function (value, index) {
newApiData[value] = response[index].resource ? response[index].resource : response[index];
});
$scope.apiData = newApiData;
if (init) {
$scope.$broadcast('toolbar:paginate:scheduler:load');
}
},
errorFunc
);
}
},
function (error) {
var msg = 'There was an error loading data for the Scheduler tab. Please try refreshing your browser and logging in again.';
if (error && error.error && (error.error.code === 401 || error.error.code === 403)) {
msg = 'To use the Scheduler tab your role must allow GET access to system/scheduler. To create, update, or delete scheduled tasks you need POST, PUT, DELETE access to /system/scheduler and/or /system/scheduler/*.';
$location.url('/home');
}
var messageOptions = {
module: 'Scheduler',
provider: 'dreamfactory',
type: 'error',
message: msg
};
dfNotify.error(messageOptions);
}
// error getting system data
errorFunc
).finally(function () {
$scope.dataLoading = false;
});
Expand All @@ -111,13 +135,14 @@ angular.module('dfScheduler', ['ngRoute', 'dfUtility'])
templateUrl: MOD_SCHEDULER_ASSET_PATH + 'views/df-manage-tasks.html',
link: function (scope, elem, attrs) {

angular.forEach(scope.apiData.service_list, function (svc) {
if (!svc.components) {
svc.components = ["", "*"];
}
});

scope.services = scope.apiData.service_list;
if ($rootScope.schedulerEnabled) {
angular.forEach(scope.apiData.service_list, function (svc) {
if (!svc.components) {
svc.components = ["", "*"];
}
});
scope.services = scope.apiData.service_list;
}

var ManagedTask = function (taskData) {

Expand Down
8 changes: 6 additions & 2 deletions app/admin_components/adf-scheduler/views/df-manage-tasks.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<div>

<div data-ng-hide="currentEditTask">
<div data-ng-hide="!schedulerEnabled || currentEditTask">

<!-- Section Header -->
<df-section-header data-title="'Manage Tasks'"></df-section-header>
Expand Down Expand Up @@ -96,9 +96,13 @@


<!-- Edit Role -->
<div data-ng-show="currentEditTask">
<div data-ng-show="schedulerEnabled && currentEditTask">
<df-task-details data-task-data="currentEditTask" data-new-task="false"
data-api-data="apiData"></df-task-details>
</div>

<div data-ng-if="subscription_required">
<br/><h4>This feature requires a DreamFactory GOLD product subscription.</h4> Email <a href="mailto:sales@dreamfactory.com" >sales@dreamfactory.com</a> or call +1-415-993-5877 for pricing information.
</div>

</div>
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<div> <div data-ng-hide="currentEditTask"> <!-- Section Header --> <df-section-header data-title="'Manage Tasks'"></df-section-header> <df-section-toolbar> <df-toolbar-paginate data-api="'scheduler'"></df-toolbar-paginate> <div class="btn-group btn-group-sm hidden-xs df-btn-group"> <button class="btn btn-default" data-ng-click="deleteSelectedTasks()" data-ng-disabled="selectedTasks.length === 0" title="Delete selected tasks"><i class="fa fa-fw fa-trash"></i></button> </div> <div style="clear: both"></div> </df-section-toolbar> <div data-ng-show="tasks.length === 0 && emptySectionOptions.active"> <df-empty-section></df-empty-section> </div> <div data-ng-show="tasks.length > 0"> <div> <div class="panel panel-default"> <table class="table table-responsive table-bordered table-striped table-hover table-condensed"> <thead> <th> </th> <th data-ng-class="order.orderBy === field.name ? 'df-th-selected' : ''" data-ng-click="orderOnSelect(field)" data-ng-repeat="field in fields"> <span class="df-th-text" style="white-space: nowrap">{{field.label}} <i style="margin-left: 5px;" data-ng-if="order.orderBy === field.name" class="fa" data-ng-class="order.orderBy === field.name && order.orderByReverse ? 'fa-caret-down' : 'fa-caret-up'"></i> </span> </th> </thead> <tbody> <tr data-ng-repeat="obj in tasks | orderObjectBy:order.orderBy:order.orderByReverse" class="repeated-item" class="repeated-item" data-ng-class="obj.__dfUI.selected ? 'danger' : ''"> <td style="width: 80px;"> <div class="cell-content"> <div class="checkbox" style="margin: 0"> <label> <input id="tasks_table_row_checkbox_{{obj.record.id}}" type="checkbox" data-ng-checked="obj.__dfUI.selected" data-ng-click="setSelected(obj)"> <div class="btn-group btn-group-xs"> <button id="tasks_table_row_delete_{{obj.record.id}}" type="button" class="btn btn-xs btn-default" data-ng-click="deleteTask(obj)" title="Delete Task"><i class="fa fa-trash"></i></button> </div> </label> </div> </div> </td> <td id="tasks_table_row_{{$index}}_{{obj.record.id}}" data-ng-click="editTask(obj.record)" data-ng-repeat="value in obj.record | orderAndShowValue : fields track by $index"> <div class="cell-content" ng-switch="fields[$index].name"> <div ng-switch-when="is_active"> <span ng-if="value == true"> <i class="fa fa-check"></i> </span> <span ng-if="value == false"> <i class="fa fa-times"></i> </span> </div> <div ng-switch-when="has_log"> <span ng-if="value == true" data-ng-class="value ? 'df-tab-has-error' : ''"> <i class="fa fa-warning" ng-></i> </span> <span ng-if="value == false"> - </span> </div> <div ng-switch-default> {{value}} </div> </div> </td> </tr> </tbody> </table> </div> </div> </div> </div> <!-- Edit Role --> <div data-ng-show="currentEditTask"> <df-task-details data-task-data="currentEditTask" data-new-task="false" data-api-data="apiData"></df-task-details> </div> </div>
<div> <div data-ng-hide="!schedulerEnabled || currentEditTask"> <!-- Section Header --> <df-section-header data-title="'Manage Tasks'"></df-section-header> <df-section-toolbar> <df-toolbar-paginate data-api="'scheduler'"></df-toolbar-paginate> <div class="btn-group btn-group-sm hidden-xs df-btn-group"> <button class="btn btn-default" data-ng-click="deleteSelectedTasks()" data-ng-disabled="selectedTasks.length === 0" title="Delete selected tasks"><i class="fa fa-fw fa-trash"></i></button> </div> <div style="clear: both"></div> </df-section-toolbar> <div data-ng-show="tasks.length === 0 && emptySectionOptions.active"> <df-empty-section></df-empty-section> </div> <div data-ng-show="tasks.length > 0"> <div> <div class="panel panel-default"> <table class="table table-responsive table-bordered table-striped table-hover table-condensed"> <thead> <th> </th> <th data-ng-class="order.orderBy === field.name ? 'df-th-selected' : ''" data-ng-click="orderOnSelect(field)" data-ng-repeat="field in fields"> <span class="df-th-text" style="white-space: nowrap">{{field.label}} <i style="margin-left: 5px;" data-ng-if="order.orderBy === field.name" class="fa" data-ng-class="order.orderBy === field.name && order.orderByReverse ? 'fa-caret-down' : 'fa-caret-up'"></i> </span> </th> </thead> <tbody> <tr data-ng-repeat="obj in tasks | orderObjectBy:order.orderBy:order.orderByReverse" class="repeated-item" class="repeated-item" data-ng-class="obj.__dfUI.selected ? 'danger' : ''"> <td style="width: 80px;"> <div class="cell-content"> <div class="checkbox" style="margin: 0"> <label> <input id="tasks_table_row_checkbox_{{obj.record.id}}" type="checkbox" data-ng-checked="obj.__dfUI.selected" data-ng-click="setSelected(obj)"> <div class="btn-group btn-group-xs"> <button id="tasks_table_row_delete_{{obj.record.id}}" type="button" class="btn btn-xs btn-default" data-ng-click="deleteTask(obj)" title="Delete Task"><i class="fa fa-trash"></i></button> </div> </label> </div> </div> </td> <td id="tasks_table_row_{{$index}}_{{obj.record.id}}" data-ng-click="editTask(obj.record)" data-ng-repeat="value in obj.record | orderAndShowValue : fields track by $index"> <div class="cell-content" ng-switch="fields[$index].name"> <div ng-switch-when="is_active"> <span ng-if="value == true"> <i class="fa fa-check"></i> </span> <span ng-if="value == false"> <i class="fa fa-times"></i> </span> </div> <div ng-switch-when="has_log"> <span ng-if="value == true" data-ng-class="value ? 'df-tab-has-error' : ''"> <i class="fa fa-warning" ng-></i> </span> <span ng-if="value == false"> - </span> </div> <div ng-switch-default> {{value}} </div> </div> </td> </tr> </tbody> </table> </div> </div> </div> </div> <!-- Edit Role --> <div data-ng-show="schedulerEnabled && currentEditTask"> <df-task-details data-task-data="currentEditTask" data-new-task="false" data-api-data="apiData"></df-task-details> </div> <div data-ng-if="subscription_required"> <br><h4>This feature requires a DreamFactory GOLD product subscription.</h4> Email <a href="mailto:sales@dreamfactory.com">sales@dreamfactory.com</a> or call +1-415-993-5877 for pricing information. </div> </div>
2 changes: 1 addition & 1 deletion dist/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]--> <!-- Add your site or application content here --> <div id="dreamfactoryApp" data-ng-controller="MainCtrl" df-popup-login> <div id="popup-login-container"></div> <!-- Top level Nav --> <df-top-level-nav-std data-options="topLevelNavOptions"></df-top-level-nav-std> <div data-ng-if="showAdminComponentNav" style="margin: 10px auto;" class="df-menu"> <!-- Component nav and title --> <div class="container-fluid"> <div class="row"> <div class="col-xs-12"> <div class="col-md-2 df-menu-container df-menu-icon"> <df-component-title></df-component-title> </div> <div class="col-md-10 df-menu-container second-nav-menu-items"> <df-component-nav data-options="componentNavOptions"></df-component-nav> </div> </div> </div> </div> </div> <!-- Rendering Context --> <div class="container-fluid"> <div class="row"> <div class="col-xs-12"> <div data-ng-view=""></div> </div> </div> </div> <!--<df-main-loading></df-main-loading>--> <div id="mask"></div> </div> <!--[if lt IE 9]>
<script src="scripts/oldieshim.d41d8cd9.js"></script>
<![endif]--> <script src="scripts/vendor.85f12eba.js"></script> <script src="scripts/app.42a7b4ed.js"></script> <!-- other deps --> <script src="vendor/ace/ace.js"></script> <script src="vendor/ace/mode-javascript.js"></script> <script src="vendor/ace/mode-json.js"></script> <script src="vendor/ace/mode-yaml.js"></script> <script> setTimeout(function(){
<![endif]--> <script src="scripts/vendor.85f12eba.js"></script> <script src="scripts/app.0b796c3d.js"></script> <!-- other deps --> <script src="vendor/ace/ace.js"></script> <script src="vendor/ace/mode-javascript.js"></script> <script src="vendor/ace/mode-json.js"></script> <script src="vendor/ace/mode-yaml.js"></script> <script> setTimeout(function(){

var _updateIntercom = function(userData) {
var host = $body.injector().get("$location").host();
Expand Down

Large diffs are not rendered by default.

0 comments on commit 6605347

Please sign in to comment.