1
0
Fork 0
mirror of synced 2024-06-14 08:44:49 +12:00

Updated storage and users navigator

This commit is contained in:
eldadfux 2019-08-14 16:50:40 +03:00
parent 21759964cc
commit 89c0b9e330
14 changed files with 274 additions and 138 deletions

1
.gitignore vendored
View file

@ -1,4 +1,5 @@
/vendor/
/node_modules/
/storage/uploads/
/.idea/
.DS_Store

View file

@ -139,7 +139,7 @@ $utopia->get('/v1/storage/files')
]);
$results = array_map(function ($value) { /* @var $value \Database\Document */
return $value->getArrayCopy(['$uid', '$permissions', 'name', 'signature', 'mimeType', 'sizeOriginal']);
return $value->getArrayCopy(['$uid', '$permissions', 'name', 'dateCreated', 'signature', 'mimeType', 'sizeOriginal']);
}, $results);
$response->json(['sum' => $projectDB->getSum(), 'files' => $results]);
@ -161,7 +161,7 @@ $utopia->get('/v1/storage/files/:fileId')
throw new Exception('File not found', 404);
}
$response->json($file->getArrayCopy(['$uid', '$permissions', 'name', 'signature', 'mimeType', 'sizeOriginal']));
$response->json($file->getArrayCopy(['$uid', '$permissions', 'name', 'dateCreated', 'signature', 'mimeType', 'sizeOriginal']));
}
);

View file

@ -34,6 +34,7 @@ const APP_SOCIAL_GITHUB = 'https://github.com/appwrite';
const APP_SOCIAL_DISCORD = 'https://discord.gg/GSeTUeA';
const APP_MODE_ADMIN = 'admin';
const APP_LOCALES = ['en', 'he'];
const APP_PAGING_LIMIT = 15;
$register = new Registry();
$request = new Request();

View file

