diff options
author | Fulup Ar Foll <fulup@iot.bzh> | 2016-01-25 14:37:32 +0100 |
---|---|---|
committer | Fulup Ar Foll <fulup@iot.bzh> | 2016-01-25 14:37:32 +0100 |
commit | 3ebdce373e134b70b129154d8033c1c628847a6c (patch) | |
tree | 76d84a1b1e6e6b474c7eecad2ea098ba0de69300 /afm-client/app/Frontend/pages | |
parent | 8d03b8c581ce64192e9d265597d262b59826cffd (diff) |
First version
Diffstat (limited to 'afm-client/app/Frontend/pages')
9 files changed, 502 insertions, 0 deletions
diff --git a/afm-client/app/Frontend/pages/Dashboard/Dashboard.html b/afm-client/app/Frontend/pages/Dashboard/Dashboard.html new file mode 100644 index 0000000..c393271 --- /dev/null +++ b/afm-client/app/Frontend/pages/Dashboard/Dashboard.html @@ -0,0 +1,33 @@ +<!-- Foundation Annotations generate tmp/route.js --> +--- +name: Dashboard +url: /dashboard +controller: DashboardController as ctrl +animationIn: slideInRight +--- + +<h3> +<img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px;"> + Application Framework Manager Simple Client +</h3> + + + +<div class="button-box box-content "> + <appli-button ng-repeat="appliID in ctrl.appliIDs" store="ctrl.appliStore" handle="{{appliID}}" callback="ctrl.AppliCB"> </appli-button> + <upload-appli class="ibz-right" label="Upload" icon="fi-upload" posturl="/api/post/upload-appli" callback="ctrl.FileUploaded" title="Upload AGL App"></upload-appli> +</div> + + +<div class="message-box box-content vertical grid-frame"> + <div class="response"> + <span class="grid-content noscroll req {{ctrl.status}} ">req= {{ctrl.request}}</span> + <span class="grid-content noscroll res {{ctrl.status}} ">res= {{ctrl.response}}</span> + <span class="grid-content noscroll status {{ctrl.status}}">status= {{ctrl.errcode}}</span> + </div> +</div> + + +<link-button href="sample" icon="fi-home" label="sample"></link-button> +<token-refresh autolog="true" callback="ctrl.AutoStart"></token-refresh> + diff --git a/afm-client/app/Frontend/pages/Dashboard/DashboardModule.js b/afm-client/app/Frontend/pages/Dashboard/DashboardModule.js new file mode 100644 index 0000000..c075372 --- /dev/null +++ b/afm-client/app/Frontend/pages/Dashboard/DashboardModule.js @@ -0,0 +1,75 @@ +(function() { +'use strict'; + +// WARNING: make sure than app/frontend/services/AppConfig.js match your server + +// list all rependencies within the page + controler if needed +angular.module('DashboardModule', ['SubmitButton', 'TokenRefresh', 'AppliButton']) + + .controller('DashboardController', function (AppCall, Notification) { + var scope = this; // I hate JavaScript + scope.uuid ="none"; + scope.token ="none"; + scope.session="none"; + scope.status ="err-no"; + scope.appliIDs =[]; // array to hold applications ID + scope.appliStore={}; // array to hold applications json description + + scope.AppliCB = function (appliID) { + console.log ("Application Clicked ID=[%s]", appliID); + + }; + + scope.AppliCB = function(appliID, action, response) { + // Action is done within Widget Controller only update debug UI zone + scope.request = action; + scope.errcode = response.status; + if (response.data) scope.response = response.data; + }; + + scope.GetRunnables = function() { + console.log ("Dashboard GetRunnables"); + + AppCall.get ("afm-main", "runnables", {/*query*/}, function(response) { + + // update debug UI zone + scope.request = "/api/afm-main/runnable"; + scope.response = response.data; + scope.errcode = response.status; + + if (response.status !== 200) { + console.log ("Hoop GetRunnable failed"); + return; + } + + // Check this is a valid response from Binder + if (response.data.request.jtype !== "AJB_reply" && response.data.request.api !== "runnables") { + Notification.error ({message: "Invalid Respond to /opa/afm-main/runnable response.data="+response.data, delay: 5000}); + return; + } + + // loop on runnable application to prepare for display + var appliIDs=[]; + for (var idx=0; idx < response.data.response.length; idx ++) { + appliIDs[idx] = response.data.response [idx].id; + scope.appliStore [response.data.response [idx].id] = response.data.response [idx]; + } + scope.appliIDs = appliIDs; // avoid partial update to limit UI refresh + + }); + }; + + scope.FileUploaded = function (status) { + console.log ("file Uploaded"); + scope.GetRunnables(); + }; + + scope.AutoStart = function () { + console.log ("AutoStart requesting Apps list"); + scope.GetRunnables(); + }; + + }); + +console.log ("Dashboard Controller Loaded"); +})();
\ No newline at end of file diff --git a/afm-client/app/Frontend/pages/Dashboard/DashboardModule.scss b/afm-client/app/Frontend/pages/Dashboard/DashboardModule.scss new file mode 100644 index 0000000..8bf04a1 --- /dev/null +++ b/afm-client/app/Frontend/pages/Dashboard/DashboardModule.scss @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2015 "IoT.bzh" + * Author "Fulup Ar Foll" + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +@import "app/ibz-mixins"; + +$COLOR_SUCCESS: green; +$COLOR_FAIL: red; + +token-refresh { + display: block; + float: right; + margin: .5rem 1rem 0 0; +} + +.button-box { + height : 4.5rem; + + .session-button { + float: left; + width: 5rem; + }; + + .response > span{ + display: block; + margin: .3rem .5rem .3rem .5rem; + } + + .fail { + color:$COLOR_FAIL; + border: 1px solid darken($COLOR_FAIL,10%); + } + .success { + color:$COLOR_SUCCESS; + border: 1px solid darken($COLOR_SUCCESS,10%); + } + +}; + +.message-box { + height : auto; + width: 100%; + font-size: .75rem; + + .response { + .err-no { color:grey; } + .res.err-ok { color: blue; } + .req.err-ok { color:blueviolet; } + .status.err-ok { color:green; } + .status.err-fx { color:red; } + } + + +}; + + + diff --git a/afm-client/app/Frontend/pages/Home/Dashboard.html b/afm-client/app/Frontend/pages/Home/Dashboard.html new file mode 100644 index 0000000..036148a --- /dev/null +++ b/afm-client/app/Frontend/pages/Home/Dashboard.html @@ -0,0 +1,40 @@ +<!-- Foundation Annotations generate tmp/route.js --> +--- +name: dashboard +url: /dashboard +controller: DashboardController as ctrl +animationIn: slideInRight +--- + +<h3> +<img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px;"> + Application Framework Manager Simple Client +</h3> + + + +<div class="button-box box-content "> + <appli-button ng-repeat="appliID in ctrl.appliIDs" store="ctrl.appliStore" handle={{appliID}} callback="ctrl.AppliCB"> </appli-button> + <upload-appli class="ibz-right" label="Upload" icon="fi-upload" posturl="/api/post/upload-appli" callback="ctrl.FileUploaded" title="Upload AGL App"></upload-appli> +</div> + + +<div class="button-box box-content "> + + <submit-button class="session-button {{ctrl.APIcheck}}" icon="fi-play-circle" label="Start" clicked="ctrl.StartApp" ></submit-button> + <submit-button class="session-button {{ctrl.APIrefresh}}" icon="fi-x-circle" label="Stop" clicked="ctrl.StopApp" ></submit-button> + <submit-button class="session-button {{ctrl.APIreset}}" icon="fi-x" label="Remove" clicked="ctrl.RemoveApp" ></submit-button> + +</div> +<div class="message-box box-content vertical grid-frame"> + <div class="response"> + <span class="grid-content noscroll req {{ctrl.status}} ">req= {{ctrl.request}}</span> + <span class="grid-content noscroll res {{ctrl.status}} ">res= {{ctrl.response}}</span> + <span class="grid-content noscroll status {{ctrl.status}}">status= {{ctrl.errcode}}</span> + </div> +</div> + + +<link-button href="sample" icon="fi-home" label="sample"></link-button> +<token-refresh autolog="true" callback="ctrl.AutoStart"></token-refresh> + diff --git a/afm-client/app/Frontend/pages/Home/DashboardModule.js b/afm-client/app/Frontend/pages/Home/DashboardModule.js new file mode 100644 index 0000000..f843df1 --- /dev/null +++ b/afm-client/app/Frontend/pages/Home/DashboardModule.js @@ -0,0 +1,118 @@ +(function() { +'use strict'; + +// WARNING: make sure than app/frontend/services/AppConfig.js match your server + +// list all rependencies within the page + controler if needed +angular.module('DashboardModule', ['SubmitButton', 'TokenRefresh', 'AppliButton']) + + .controller('DashboardController', function ($http, AppConfig, Notification) { + var scope = this; // I hate JavaScript + scope.uuid ="none"; + scope.token ="none"; + scope.session="none"; + scope.status ="err-no"; + scope.appliIDs =[]; // array to hold applications ID + scope.appliStore={}; // array to hold applications json description + + scope.ProcessResponse= function(data, errcode, headers, config) { + var apiname= 'API'+ data.request.api.replace('-','_'); + scope.status = "err-ok"; + scope.errcode= errcode; + scope.request = data.request; + scope.response = data.response; + + // if token was refresh let's update AppConfig + if (data.request.token) AppConfig.session.token = data.request.token; + if (data.request.uuid) AppConfig.session.uuid = data.request.uuid; + if (data.request.timeout) AppConfig.session.timeout = data.request.timeout; + + // Make sure we clean everything when Open/Close is called + if (apiname === "APIcreate" || apiname === "APIreset") { + scope.APIreset =''; + scope.APIcreate =''; + scope.APIrefresh=''; + scope.APIcheck =''; + } + scope[apiname]="success"; + + // If we have a new token let's update it + if (data.request.token) scope.token=data.request.token; + + console.log ("OK: "+ JSON.stringify(data)); + }; + + scope.ProcessError= function(data, errcode, headers, config) { + var apiname= 'API'+data.request.api.replace('-','_'); + scope.status = "err-fx"; + scope.errcode = errcode; + scope.request = data.request; + scope.response = ""; + scope[apiname]="fail"; + + console.log ("FX: "+ JSON.stringify(data)); + }; + + scope.OpenSession = function() { + console.log ("OpenSession"); + var handler = $http.get(AppConfig.session.create + '?token='+AppConfig.session.initial); + + handler.success(scope.ProcessResponse); + handler.error(scope.ProcessError); + }; + + scope.CheckSession = function() { + console.log ("CloseSession"); + var handler = $http.get(AppConfig.session.check + '?token='+AppConfig.session.token); + + handler.success(scope.ProcessResponse); + handler.error(scope.ProcessError); + }; + + scope.RefreshSession = function() { + console.log ("RefreshSession"); + var handler = $http.get(AppConfig.session.refresh + '?token='+AppConfig.session.token); + + handler.success(scope.ProcessResponse); + handler.error(scope.ProcessError); + }; + + scope.ResetSession = function() { + console.log ("ResetSession"); + var handler = $http.get(AppConfig.session.reset + '?token='+AppConfig.session.token); + + handler.success(scope.ProcessResponse); + handler.error(scope.ProcessError); + }; + + scope.AppliCB = function (appliID) { + console.log ("Application Clicked ID=[%s]", appliID); + + }; + + scope.AutoStart = function () { + console.log ("AutoStart requesting Apps list"); + var handler = $http.get('/api/afm-main/runnables' + '?token='+AppConfig.session.token); + handler.success(function(result) { + + // Check this is a valid response from Binder + if (result.request.jtype !== "AJB_reply" && result.request.api !== "runnables") { + Notification.error ({message: "Invalid Respond to /opa/afm-main/runnable result="+result, delay: 5000}); + return; + } + + // loop on runnable application to prepare for display + var appliIDs=[]; + for (var idx=0; idx < result.response.length; idx ++) { + appliIDs[idx] = result.response [idx].id; + scope.appliStore [result.response [idx].id] = result.response [idx]; + } + scope.appliIDs = appliIDs; // avoid partial update to limit UI refresh + + }); + }; + + }); + +console.log ("Dashboard Controller Loaded"); +})();
\ No newline at end of file diff --git a/afm-client/app/Frontend/pages/Home/DashboardModule.scss b/afm-client/app/Frontend/pages/Home/DashboardModule.scss new file mode 100644 index 0000000..8bf04a1 --- /dev/null +++ b/afm-client/app/Frontend/pages/Home/DashboardModule.scss @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2015 "IoT.bzh" + * Author "Fulup Ar Foll" + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +@import "app/ibz-mixins"; + +$COLOR_SUCCESS: green; +$COLOR_FAIL: red; + +token-refresh { + display: block; + float: right; + margin: .5rem 1rem 0 0; +} + +.button-box { + height : 4.5rem; + + .session-button { + float: left; + width: 5rem; + }; + + .response > span{ + display: block; + margin: .3rem .5rem .3rem .5rem; + } + + .fail { + color:$COLOR_FAIL; + border: 1px solid darken($COLOR_FAIL,10%); + } + .success { + color:$COLOR_SUCCESS; + border: 1px solid darken($COLOR_SUCCESS,10%); + } + +}; + +.message-box { + height : auto; + width: 100%; + font-size: .75rem; + + .response { + .err-no { color:grey; } + .res.err-ok { color: blue; } + .req.err-ok { color:blueviolet; } + .status.err-ok { color:green; } + .status.err-fx { color:red; } + } + + +}; + + + diff --git a/afm-client/app/Frontend/pages/Sample/Sample.html b/afm-client/app/Frontend/pages/Sample/Sample.html new file mode 100644 index 0000000..03a4558 --- /dev/null +++ b/afm-client/app/Frontend/pages/Sample/Sample.html @@ -0,0 +1,35 @@ +<!-- Foundation Annotations generate tmp/route.js --> +--- +name: mysample +url: /sample +controller: SampleController as ctrl +animationIn: slideInRight +--- + +<h1><img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px;"> + Post File Upload +</h1> + +<div class="sample-box box-content"> + + <!-- Usage: upload-xxxxx + name = [xxxxxx] is use a field label for xform input field. Should match with server side + category = [avatar] should match to a valid directory of thumbnail within AppConfig.path + thumbnail= [tux-bzh.png] a valid image within AppConfig.paths.[category] + istoobig = [istoobig.png] used image from AppConfig.paths.[category] when file is oversized + maxsize = [xxx] maximum size in KB [default max depend on upload-type] + accept = [image] acceptable accept for upload + --> + <upload-image name="avatar" category="avatar" thumbnail="tux-visitor.png" maxsize="100" + posturl="/api/post/upload-image" callback="ctrl.FileUploaded" accept="image" title="Change your Avatar"> + </upload-image> + + <!-- Warning: name=xxx should match with what server expect [used as xform input name --> + <upload-audio name="music" posturl="/api/post/upload-music" callback="ctrl.FileUploaded" title="Upload your Music"></upload-audio> + + <!-- Warning: name=xxx should match with what server expect [used as xform input name --> + <upload-appli name="appli" posturl="/api/post/upload-appli" callback="ctrl.FileUploaded" title="Upload AGL App"></upload-appli> + +</div> + +<link-button href="home" icon="fi-home" label="home"></link-button> diff --git a/afm-client/app/Frontend/pages/Sample/SampleModule.js b/afm-client/app/Frontend/pages/Sample/SampleModule.js new file mode 100644 index 0000000..8ae82ea --- /dev/null +++ b/afm-client/app/Frontend/pages/Sample/SampleModule.js @@ -0,0 +1,18 @@ +(function() { +'use strict'; + +// list all rependencies within the page + controler if needed +angular.module('SampleModule', ['SubmitButton','UploadFiles']) + + .controller('SampleController', function ($http) { + var scope = this; // I hate JavaScript + + console.log ("sample Init"); + + scope.FileUploaded = function (response) { + console.log ("FileUploaded response=%s", JSON.stringify(response)); + }; + }); + +console.log ("SampleControler Loaded"); +})();
\ No newline at end of file diff --git a/afm-client/app/Frontend/pages/Sample/SampleModule.scss b/afm-client/app/Frontend/pages/Sample/SampleModule.scss new file mode 100644 index 0000000..7654424 --- /dev/null +++ b/afm-client/app/Frontend/pages/Sample/SampleModule.scss @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2015 "IoT.bzh" + * Author "Fulup Ar Foll" + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +@import "app/ibz-mixins"; + + +.sample-box { + display: block; + height : 4.5rem; + + .sample-button { + float: right; + width: 5rem; + }; + + .muted-on-on,.muted-off-off{ + background: blueviolet; + }; + + .muted-error{ + background: red; + }; +}; + + + |