@ -1,19 +1,151 @@
<?php
use Utopia\Locale\Locale;
$providers = $this->getParam('providers', []);
?>
<div class="cover margin-bottom-large">
<h1 class="zone xl margin-bottom-large margin-top">
<a data-ls-attrs="href=/console/openings/new?company={{router.params.company}}" class="button icon margin-top-tiny pull-end"><i class="icon-plus"></i> &nbsp;Upload</a>
<?php echo Locale::getText('console.storage.title'); ?>
</h1>
</div>
<div class="zone xl">
<div data-ui-modal class="box modal close" data-button-text="" data-button-class="fly round" data-button-icon="icon-plus">
<button type="button" class="close pull-end" data-ui-modal-close=""><i class="icon-cancel"></i></button>
<h1>Upload File</h1>
<form data-debug="1"
data-service="storage.createFile"
data-event="submit"
data-scope="sdk"
data-success="alert,trigger,reset"
data-success-param-alert-text="Created user successfully"
data-success-param-trigger-events="user-create,modal-close"
data-failure="alert"
data-failure-param-alert-text="Failed to create user"
data-failure-param-alert-classname="error">
<input type="hidden" name="folderId" id="files-folderId" data-cast-to="int" value="1">
<label for="file-read">Files</label>
<input type="file" name="files" id="file-files" require>
<label for="file-read">Read Permissions</label>
<input type="text" class="full-width" id="file-read" name="read" required autocomplete="off" data-cast-to="array" value="*" />
<label for="file-write">Write Permissions</label>
<input type="text" class="full-width" id="file-write" name="write" required autocomplete="off" data-cast-to="array" value="*" />
<hr />
<button type="submit">Create</button> &nbsp; <button data-ui-modal-close="" type="button" class="reverse">Cancel</button>
</form>
</div>
<form class="box padding-small margin-bottom search"
data-service="storage.listFiles"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-offset=""
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-files"
data-success="state"
data-success-param-state-keys="search,offset">
<div class="row responsive">
<div class="col span-10">
<input name="search" id="searchFiles" type="search" autocomplete="off" placeholder="Search" class="margin-bottom-no" data-ls-bind="{{router.params.search}}">
</div>
<div class="col span-2">
<button class="fill">Search</button>
</div>
</div>
</form>
<div
data-service="storage.listFiles"
data-event="load,user-create,user-update,user-delete"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-offset="{{router.params.offset}}"
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-files">
<div data-ls-if="0 == {{project-files.sum}}" class="box margin-bottom">
<h3 class="margin-bottom">No Files Found</h3>
<p class="margin-bottom-no">Upload your first file to get started</p>
</div>
<div data-ls-if="0 != {{project-files.sum}}" style="display: none;">
<div class="note margin-bottom-small margin-end-small text-align-end text-size-small"><span data-ls-bind="{{project-files.sum}}"></span> results found</div>
<div class="box margin-bottom">
<table class="vertical">
<thead>
<tr>
<th width="60"></th>
<th width="220">Name</th>
<th width="180">Type</th>
<th>Size</th>
<th width="100">Created</th>
</tr>
</thead>
<tbody data-ls-loop="project-files.files" data-ls-as="file">
<tr>
<td class="hide">
<img src="" data-ls-attrs="src=//{{env.DOMAIN}}/v1/storage/files/{{file.$uid}}/preview?width=100&height=100&project={{router.params.project}}&mode=admin" class="pull-start avatar" />
</td>
<td data-title="Name: ">
<span data-ls-bind="{{file.name}}" class="note"></span>
</td>
<td data-title="Type: ">
<span data-ls-bind="{{file.mimeType}}" class="note tag"></span>
</td>
<td data-title="Status: ">
<span data-ls-bind="{{file.sizeOriginal|humanFileSize}}" class="note"></span>
</td>
<td data-title="Created: ">
<span data-ls-bind="{{file.dateCreated|date-text}}" class="note"></span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="clear text-align-center paging">
<form
data-service="storage.listFiles"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-files"
data-success="state"
data-success-param-state-keys="search,offset">
<button name="offset" data-paging-back data-offset="{{router.params.offset}}" data-sum="{{project-files.sum}}" class="margin-end round small" aria-label="Back"><i class="icon-left-open"></i></button>
</form>
<span data-ls-bind="{{router.params.offset|pageCurrent}} / {{project-files.sum|pageTotal}}"></span>
<form
data-service="storage.listFiles"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-files"
data-success="state"
data-success-param-state-keys="search,offset">
<button name="offset" data-paging-next data-offset="{{router.params.offset}}" data-sum="{{project-files.sum}}" class="margin-start round small" aria-label="Next"><i class="icon-right-open"></i></button>
</form>
</div>
</div>
<!--
<div>
<form class="row clear margin-bottom-tiny" data-forms-filter="filter-files" data-event="init">
<div class="col span-4">
@ -79,5 +211,5 @@ $providers = $this->getParam('providers', []);
</div>
</div>
</div>
</div>
</div> -->
</div>

View file

@ -1,6 +1,5 @@
<?php
$providers = $this->getParam('providers', []);
$limit = 3;
?>
<div class="cover">
@ -49,7 +48,7 @@ $limit = 3;
data-service="users.listUsers"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-offset=""
data-param-order-type="DESC"
data-scope="sdk"
@ -70,7 +69,7 @@ $limit = 3;
data-service="users.listUsers"
data-event="load,user-create,user-update,user-delete"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-offset="{{router.params.offset}}"
data-param-order-type="DESC"
data-scope="sdk"
@ -132,7 +131,7 @@ $limit = 3;
data-service="users.listUsers"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-users"
@ -147,7 +146,7 @@ $limit = 3;
data-service="users.listUsers"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-users"
@ -188,7 +187,7 @@ $limit = 3;
data-service="teams.listTeams"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-offset=""
data-param-order-type="DESC"
data-scope="sdk"
@ -209,7 +208,7 @@ $limit = 3;
data-service="teams.listTeams"
data-event="load,team-create,team-update,team-delete"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-offset="{{router.params.offset}}"
data-param-order-type="DESC"
data-scope="sdk"
@ -275,7 +274,7 @@ $limit = 3;
data-service="teams.listTeams"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-teams"
@ -290,7 +289,7 @@ $limit = 3;
data-service="teams.listTeams"
data-event="submit"
data-param-search="{{router.params.search}}"
data-param-limit="<?php echo $limit; ?>"
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
data-param-order-type="DESC"
data-scope="sdk"
data-name="project-teams"

View file

@ -51,7 +51,8 @@ $env = $this->getParam('env', '');
PROJECT: '<?php echo $project; ?>',
LOCALE: '<?php echo $this->escape(Locale::getText('settings.locale')); ?>',
PREFIX: '<?php echo $this->escape($this->getParam('prefix')); ?>',
ROLES: <?PHP echo json_encode($this->getParam('roles', [])); ?>
ROLES: <?PHP echo json_encode($this->getParam('roles', [])); ?>,
PAGING_LIMIT: <?PHP echo APP_PAGING_LIMIT; ?>
};
<?php if($litespeed): ?>

View file

@ -47,6 +47,8 @@ services:
clamav:
image: appwrite/clamav:1.0.4
restart: unless-stopped
volumes:
- ./storage:/storage:rw
redis:
image: redis:5.0

View file

@ -10,9 +10,8 @@ if(typeof headers!=='object'){throw new Error('var headers must be of type objec
for(i=0;i<globalParams.length;i++){path=addParam(path,globalParams[i].key,globalParams[i].value);}
for(let key in globalHeaders){if(globalHeaders.hasOwnProperty(key)){if(!headers[globalHeaders[key].key]){headers[globalHeaders[key].key]=globalHeaders[key].value;}}}
if(method==='GET'){for(let param in params){if(param.hasOwnProperty(key)){path=addParam(path,key,params[key]);}}}
switch(headers['content-type']){case'application/json':params=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(let param in params){if(param.hasOwnProperty(key)){formData.append(key,param[key]);}}
params=formData;break;}
return new Promise(function(resolve,reject){let request=new XMLHttpRequest(),key;request.withCredentials=true;request.open(method,path,true);for(key in headers){if(headers.hasOwnProperty(key)){request.setRequestHeader(key,headers[key]);}}
switch(headers['content-type']){case'application/json':params=JSON.stringify(params);break;case'multipart/form-data':console.log(params);let formData=new FormData();Object.keys(params).forEach(function(key){let param=params[key];formData.append(key+(Array.isArray(param)?'[]':''),param);});params=formData;break;}
return new Promise(function(resolve,reject){let request=new XMLHttpRequest(),key;request.withCredentials=true;request.open(method,path,true);for(key in headers){if(key==='content-type')continue;if(headers.hasOwnProperty(key)){request.setRequestHeader(key,headers[key]);}}
request.onload=function(){if(4===request.readyState&&399>=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case'application/json':data=JSON.parse(data);break;}
resolve(data);}else{reject(new Error(request.statusText));}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,false);}
request.onerror=function(){reject(new Error("Network Error"));};request.send(params);})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{});},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress);},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress);},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress);},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress);},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField);}}
@ -131,7 +130,7 @@ if(security===undefined){throw new Error('Missing required parameter: "security"
let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);return http.put(path,{'content-type':'application/json'},{'name':name,'events':events,'url':url,'security':security,'httpUser':httpUser,'httpPass':httpPass});},deleteWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');}
if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"');}
let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);return http.delete(path,{'content-type':'application/json'},{});}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';return http.get(path,{'content-type':'application/json'},{'search':search,'limit':limit,'offset':offset,'orderType':orderType});},createFile:function(files,read=[],write=[],folderId=''){if(files===undefined){throw new Error('Missing required parameter: "files"');}
let path='/storage/files';return http.post(path,{'content-type':'application/json'},{'files':files,'read':read,'write':write,'folderId':folderId});},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files';return http.post(path,{'content-type':'multipart/form-data'},{'files':files,'read':read,'write':write,'folderId':folderId});},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);return http.get(path,{'content-type':'application/json'},{});},deleteFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);return http.delete(path,{'content-type':'application/json'},{});},getFileDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);return http.get(path,{'content-type':'application/json'},{});},getFilePreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
@ -2329,6 +2328,7 @@ else if(undefined!==element.value){if('SELECT'===element.tagName&&element.childr
else if('radio'===type){if(element.checked){json[name]=element.value;}}
else if('checkbox'===type){if(!Array.isArray(json[name])){json[name]=[];}
if(element.checked){json[name].push(element.value);}}
else if('file'===type){console.log('form2json file:',element.files);json[name]=element.files[0];}
else if(undefined!==element.value){if((json[name]!==undefined)&&(!Array.isArray(json[name]))){json[name]=[json[name]];}
if(Array.isArray(json[name])){json[name].push(element.value);}
else{json[name]=element.value;}}
@ -2345,7 +2345,7 @@ return n[0];}).join('')||'--';let background=themes[theme[theme.length-1]]['back
(hours?hours+"h ":"")+
(minutes?minutes+"m ":"")+
Number.parseFloat(seconds).toFixed(0)+"s";}
return"< 1s";}).add('markdown',function($value,markdown){return markdown.render($value);}).add('pageCurrent',function($value){return Math.ceil(parseInt($value||0)/3)+1;}).add('pageTotal',function($value){let total=Math.ceil(parseInt($value||0)/3);return(total)?total:1;}).add('humanFileSize',function($value){if(!$value){return 0;}
return"< 1s";}).add('markdown',function($value,markdown){return markdown.render($value);}).add('pageCurrent',function($value,env){return Math.ceil(parseInt($value||0)/env.PAGING_LIMIT)+1;}).add('pageTotal',function($value,env){let total=Math.ceil(parseInt($value||0)/env.PAGING_LIMIT);return(total)?total:1;}).add('humanFileSize',function($value){if(!$value){return 0;}
let thresh=1000;if(Math.abs($value)<thresh){return $value+' B';}
let units=['kB','MB','GB','TB','PB','EB','ZB','YB'];let u=-1;do{$value/=thresh;++u;}while(Math.abs($value)>=thresh&&u<units.length-1);return $value.toFixed(1)+'<span class="text-size-small unit">'+units[u]+'</span>';}).add('statsTotal',function($value){if(!$value){return 0;}
$value=abbreviate($value,1,false,false);return($value==='0')?'N/A':$value;});function abbreviate(number,maxPlaces,forcePlaces,forceLetter){number=Number(number);forceLetter=forceLetter||false;if(forceLetter!==false){return annotate(number,maxPlaces,forcePlaces,forceLetter);}
@ -2454,8 +2454,8 @@ document.dispatchEvent(new CustomEvent('project-load'));}
document.addEventListener('state-changed',function(){if(router.params.project&&project!==router.params.project){if(debug){console.log('project-load-init');}
document.dispatchEvent(new CustomEvent('project-load'));project=router.params.project;}});element.addEventListener('change',function(){if(debug){console.log('change init',element.value);}
if(element.value&&element.value!==project){if(debug){console.log('Changed: selected project from list');}
return router.change('/console/home?project='+element.value);}});}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-back',controller:function(element,container,expression){let paths=[];let limit=3;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());let sum=parseInt(expression.parse(element.dataset['sum'])||'0');paths=paths.concat(expression.getPaths());if((offset-limit)<0){element.disabled=true;}
else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i<paths.length;i++){let path=paths[i].split('.');while(path.length){container.bind(element,path.join('.'),check);path.pop();}}}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-next',controller:function(element,container,expression){let paths=[];let limit=3;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());let sum=parseInt(expression.parse(element.dataset['sum'])||'0');paths=paths.concat(expression.getPaths());if((offset+limit)>=sum){element.disabled=true;}
return router.change('/console/home?project='+element.value);}});}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-back',controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());if((offset-limit)<0){element.disabled=true;}
else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i<paths.length;i++){let path=paths[i].split('.');while(path.length){container.bind(element,path.join('.'),check);path.pop();}}}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-next',controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());let sum=parseInt(expression.parse(element.dataset['sum'])||'0');paths=paths.concat(expression.getPaths());if((offset+limit)>=sum){element.disabled=true;}
else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;i<paths.length;i++){let path=paths[i].split('.');while(path.length){container.bind(element,path.join('.'),check);path.pop();}}}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-ui-highlight',controller:function(element,expression,document){let check=function(){let links=element.getElementsByTagName('a');let selected=null;let list=[];for(let i=0;i<links.length;i++){links[i].href=links[i].href||expression.parse(links[i].dataset['lsHref']||'');list.push(links[i]);}
list.sort(function(a,b){return a.pathname.length-b.pathname.length;});for(let i=0;i<list.length;i++){let href=list[i].href||expression.parse(list[i].dataset['lsHref']||'');if(list[i].pathname===window.location.pathname.substring(0,list[i].pathname.length)){list[i].classList.add('selected');if(selected!==null){list[selected].classList.remove('selected');}
selected=i;}

View file

@ -10,9 +10,8 @@ if(typeof headers!=='object'){throw new Error('var headers must be of type objec
for(i=0;i<globalParams.length;i++){path=addParam(path,globalParams[i].key,globalParams[i].value);}
for(let key in globalHeaders){if(globalHeaders.hasOwnProperty(key)){if(!headers[globalHeaders[key].key]){headers[globalHeaders[key].key]=globalHeaders[key].value;}}}
if(method==='GET'){for(let param in params){if(param.hasOwnProperty(key)){path=addParam(path,key,params[key]);}}}
switch(headers['content-type']){case'application/json':params=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(let param in params){if(param.hasOwnProperty(key)){formData.append(key,param[key]);}}
params=formData;break;}
return new Promise(function(resolve,reject){let request=new XMLHttpRequest(),key;request.withCredentials=true;request.open(method,path,true);for(key in headers){if(headers.hasOwnProperty(key)){request.setRequestHeader(key,headers[key]);}}
switch(headers['content-type']){case'application/json':params=JSON.stringify(params);break;case'multipart/form-data':console.log(params);let formData=new FormData();Object.keys(params).forEach(function(key){let param=params[key];formData.append(key+(Array.isArray(param)?'[]':''),param);});params=formData;break;}
return new Promise(function(resolve,reject){let request=new XMLHttpRequest(),key;request.withCredentials=true;request.open(method,path,true);for(key in headers){if(key==='content-type')continue;if(headers.hasOwnProperty(key)){request.setRequestHeader(key,headers[key]);}}
request.onload=function(){if(4===request.readyState&&399>=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case'application/json':data=JSON.parse(data);break;}
resolve(data);}else{reject(new Error(request.statusText));}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,false);}
request.onerror=function(){reject(new Error("Network Error"));};request.send(params);})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{});},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress);},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress);},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress);},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress);},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField);}}
@ -131,7 +130,7 @@ if(security===undefined){throw new Error('Missing required parameter: "security"
let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);return http.put(path,{'content-type':'application/json'},{'name':name,'events':events,'url':url,'security':security,'httpUser':httpUser,'httpPass':httpPass});},deleteWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');}
if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"');}
let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);return http.delete(path,{'content-type':'application/json'},{});}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';return http.get(path,{'content-type':'application/json'},{'search':search,'limit':limit,'offset':offset,'orderType':orderType});},createFile:function(files,read=[],write=[],folderId=''){if(files===undefined){throw new Error('Missing required parameter: "files"');}
let path='/storage/files';return http.post(path,{'content-type':'application/json'},{'files':files,'read':read,'write':write,'folderId':folderId});},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files';return http.post(path,{'content-type':'multipart/form-data'},{'files':files,'read':read,'write':write,'folderId':folderId});},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);return http.get(path,{'content-type':'application/json'},{});},deleteFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);return http.delete(path,{'content-type':'application/json'},{});},getFileDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}
let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);return http.get(path,{'content-type':'application/json'},{});},getFilePreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');}

View file

@ -236,6 +236,7 @@ else if(undefined!==element.value){if('SELECT'===element.tagName&&element.childr
else if('radio'===type){if(element.checked){json[name]=element.value;}}
else if('checkbox'===type){if(!Array.isArray(json[name])){json[name]=[];}
if(element.checked){json[name].push(element.value);}}
else if('file'===type){console.log('form2json file:',element.files);json[name]=element.files[0];}
else if(undefined!==element.value){if((json[name]!==undefined)&&(!Array.isArray(json[name]))){json[name]=[json[name]];}
if(Array.isArray(json[name])){json[name].push(element.value);}
else{json[name]=element.value;}}
@ -252,7 +253,7 @@ return n[0];}).join('')||'--';let background=themes[theme[theme.length-1]]['back
(hours?hours+"h ":"")+
(minutes?minutes+"m ":"")+
Number.parseFloat(seconds).toFixed(0)+"s";}
return"< 1s";}).add('markdown',function($value,markdown){return markdown.render($value);}).add('pageCurrent',function($value){return Math.ceil(parseInt($value||0)/3)+1;}).add('pageTotal',function($value){let total=Math.ceil(parseInt($value||0)/3);return(total)?total:1;}).add('humanFileSize',function($value){if(!$value){return 0;}
return"< 1s";}).add('markdown',function($value,markdown){return markdown.render($value);}).add('pageCurrent',function($value,env){return Math.ceil(parseInt($value||0)/env.PAGING_LIMIT)+1;}).add('pageTotal',function($value,env){let total=Math.ceil(parseInt($value||0)/env.PAGING_LIMIT);return(total)?total:1;}).add('humanFileSize',function($value){if(!$value){return 0;}
let thresh=1000;if(Math.abs($value)<thresh){return $value+' B';}
let units=['kB','MB','GB','TB','PB','EB','ZB','YB'];let u=-1;do{$value/=thresh;++u;}while(Math.abs($value)>=thresh&&u<units.length-1);return $value.toFixed(1)+'<span class="text-size-small unit">'+units[u]+'</span>';}).add('statsTotal',function($value){if(!$value){return 0;}
$value=abbreviate($value,1,false,false);return($value==='0')?'N/A':$value;});function abbreviate(number,maxPlaces,forcePlaces,forceLetter){number=Number(number);forceLetter=forceLetter||false;if(forceLetter!==false){return annotate(number,maxPlaces,forcePlaces,forceLetter);}
@ -361,8 +362,8 @@ document.dispatchEvent(new CustomEvent('project-load'));}
document.addEventListener('state-changed',function(){if(router.params.project&&project!==router.params.project){if(debug){console.log('project-load-init');}
document.dispatchEvent(new CustomEvent('project-load'));project=router.params.project;}});element.addEventListener('change',function(){if(debug){console.log('change init',element.value);}
if(element.value&&element.value!==project){if(debug){console.log('Changed: selected project from list');}
return router.change('/console/home?project='+element.value);}});}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-back',controller:function(element,container,expression){let paths=[];let limit=3;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());let sum=parseInt(expression.parse(element.dataset['sum'])||'0');paths=paths.concat(expression.getPaths());if((offset-limit)<0){element.disabled=true;}
else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i<paths.length;i++){let path=paths[i].split('.');while(path.length){container.bind(element,path.join('.'),check);path.pop();}}}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-next',controller:function(element,container,expression){let paths=[];let limit=3;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());let sum=parseInt(expression.parse(element.dataset['sum'])||'0');paths=paths.concat(expression.getPaths());if((offset+limit)>=sum){element.disabled=true;}
return router.change('/console/home?project='+element.value);}});}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-back',controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());if((offset-limit)<0){element.disabled=true;}
else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i<paths.length;i++){let path=paths[i].split('.');while(path.length){container.bind(element,path.join('.'),check);path.pop();}}}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-paging-next',controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset['offset'])||'0');paths=paths.concat(expression.getPaths());let sum=parseInt(expression.parse(element.dataset['sum'])||'0');paths=paths.concat(expression.getPaths());if((offset+limit)>=sum){element.disabled=true;}
else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;i<paths.length;i++){let path=paths[i].split('.');while(path.length){container.bind(element,path.join('.'),check);path.pop();}}}});})(window);(function(window){window.ls.container.get('view').add({selector:'data-ui-highlight',controller:function(element,expression,document){let check=function(){let links=element.getElementsByTagName('a');let selected=null;let list=[];for(let i=0;i<links.length;i++){links[i].href=links[i].href||expression.parse(links[i].dataset['lsHref']||'');list.push(links[i]);}
list.sort(function(a,b){return a.pathname.length-b.pathname.length;});for(let i=0;i<list.length;i++){let href=list[i].href||expression.parse(list[i].dataset['lsHref']||'');if(list[i].pathname===window.location.pathname.substring(0,list[i].pathname.length)){list[i].classList.add('selected');if(selected!==null){list[selected].classList.remove('selected');}
selected=i;}

View file

@ -69,11 +69,11 @@ window.ls.filter
.add('markdown', function ($value, markdown) {
return markdown.render($value);
})
.add('pageCurrent', function ($value) {
return Math.ceil(parseInt($value || 0) / 3) + 1;
.add('pageCurrent', function ($value, env) {
return Math.ceil(parseInt($value || 0) / env.PAGING_LIMIT) + 1;
})
.add('pageTotal', function ($value) {
let total = Math.ceil(parseInt($value || 0) / 3);
.add('pageTotal', function ($value, env) {
let total = Math.ceil(parseInt($value || 0) / env.PAGING_LIMIT);
return (total) ? total : 1;
})
.add('humanFileSize', function ($value) {

View file

@ -1,115 +1,119 @@
(function (window) {
"use strict";
window.ls.container.set('form', function() {
window.ls.container.set('form', function () {
function cast(value, to) {
switch (to) {
case 'int':
case 'integer':
value = parseInt(value);
break;
case 'string':
value = value.toString();
break;
case 'json':
value = (value) ? JSON.parse(value) : [];
break;
case 'array':
value = (value.constructor === Array) ? value : [value];
break;
case 'array-empty':
value = [];
break;
case 'bool':
case 'boolean':
value = (value === 'false') ? false : value;
value = !!value;
break;
function cast(value, to) {
switch (to) {
case 'int':
case 'integer':
value = parseInt(value);
break;
case 'string':
value = value.toString();
break;
case 'json':
value = (value) ? JSON.parse(value) : [];
break;
case 'array':
value = (value.constructor === Array) ? value : [value];
break;
case 'array-empty':
value = [];
break;
case 'bool':
case 'boolean':
value = (value === 'false') ? false : value;
value = !!value;
break;
}
return value;
}
return value;
}
function toJson(element, json) {
json = json || {};
let name = element.getAttribute('name');
let type = element.getAttribute('type');
let castTo = element.getAttribute('data-cast-to');
let ref = json;
function toJson(element, json) {
json = json || {};
let name = element.getAttribute('name');
let type = element.getAttribute('type');
let castTo = element.getAttribute('data-cast-to');
let ref = json;
if (name && 'FORM' !== element.tagName) {
if ('FIELDSET' === element.tagName) { // Fieldset Array / Object
if (castTo === 'object') {
if(name && 'FORM' !== element.tagName) {
if('FIELDSET' === element.tagName) { // Fieldset Array / Object
if(castTo === 'object') {
if (json[name] === undefined) {
json[name] = {};
}
if(json[name] === undefined) {
json[name] = {};
}
ref = json[name];
}
else {
if(!Array.isArray(json[name])) {
json[name] = [];
}
json[name].push({});
ref = json[name][json[name].length - 1];
}
}
else if (undefined !== element.value) {
if ('SELECT' === element.tagName && element.children > 0) { // Select
json[name] = element.children[element.selectedIndex].value;
}
else if ('radio' === type) { // Radio
if(element.checked) {
json[name] = element.value;
}
}
else if ('checkbox' === type) { // Checkbox
if(!Array.isArray(json[name])) {
json[name] = [];
}
if(element.checked) {
json[name].push(element.value);
}
}
else if (undefined !== element.value) { // Normal
if ((json[name] !== undefined) && (!Array.isArray(json[name]))) { // Support for list array when name is repeating more than once
json[name] = [json[name]];
}
if(Array.isArray(json[name])) {
json[name].push(element.value);
ref = json[name];
}
else {
json[name] = element.value;
if (!Array.isArray(json[name])) {
json[name] = [];
}
json[name].push({});
ref = json[name][json[name].length - 1];
}
}
else if (undefined !== element.value) {
if ('SELECT' === element.tagName && element.children > 0) { // Select
json[name] = element.children[element.selectedIndex].value;
}
else if ('radio' === type) { // Radio
if (element.checked) {
json[name] = element.value;
}
}
else if ('checkbox' === type) { // Checkbox
if (!Array.isArray(json[name])) {
json[name] = [];
}
json[name] = cast(json[name], castTo);
if (element.checked) {
json[name].push(element.value);
}
}
else if ('file' === type) { // File upload
console.log('form2json file:', element.files);
json[name] = element.files[0];
}
else if (undefined !== element.value) { // Normal
if ((json[name] !== undefined) && (!Array.isArray(json[name]))) { // Support for list array when name is repeating more than once
json[name] = [json[name]];
}
if (Array.isArray(json[name])) {
json[name].push(element.value);
}
else {
json[name] = element.value;
}
}
json[name] = cast(json[name], castTo); // Apply casting
}
}
for (let i = 0; i < element.children.length; i++) {
if (Array.isArray(ref)) {
ref.push({});
toJson(element.children[i], ref[ref.length]);
}
else {
toJson(element.children[i], ref);
}
}
return json;
}
for (let i = 0; i < element.children.length; i++) {
if(Array.isArray(ref)) {
ref.push({});
toJson(element.children[i], ref[ref.length]);
}
else {
toJson(element.children[i], ref);
}
return {
'toJson': toJson
}
return json;
}
return {
'toJson': toJson
}
}, true, false);
}, true, false);
})(window);

View file

@ -1,19 +1,15 @@
(function (window) {
window.ls.container.get('view').add({
selector: 'data-paging-back',
controller: function(element, container, expression) {
controller: function(element, container, expression, env) {
let paths = [];
let limit = 3;
let limit = env.PAGING_LIMIT;
let check = function () {
let offset = parseInt(expression.parse(element.dataset['offset']) || '0');
paths = paths.concat(expression.getPaths());
let sum = parseInt(expression.parse(element.dataset['sum']) || '0');
paths = paths.concat(expression.getPaths());
if((offset - limit) < 0) {
element.disabled = true;
}

View file

@ -1,9 +1,9 @@
(function (window) {
window.ls.container.get('view').add({
selector: 'data-paging-next',
controller: function(element, container, expression) {
controller: function(element, container, expression, env) {
let paths = [];
let limit = 3;
let limit = env.PAGING_LIMIT;
let check = function () {
let offset = parseInt(expression.parse(element.dataset['offset']) || '0');