admin2 - experimental

This commit is contained in:
mdipierro
2016-03-09 11:53:07 -06:00
parent 702e7cbea2
commit b487583f92
17 changed files with 451 additions and 1072 deletions
+5 -10
View File
@@ -12,29 +12,24 @@ def button(href, label):
if is_mobile: if is_mobile:
ret = A_button(SPAN(label), _href=href) ret = A_button(SPAN(label), _href=href)
else: else:
ret = A(SPAN(label), _class='button btn', _href=href) ret = A(SPAN(label), _class='btn rounded', _href=href)
return ret return ret
def button_enable(href, app): def button_enable(href, app):
if os.path.exists(os.path.join(apath(app, r=request), 'DISABLED')): if os.path.exists(os.path.join(apath(app, r=request), 'DISABLED')):
label = SPAN(T('Enable'), _style='color:red') text, classes = T("Enable"), "btn rounded red"
else: else:
label = SPAN(T('Disable'), _style='color:green') text, classes = T("Disable"), "btn rounded gree"
id = 'enable_' + app id = 'enable_' + app
return A(label, _class='button btn', _id=id, callback=href, target=id) return A(text, _class=classes, _id=id, callback=href, target=id)
def sp_button(href, label): def sp_button(href, label):
if request.user_agent().get('is_mobile'): if request.user_agent().get('is_mobile'):
ret = A_button(SPAN(label), _href=href) ret = A_button(SPAN(label), _href=href)
else: else:
ret = A(SPAN(label), _class='button special btn btn-inverse', _href=href) ret = A(SPAN(label), _class='btn pink rounded', _href=href)
return ret return ret
def helpicon(): def helpicon():
return IMG(_src=URL('static', 'images/help.png'), _alt='help') return IMG(_src=URL('static', 'images/help.png'), _alt='help')
def searchbox(elementid):
return SPAN(LABEL(IMG(_id="search_start", _src=URL('static', 'images/search.png'), _alt=T('filter')),
_class='icon', _for=elementid), ' ',
INPUT(_id=elementid, _type='text', _size=12, _class="input-medium"),
_class="searchbox")
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-489
View File
@@ -1,489 +0,0 @@
/*=============================================================
GENERAL
==============================================================*/
body { /*remember to account for the hidden area underneath
fixed navbar by adding at least 40px padding to the <body>.
Be sure to add this after the core Bootstrap CSS
and before the optional responsive CSS.
An alternative solution is to set top-margin to div#main padding-top:60px; comment this for alternative solution*/ height:auto; /*uncomment this for alternative solution*/ }
/*=============================================================
BOOTSTRAP ICONS FOLDER FIX
==============================================================*/
[class^="icon-"], [class*=" icon-"] { /* right folder for bootstrap black images/icons*/ background-image:url("../images/glyphicons-halflings.png") }
.icon-white, .nav-tabs>.active >a>[class^="icon-"], .nav-tabs>.active>a>[class*=" icon-"], .nav-pills>.active>a>[class^="icon-"], .nav-pills>.active>a>[class*=" icon-"], .nav-list>.active>a>[class^="icon-"], .nav-list>.active>a>[class*=" icon-"], .navbar-inverse .nav>.active>a>[class^="icon-"], .navbar-inverse .nav>.active>a>[class*=" icon-"], .dropdown-menu>li>a:hover>[class^="icon-"], .dropdown-menu>li>a:hover>[class*=" icon-"], .dropdown-menu>.active>a>[class^="icon-"], .dropdown-menu>.active>a>[class*=" icon-"] { /* right folder for bootstrap white images/icons*/ background-image:url("../images/glyphicons-halflings-white.png"); }
/*=============================================================
INPUT BORDER HIGHLIGHT WHEN INPUT IS FOCUSED
==============================================================*/
textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, input[type="file"]:focus, select:focus, .uneditable-input:focus { /* outline color*/ border-color:rgba(232, 149, 60, 0.8); outline:0; /*outline:thin dotted \9;*/ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); }
.web2py_grid .dropdown-menu li > a:hover, .web2py_grid .dropdown-menu li > a:focus { filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9*/ background-image:none; background-color:#E8953C; }
/*=============================================================
COLOR OF LINKS
==============================================================*/
a, a:hover { color:#E8953C; text-decoration:none; }
a:hover { color:#e2821b; }
/*=============================================================
CONTROLS and CONTAINERS
==============================================================*/
.row-buttons .btn { margin-bottom:7px; }
.sidebar .box { clear:right; margin-top:2em; border-top:1px solid #d1d1d1; padding:0 1em; }
.pwdchange>.button { margin-bottom:10px; }
input[type="file"] { margin-bottom:9px; }
.form-inline input[type="file"] { margin-bottom:0px; }
input + .help-block { margin-top:-10px; margin-bottom:4px; }
#confirm_form input.btn, .generatedbyw2p input { margin-right:4px; }
a[rel='tooltip'] span, div[rel='tooltip'] span { display:none; margin-left:-9999px; }
/*in-page browsing*/
[rel="pagebookmark"] { position:relative; }
[rel="pagebookmark"]>.component { cursor:pointer; }
[rel="pagebookmark"]>.hashstick { position:absolute; top:-54px; left:-9999px; visibility:visible; }
/* following 2 rules set the style of a small button for going to top of page*/
.tophashlink.btn { padding:2px 3px; visibility:hidden; }
.hashstick:target+.tophashlink.btn { visibility:visible; }
ul.act_edit { margin-top:4px; margin-left:20px; }
ul.act_edit .btn { margin-top:4px; margin-bottom:4px; }
ul.act_edit .file>a { white-space:pre; }
.right-full { text-align:right; }
.searchbox, .searchbox label, .searchbox input { display:inline-block; }
.buttons-row .btn { margin-bottom:9px; }
.li-controls { display:inline-block; width:180px; vertical-align:middle; }
.celled { display:inline-block; padding: 0 0 0 4px; vertical-align:top; margin-top:4px; width:700px; }
.folder { list-style-type:none; #border-left: 1px dotted #AAA; }
.folder li { list-style-type:none; }
.folder>i { display:inline-block; width:5px; height:5px; border:1px solid; background-color:#FAA732; margin-left:-4px; margin-top:-2px; border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border-radius:1px; }
.folder>i+a { padding-left:0.5em; }
.folder ul { margin-top:0.5em; margin-bottom:0.5em; }
.controls-inline .btn { margin-right:5px; }
div.web2py_counter.span6 { min-height:24px; text-align:right; }
.pagination { margin:0; }
.table { margin-bottom:10px; }
.row_buttons .btn { margin-right:4px; }
.editor-bar-column { display:inline-block; vertical-align:top; margin-right:4px; }
.editor-bar-column .input-long { width:270px; }
.editor-bar-column .input-normal { width:206px; }
.keybindings li { margin-bottom:0.5em; }
.keybindings span { padding:0.3em; border:1px solid transparent; vertical-align:middle; }
.teletype-text { font-family:monospace; font-weight:bold; font-style:normal; border-color:#999; background:#333; color:#DDD; -moz-border-radius:0.3em; border-radius:0.3em; }
.edit_language .tab_row div { display:inline-block; vertical-align:top; margin-right:4px; }
.edit_language .fake-input { height:18px; padding:4px; font-size:13px; line-height:18px; overflow:hidden; white-space:nowrap; display:inline-block; margin-bottom:9px; }
.test h3 { padding-left:9px; margin:0; font-size:16px; line-height:1; border-left:9px solid transparent; }
.test h3.passed { border-color:#009900; }
.test h3.failed { border-color:#CC0000; }
.test h3.nodoctests { border-color:#CCCC99; }
.test .test_report { width:100%; overflow:auto; }
.test_report pre { white-space:pre; }
.test div[id^="output_"]>h2 { font-size:18px; line-height:1; color:grey; }
div.center { text-align:center; }
.delete h2 { word-wrap:break-word; }
/*=============================================================
SHELL
==============================================================*/
.shell .output-wrapper { width:100%; height:30em; border:1px solid #333; }
.shell .prompt-wrapper { float:left; width:100%; overflow:hidden; height:auto; border:1px solid #333; }
.shell .prompt-container { margin-left:2.5em; }
.shell #caret { width:2.5em; float:left; margin-left:-100%; }
.shell #shellwrapper { background:white; color:#E8953C; width:100%; margin:1em 0; border:0; }
.shell #output, .shell .prompt { color:#E8953C; background:white; resize:none; border:none; width:100%; height:100%; cursor:default; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
.shell #output:focus, .shell .prompt:focus { border-color:transparent; outline:0; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; }
.shell #output pre { color: #E8953C; }
.shell #autoscroll { cursor:pointer; float:right; }
.shell .prompt, .shell #output, .shell #caret { font-size: 11pt; padding: 6px; padding-right: 0em; }
.shell #caret { padding-top:9px; }
.shell .prompt, .shell #output, .shell pre, .shell #caret { font-family: monospace; }
.shell a[rel="tooltip"] { margin-left:8px; }
/*=============================================================
PEEK
==============================================================*/
.peek .code-wrapper { width:100%; overflow:auto; white-space:pre; }
.peek table td pre { word-break:normal; white-space:pre; }
/*=============================================================
FOOTER
==============================================================*/
#footer { border-top:1px solid; text-align:center; padding:1em 0; }
#footer span, #footer select { display:inline-block; margin-bottom:0; vertical-align:middle; }
#footer select { width:auto; }
/*=============================================================
MAIN
==============================================================*/
#main { margin-top:60px; /*uncomment this for alternative solution to hidden area underneath fixed navbar issue*/ margin-bottom:60px; }
/*=============================================================
WIZARD
==============================================================*/
#wizard_nav .box { border-bottom:1px dotted; }
#wizard_nav li { margin-left:1em; margin-top:0.5em; }
.step textarea { width:auto; }
select[name='layout_theme'] { vertical-align:top; }
img#preview { margin-bottom:9px; }
/* multiselect customization*/
.ms-container { margin-bottom:5px; }
.ms-selectable, .step .ms-selection { text-align:center; }
.ms-list { text-align:left; background:white; }
.ms-container li.ms-elem-selectable:not(.disabled).ms-hover, .ms-container .ms-selection li:not(.disabled).ms-hover { background-color:#E8953C; }
.ms-container .ms-selectable { margin-right:25px; }
.ms-container .ms-selectable, .ms-container .ms-selection { background:transparent; }
.ms-container .ms-list.ms-focus { border-color:rgba(232, 149, 60, 0.8); -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); }
/* grow_input*/
ul[id$="_grow_input"] { margin-left:0; }
/* generate_form*/
#generate_form .control-group { margin-bottom:0; }
#generate_form .control-label { text-align:left; }
#generate_form .controls { padding-left:18px; margin-left:0; }
#generate_form .control-label.empty { width:142px; }
.step [rel="pagebookmark"]>.hashstick { display:none; }
/*generated page*/
.generated iframe { border:1px inset #e3e3e3; }
/*=============================================================
ERRORS TABLE / TICKET PAGE
==============================================================*/
.tablebar { margin:7px 0 7px 0; }
.tablebar input { margin-right:27px; }
.tablebar span { vertical-align:bottom; }
.table th { background: #e9e9e9; background: -moz-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #FAFAFA), color-stop(100%, #E9E9E9)); background: -webkit-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: -o-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: -ms-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9'); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9')"; /*font-size:10px; color:#444; text-transform:uppercase;*/ }
td.cbcentered, th.cbcentered { text-align:center; }
td.cbcentered>input, th.cbcentered>input { margin-top:-1px; }
.traceback div { }
.ticket_code>table td:first-child { border-left:0; }
#trck_errors table td pre { word-break:normal; white-space:pre; }
.inspect pre, .errorsource pre { word-break:normal; white-space:pre; }
.ticket_code { background-color:lightyellow; }
.ticket_code table, .ticket_code td { border-width:0px; border-collapse:collapse; width:100%; }
.ticket_code tbody tr:hover td { background-color:transparent; }
/*=============================================================
FLOT GRAPHS
==============================================================*/
.about #placeholder { width:auto; max-width:600px; height:300px; position:relative; margin:0 auto; /* for centering*/ }
/*=============================================================
THE GRID
==============================================================*/
#w2p_query_panel { min-width:20px; min-height:20px; padding:10px; margin-top:1em; background-color:#f5f5f5; border: 1px solid #e3e3e3; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }
#w2p_query_panel select, #w2p_query_panel input { margin-bottom:0; margin-right:4px; }
.web2py_grid .hidden { visibility:visible; }
.qry_pnl_btns { display:inline-block; }
#w2p_grid_addbtn, #w2p_search-form { margin-top:9px; margin-bottom:9px; }
#w2p_search-form { margin-bottom:0; }
#w2p_search-form form { margin-bottom:0; }
/*----- translate page ---*/
.languageform input { margin-bottom:0; }
.languageform input.untranslated { background-color:#FC0; }
/*=============================================================
MASKED UPLOAD INPUT (NO BOOTSTRAP RELATED)
==============================================================*/
#appupdate_file.masked {
margin: 0;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* IE 8 */
filter: alpha(opacity=0); /* IE 7 */
font-size: 100px;
position: absolute;
top: 0;
right: 0;
z-index: 410;
}
#fileselect {
padding: 4px 6px;
border: 1px solid #ccc;
border-radius: 4px;
color: #555;
cursor: default;
position: relative;
z-index: 400;
font-size: 14px;
background-color: #fff;
margin-bottom: 10px;
overflow: hidden;
}
#fileselect span {
position: absolute;
left: 6px;
top: 4px;
}
.uploadbtn {
position: absolute;
top: 3px;
right: 3px;
}
.txtPlaceholder {
font-style: italic;
color: #ccc;
}
/*=============================================================
EDIT PAGE SLIDING FILES MENU
==============================================================*/
@media (max-width: 979px) {
body.edit div#header {position:relative; z-index: 1030 !important;}
}
#editor_area, #edit_placeholder {
margin: 0;
padding: 0;
}
#editor_area {
position: relative;
box-sizing: border-box;
}
#files {
width: auto;
height: 100%;
margin: 0;
padding: 0;
position: fixed;
top: 0px;
left: 0px;
z-index: 1031;
border-right: 3px solid #000;
/* animation (it doesn't work in IE<10) */
-moz-transition: all 0.4s;
-webkit-transition: all 0.4s;
-o-transition: all 0.4s;
transition: all 0.4s;
}
#files:hover, #files:focus {
left: 0px !important;
}
#files, .files-toggle {
background: #1b1b1b;
opacity: 0.98;
}
.files-toggle {
width: 18px;
height: 86px;
border-radius: 0px 4px 4px 0px;
color: #999;
position: absolute;
top: 60px;
right: -18px;
cursor: default;
}
.arrow {
display: block;
position: absolute;
top: 8px;
width: 18px;
height: 70px;
background: url(../images/files_toggle.png) no-repeat;
}
.files-menu {
height: 100%;
overflow: auto;
}
#filelist {
position: relative;
top: 60px;
padding-bottom: 60px;
}
#filelist li {
padding-right: 8px;
width: 100%;
}
#filelist li>a {
text-shadow: none;
}
/*=============================================================
MEDIA QUERIES
==============================================================*/
@media (max-width: 800px) { .step [rel="pagebookmark"]>.hashstick { /*top:-54px;*/ display:block; }
}
@media (max-width: 767px) { [rel="pagebookmark"]>.hashstick { top:0; }
/*-----------------------------------
main
-------------------------------------*/
#main { margin-top:0; }
/*-----------------------------------
footer
-------------------------------------*/
#footer { margin-left: -20px; margin-right: -20px; padding-left: 20px; padding-right: 20px; }
/*-----------------------------------
errors page
-------------------------------------*/
#trck_errors { table-layout:fixed; }
#trck_errors .column1 { width:20px; }
#trck_errors .column2 { width:45px; }
#trck_errors .column3 { width:150px; }
#trck_errors .columnN { width:55px; }
#trck_errors .columnN1 { width:138px; }
.ticket_code, .inspect.resp1, .inspect.controls pre, .errorsource { width:100%; overflow:auto; }
.ticket_code>table { width:100%; }
.celled { width:320px; }
}
@media (max-width: 480px) { .qry_pnl_btns { display:block; margin-top:4px; }
/*-----------------------------------
wizard
-------------------------------------*/
#generate_form .control-label { float:left; width:160px; padding-top:5px; }
.inspect>code { display:block; white-space:normal; }
.li-controls { }
.celled { width:165px; }
}
/*-----------------------------------
miscellaneous
-------------------------------------*/
h4.editableapp, h4.currentapp { padding: 5px 0 5px 54px; display: inline; }
h4.editableapp { background: #fff url(../images/folder.png) no-repeat; }
h4.currentapp { background: #fff url(../images/folder_locked.png) no-repeat; }
.w2p_flash { position:fixed; width:50%; top:49px; left:25%; right:25%; cursor:default; text-align:center; z-index:5620; }
span#closeflash {position:absolute; top:1px; right:-1px; font-size:150%; border:1px solid black; border-color: transparent transparent #fbeed5 #fbeed5; border-radius: 0 0 0 4px; width:22px; }
span#closeflash:hover {font-weight:bold; cursor:pointer; }
table.twitter{ background-color: transparent; }
table.twitter tr td {vertical-align: top; padding: 5px; }
table.twitter tr { border-bottom: 1px solid #a0a0a0; }
div.error_wrapper {margin-top:-10px; margin-bottom:8px; padding-left:2px; color:#d62e2b; }
.twitter-timeline >iframe{padding: 1em 0;}
+10 -6
View File
@@ -1,7 +1,11 @@
.calendar{z-index:99;position:relative;display:none;background:#fff;border:2px solid #000;font-size:11px;color:#000;cursor:default;font-family:Arial,Helvetica,sans-serif; .calendar {z-index:2000;position:relative;margin-top:140px;display:none;background-color:white;border:1px solid #000;color:#000;cursor:default;box-shadow:0 0 10px #666}.calendar * {text-align: center;font-size:10px!important}
border-radius: 10px; .calendar table {border-collapse:collapse}
-moz-border-radius: 10px; .calendar tbody tr:hover {background-color:#fbf6d9}
-webkit-border-radius: 10px; .calendar td, th {padding:5px; vertical-align:top; text-align:left; border:0}
}.calendar table{margin:0px;font-size:11px;color:#000;cursor:default;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;color:#fff;background:#000;}.calendar .nav{background:#000;color:#fff}.calendar thead .title{font-weight:bold;padding:1px;background:#000;color:#fff;text-align:center;}.calendar thead .name{padding:2px;text-align:center;background:#bbb;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite {background-color:#666;}.calendar thead .active{padding:2px 0 0 2px;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;background:#bbb;}.calendar tbody .rowhilite td{background:#ddd;}.calendar tbody td.hilite{background:#bbb;}.calendar tbody td.active{background:#bbb;}.calendar tbody td.selected{font-weight:bold;background:#ddd;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#bbb;padding:1px;background:#000;color:#fff;text-align:center;}.calendar tfoot .hilite{background:#ddd;}.calendar tfoot .active{}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;background:#e4e0d8;padding:1px;z-index:100;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{padding:1px 0;text-align:center;background-color:#bbb;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;font-weight:bold;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;}.hour,.minute{font-size:2em;} .calendar thead tr {background-color:#f1f1f1}
.calendar tbody tr {border-bottom:2px solid #f1f1f1}
.calendar th {font-weight:string; padding:5px; vertical-align:bottom; text-align:left}
.calendar thead th {vertical-align:bottom}
.calendar tbody th {vertical-align:top}
#CP_hourcont{z-index:99;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:99;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:99} #CP_hourcont{z-index:2000;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:2000;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:2000;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:2000;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:2000}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,33 +0,0 @@
// this code improves bootstrap menus and adds dropdown support
jQuery(function(){
jQuery('.nav>li>a').each(function(){
if(jQuery(this).parent().find('ul').length)
jQuery(this).attr({'class':'dropdown-toggle','data-toggle':'dropdown'}).append('<b class="caret"></b>');
});
jQuery('.nav li li').each(function(){
if(jQuery(this).find('ul').length)
jQuery(this).addClass('dropdown-submenu');
});
function adjust_height_of_collapsed_nav() {
var cn = jQuery('div.collapse');
if (cn.get(0)) {
var cnh = cn.get(0).style.height;
if (cnh>'0px'){
cn.css('height','auto');
}
}
}
function hoverMenu(){
jQuery('ul.nav a.dropdown-toggle').parent().hover(function(){
adjust_height_of_collapsed_nav();
var mi = jQuery(this).addClass('open');
mi.children('.dropdown-menu').stop(true, true).delay(200).fadeIn(400);
}, function(){
var mi = jQuery(this);
mi.children('.dropdown-menu').stop(true, true).delay(200).fadeOut(function(){mi.removeClass('open')});
});
}
hoverMenu(); // first page load
jQuery(window).resize(hoverMenu); // on resize event
jQuery('ul.nav li.dropdown a').click(function(){window.location=jQuery(this).attr('href');});
});
@@ -1,5 +1,4 @@
{{extend 'layout.html'}} {{extend 'layout.html'}}
{{block sectionclass}}about{{end}}
<!-- begin "about" block --> <!-- begin "about" block -->
<h2>{{=T("About application")}} "{{=app}}"</h2> <h2>{{=T("About application")}} "{{=app}}"</h2>
<h3>{{=T("About")}} {{=app}}</h3> <h3>{{=T("About")}} {{=app}}</h3>
+116 -119
View File
@@ -9,19 +9,16 @@ def peekfile(path,file,vars={},title=None):
return A(file.replace('\\\\','/'),_title=title,_href=URL('peek', args=args, vars=vars)) return A(file.replace('\\\\','/'),_title=title,_href=URL('peek', args=args, vars=vars))
def editfile(path,file,vars={}): def editfile(path,file,vars={}):
args=(path,file) if 'app' in vars else (app,path,file) args=(path,file) if 'app' in vars else (app,path,file)
return A(SPAN(T('Edit')),_class='button editbutton btn btn-mini',_href=URL('edit', args=args, vars=vars)) return A(T('Edit'),_class='btn small rounded black',_href=URL('edit', args=args, vars=vars))
def testfile(path,file): def testfile(path,file):
return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), return A(I(_class="fa fa-cog"),**{
SPAN(T("Run tests in this file (to run all files, you may also use the button labelled 'test')"))), '_class':'btn small rounded black',
_class='icon test', '_data-tooltip':T("Run tests in this file (to run all files, you may also use the but\
_href=URL('test', args=(app, file)), ton labelled 'test')")})
_rel="tooltip",
**{'_data-placement':'right',
'_data-original-title':T("Run tests in this file (to run all files, you may also use the button labelled 'test')")})
def editlanguagefile(path,file,vars={}): def editlanguagefile(path,file,vars={}):
return A(SPAN(T('Edit')),_class='button editbutton btn btn-mini',_href=URL('edit_language', args=(app, path, file), vars=vars)) return A(T('Edit'),_class='button editbutton btn rounded small',_href=URL('edit_language', args=(app, path, file), vars=vars))
def editpluralsfile(path,file,vars={}): def editpluralsfile(path,file,vars={}):
return A(SPAN(T('Edit')),_class='button editbutton btn btn-mini',_href=URL('edit_plurals', args=(app, path, file), vars=vars)) return A(T('Edit'),_class='button editbutton btn rounded small',_href=URL('edit_plurals', args=(app, path, file), vars=vars))
def file_upload_form(location, anchor=None): def file_upload_form(location, anchor=None):
form=FORM( form=FORM(
LABEL(T("upload file:")), LABEL(T("upload file:")),
@@ -59,13 +56,8 @@ def upload_plugin_form(app, anchor=None):
return form return form
def deletefile(arglist, vars={}): def deletefile(arglist, vars={}):
vars.update({'sender':request.function+'/'+app}) vars.update({'sender':request.function+'/'+app})
return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), return A(I(_class='fa fa-trash'),_class="red rounded small btn",
SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _href=URL('delete',args=arglist,vars=vars))
_href=URL('delete',args=arglist,vars=vars),
_class='icon delete',
_rel="tooltip",
**{'_data-placement':'right',
'_data-original-title':T('Delete this file (you will be asked to confirm deletion)')})
}} }}
{{block sectionclass}}design{{end}} {{block sectionclass}}design{{end}}
@@ -74,32 +66,33 @@ def deletefile(arglist, vars={}):
<h2>{{=T("Edit application")}} "{{=A(app,_href=URL(app,'default','index'),_target="_blank")}}"</h2> <h2>{{=T("Edit application")}} "{{=A(app,_href=URL(app,'default','index'),_target="_blank")}}"</h2>
<!-- COLLAPSE/JUMP-TO BUTTONS --> <!-- COLLAPSE/JUMP-TO BUTTONS -->
<div class="right-full controls"> <div class="container">
<p class="buttons-row"> <div class="fill">
{{=searchbox('search')}} <input placeholder="filter" id="search" style="left:100px"/>
<a class="button special btn btn-inverse" href="#" onclick="jQuery('h3>span').click();return false"><span>{{=T("collapse/expand all")}}</span></a> </div>
<span class="buttongroup"> <div class="fill">
{{=button('#models', T("models"))}} <div class="padded">
{{=button('#controllers', T("controllers"))}} <a class="btn rounded small black" href="#" onclick="jQuery('.accordion>[type=checkbox]').click();return false">{{=T("collapse/expand all")}}</a>
{{=button('#views', T("views"))}} <a href="#models" class="btn small rounded orange">{{=T("models")}}</a>
{{=button('#languages', T("languages"))}} <a href="#controllers" class="btn small rounded orange">{{=T("controllers")}}</a>
{{=button('#static', T("static"))}} <a href="#views" class="btn small rounded orange">{{=T("views")}}</a>
{{=button('#modules', T("modules"))}} <a href="#models" class="btn small rounded orange">{{=T("languages")}}</a>
{{=button('#private', T("private files"))}} <a href="#static" class="btn small rounded orange">{{=T("static")}}</a>
{{=button('#plugins', T("plugins"))}} <a href="#models" class="btn small rounded orange">{{=T("modules")}}</a>
</span> <a href="#private" class="btn small rounded orange">{{=T("private files")}}</a>
</p> <a href="#plugins" class="btn small rounded orange">{{=T("plugins")}}</a>
</div>
</div>
</div> </div>
<!-- MODELS --> <!-- MODELS -->
<h3 id="_models" rel="pagebookmark"> <h5 id="_models">
<span class="component" onclick="collapse('models_inner');">{{=T("Models")}}</span> <label class="component" for="models_inner" data-tooltip="{{=T('The data representation, define database tables and sets')}}">{{=T("Models")}}</label>
<a href="#models" rel="tooltip" data-placement="right" data-original-title="{{=T('The data representation, define database tables and sets')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("The data representation, define database tables and sets")}}</span> <input type="checkbox" id="models_inner" checked>
</a><span id="models" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="models_inner" class="component_contents">
{{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}} {{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}}
<div class="controls comptools"> <div class="controls comptools">
{{=button(URL(a=app,c='appadmin',f='index'), T('database administration'))}} {{=button(URL(a=app,c='appadmin',f='index'), T('database administration'))}}
@@ -111,7 +104,7 @@ def deletefile(arglist, vars={}):
<ul class="unstyled act_edit"> <ul class="unstyled act_edit">
{{for m in models:}} {{for m in models:}}
{{id="models__"+m.replace('.','__')}} {{id="models__"+m.replace('.','__')}}
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick">&nbsp;</span> <li id="{{='_'+id}}"><span id="{{=id}}" class="hashstick">&nbsp;</span>
<span class="filetools controls"> <span class="filetools controls">
{{=editfile('models',m, dict(id=id))}} {{=editfile('models',m, dict(id=id))}}
{{=deletefile([app, 'models', m], dict(id=id, id2='models'))}} {{=deletefile([app, 'models', m], dict(id=id, id2='models'))}}
@@ -126,13 +119,14 @@ def deletefile(arglist, vars={}):
{{pass}} {{pass}}
</ul> </ul>
{{pass}} {{pass}}
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form1').slideToggle()" class="btn btn-mini">{{=T('Create')}}</button> <button onclick="jQuery('#form1').slideToggle()" class="btn rounded small">{{=T('Create')}}</button>
<div id="form1" class="row-fluid" style="display:none"> <div id="form1" class="row-fluid" style="display:none">
<div class="span3">{{=file_create_form('%s/models/' % app, 'models')}}</div> <div class="span3">{{=file_create_form('%s/models/' % app, 'models')}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- FIND CONTROLLER FUNCTIONS --> <!-- FIND CONTROLLER FUNCTIONS -->
{{ {{
@@ -141,14 +135,13 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
}} }}
<!-- CONTROLLERS --> <!-- CONTROLLERS -->
<h3 id="_controllers" rel="pagebookmark"> <h5 id="_controllers">
<span class="component" onclick="collapse('controllers_inner');">{{=T("Controllers")}}</span> <label class="component" for="controllers_inner" data-tooltip="{{=T('The application logic, each URL path is mapped in one exposed function in the controller')}}">{{=T("Controllers")}}</label>
<a href="#controllers" rel="tooltip" data-placement="right" data-original-title="{{=T('The application logic, each URL path is mapped in one exposed function in the controller')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("The application logic, each URL path is mapped in one exposed function in the controller")}}</span> <input type="checkbox" id="controllers_inner" checked>
</a><span id="controllers" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="controllers_inner" class="component_contents">
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}} {{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
<div class="controls comptools"> <div class="controls comptools">
{{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}} {{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}}
@@ -158,7 +151,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
<ul class="unstyled act_edit"> <ul class="unstyled act_edit">
{{for c in controllers:}} {{for c in controllers:}}
{{id="controllers__"+c.replace('.','__')}} {{id="controllers__"+c.replace('.','__')}}
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick">&nbsp;</span> <li id="{{='_'+id}}"><span id="{{=id}}" class="hashstick">&nbsp;</span>
<span class="filetools controls"> <span class="filetools controls">
{{=editfile('controllers',c, dict(id=id))}} {{=editfile('controllers',c, dict(id=id))}}
{{=deletefile([app, 'controllers', c], dict(id=id, id2='controllers'))}} {{=deletefile([app, 'controllers', c], dict(id=id, id2='controllers'))}}
@@ -174,23 +167,23 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
{{pass}} {{pass}}
</ul> </ul>
{{pass}} {{pass}}
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form2').slideToggle()" class="btn btn-mini">{{=T('Create')}}</button> <button onclick="jQuery('#form2').slideToggle()" class="btn rounded small">{{=T('Create')}}</button>
<div id="form2" class="row-fluid" style="display:none"> <div id="form2" class="row-fluid" style="display:none">
<div class="span3">{{=file_create_form('%s/controllers/' % app, 'controllers')}}</div> <div class="span3">{{=file_create_form('%s/controllers/' % app, 'controllers')}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- VIEWS --> <!-- VIEWS -->
<h3 id="_views" rel="pagebookmark"> <h5 id="_views">
<span class="component" onclick="collapse('views_inner');">{{=T("Views")}}</span> <label class="component" for="views_inner" data-tooltip="{{=T('The presentations layer, views are also known as templates')}}">{{=T("Views")}}</label>
<a href="#views" rel="tooltip" data-placement="right" data-original-title="{{=T('The presentations layer, views are also known as templates')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("The presentations layer, views are also known as templates")}}</span> <input type="checkbox" id="views_inner" checked>
</a><span id="views" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="views_inner" class="component_contents">
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{else:}} {{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{else:}}
<div class="controls comptools"> <div class="controls comptools">
{{=button(LAYOUTS_APP, T("Download layouts from repository"))}} {{=button(LAYOUTS_APP, T("Download layouts from repository"))}}
@@ -198,7 +191,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
<ul class="unstyled act_edit"> <ul class="unstyled act_edit">
{{for c in views:}} {{for c in views:}}
{{id="views__"+c.replace('/','__').replace('.','__')}} {{id="views__"+c.replace('/','__').replace('.','__')}}
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick">&nbsp;</span> <li id="{{='_'+id}}"><span id="{{=id}}" class="hashstick">&nbsp;</span>
<span class="filetools controls"> <span class="filetools controls">
{{=editfile('views',c, dict(id=id))}} {{=editfile('views',c, dict(id=id))}}
{{=deletefile([app, 'views', c], dict(id=id, id2='views'))}} {{=deletefile([app, 'views', c], dict(id=id, id2='views'))}}
@@ -214,23 +207,23 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
{{pass}} {{pass}}
</ul> </ul>
{{pass}} {{pass}}
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form3').slideToggle()" class="btn btn-mini">{{=T('Create')}}</button> <button onclick="jQuery('#form3').slideToggle()" class="btn rounded small">{{=T('Create')}}</button>
<div id="form3" class="row-fluid" style="display:none"> <div id="form3" class="row-fluid" style="display:none">
<div class="span3">{{=file_create_form('%s/views/' % app, 'views')}}</div> <div class="span3">{{=file_create_form('%s/views/' % app, 'views')}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- LANGUAGES --> <!-- LANGUAGES -->
<h3 id="_languages" rel="pagebookmark"> <h5 id="_languages">
<span class="component" onclick="collapse('languages_inner');">{{=T("Languages")}}</span> <label class="component" for="languages_inner" data-tooltip="{{=T('Translation strings for the application')}}">{{=T("Languages")}}</label>
<a href="#languages" rel="tooltip" data-placement="right" data-original-title="{{=T('Translation strings for the application')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("Translation strings for the application")}}</span> <input type="checkbox" id="languages_inner" checked>
</a><span id="languages" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="languages_inner" class="component_contents">
{{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{else:}} {{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{else:}}
<div class="controls comptools"> <div class="controls comptools">
{{=button(URL('update_languages/'+app), T('update all languages'))}} {{=button(URL('update_languages/'+app), T('update all languages'))}}
@@ -239,7 +232,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
{{for lang in sorted(languages): {{for lang in sorted(languages):
file = lang+'.py' file = lang+'.py'
id = "languages__"+file.replace('.','__')}} id = "languages__"+file.replace('.','__')}}
<li id="{{='_'+id}}" rel="pagebookmark" class="li-row"><span id="{{=id}}" class="hashstick">&nbsp;</span> <li id="{{='_'+id}}" class="li-row"><span id="{{=id}}" class="hashstick">&nbsp;</span>
<span class="li-controls"> <span class="li-controls">
<span class="filetools controls"> <span class="filetools controls">
{{=editlanguagefile('languages',file)}} {{=editlanguagefile('languages',file)}}
@@ -278,23 +271,23 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
{{pass}} {{pass}}
</ul> </ul>
{{pass}} {{pass}}
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form4').slideToggle()" class="btn btn-mini">{{=T('Create')}}</button> <button onclick="jQuery('#form4').slideToggle()" class="btn rounded small">{{=T('Create')}}</button>
<div id="form4" class="row-fluid" style="display:none"> <div id="form4" class="row-fluid" style="display:none">
<div class="span3">{{=file_create_form('%s/languages/' % app, 'languages', T('(something like "it-it")'))}}</div> <div class="span3">{{=file_create_form('%s/languages/' % app, 'languages', T('(something like "it-it")'))}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- STATIC --> <!-- STATIC -->
<h3 id="_static" rel="pagebookmark"> <h5 id="_static">
<span class="component" onclick="collapse('static_inner');">{{=T("Static")}}</span> <label class="component" for="static_inner" data-tooltip="{{=T('These files are served without processing, your images go here')}}">{{=T("Static")}}</label>
<a href="#static" rel="tooltip" data-placement="right" data-original-title="{{=T('These files are served without processing, your images go here')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("These files are served without processing, your images go here")}}</span> <input type="checkbox" id="static_inner" checked>
</a><span id="static" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="static_inner" class="component_contents">
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{else:}} {{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{else:}}
<ul class="unstyled act_edit"> <ul class="unstyled act_edit">
{{ {{
@@ -314,7 +307,8 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
else: else:
path = path[:-1] path = path[:-1]
}} }}
</ul></li> </ul>
</li>
{{ {{
pass pass
pass pass
@@ -333,30 +327,30 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
}} }}
</ul> </ul>
{{pass}} {{pass}}
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form5').slideToggle()" class="btn btn-mini">{{=T('Create/Upload')}}</button> <button onclick="jQuery('#form5').slideToggle()" class="btn rounded small">{{=T('Create/Upload')}}</button>
<div id="form5" class="row-fluid" style="display:none"> <div id="form5" class="row-fluid" style="display:none">
<div class="span3">{{=file_create_form('%s/static/' % app, 'static')}}<em>{{=T('or alternatively')}}</em></div> <div class="span3">{{=file_create_form('%s/static/' % app, 'static')}}<em>{{=T('or alternatively')}}</em></div>
<div class="span3">{{=file_upload_form('%s/static/' % app, 'static')}}</div> <div class="span3">{{=file_upload_form('%s/static/' % app, 'static')}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- MODULES --> <!-- MODULES -->
<h3 id="_modules" rel="pagebookmark"> <h5 id="_modules">
<span class="component" onclick="collapse('modules_inner');">{{=T("Modules")}}</span> <label class="component" for="modules_inner" data-tooltip="{{=T('Additional code for your application')}}">{{=T("Modules")}}</label>
<a href="#modules" rel="tooltip" data-placement="right" data-original-title="{{=T('Additional code for your application')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("Additional code for your application")}}</span> <input type="checkbox" id="modules_inner" checked>
</a><span id="modules" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="modules_inner" class="component_contents">
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{else:}} {{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{else:}}
<ul class="unstyled act_edit"> <ul class="unstyled act_edit">
{{for m in modules:}} {{for m in modules:}}
{{id="modules__"+m.replace('/','__').replace('.','__')}} {{id="modules__"+m.replace('/','__').replace('.','__')}}
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick">&nbsp;</span> <li id="{{='_'+id}}"><span id="{{=id}}" class="hashstick">&nbsp;</span>
<span class="filetols controls"> <span>
{{=editfile('modules',m,dict(id=id))}} {{=editfile('modules',m,dict(id=id))}}
{{if m!='__init__.py':}} {{if m!='__init__.py':}}
{{=deletefile([app, 'modules', m], dict(id=id, id2='modules'))}} {{=deletefile([app, 'modules', m], dict(id=id, id2='modules'))}}
@@ -369,24 +363,24 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
{{pass}} {{pass}}
</ul> </ul>
{{pass}} {{pass}}
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form6').slideToggle()" class="btn btn-mini">{{=T('Create/Upload')}}</button> <button onclick="jQuery('#form6').slideToggle()" class="btn rounded small">{{=T('Create/Upload')}}</button>
<div id="form6" class="row-fluid" style="display:none"> <div id="form6" class="row-fluid" style="display:none">
<div class="span3">{{=file_create_form('%s/modules/' % app, 'modules')}}<em>{{=T('or alternatively')}}</em></div> <div class="span3">{{=file_create_form('%s/modules/' % app, 'modules')}}<em>{{=T('or alternatively')}}</em></div>
<div class="span3">{{=file_upload_form('%s/modules/' % app, 'modules')}}</div> <div class="span3">{{=file_upload_form('%s/modules/' % app, 'modules')}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- PRIVATE --> <!-- PRIVATE -->
<h3 id="_private" rel="pagebookmark"> <h5 id="_private">
<span class="component" onclick="collapse('private_inner');">{{=T("Private files")}}</span> <label class="component" for="private_inner" data-tooltip="{{=T('These files are not served, they are only available from within your app')}}">{{=T("Private files")}}</label>
<a href="#private" rel="tooltip" data-placement="right" data-original-title="{{=T('These files are not served, they are only available from within your app')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("These files are not served, they are only available from within your app")}}</span> <input type="checkbox" id="private_inner" checked>
</a><span id="private" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="private_inner" class="component_contents">
{{if not privates:}}<p><strong>{{=T("There are no private files")}}</strong></p>{{else:}} {{if not privates:}}<p><strong>{{=T("There are no private files")}}</strong></p>{{else:}}
<ul class="unstyled act_edit"> <ul class="unstyled act_edit">
{{ {{
@@ -426,24 +420,24 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
}} }}
{{pass}} {{pass}}
</ul> </ul>
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form7').slideToggle()" class="btn btn-mini">{{=T('Create/Upload')}}</button> <button onclick="jQuery('#form7').slideToggle()" class="btn rounded small">{{=T('Create/Upload')}}</button>
<div id="form7" class="row-fluid" style="display:none"> <div id="form7" class="row-fluid" style="display:none">
<div class="span3">{{=file_create_form('%s/private/' % app, 'private')}}<em>{{=T('or alternatively')}}</em></div> <div class="span3">{{=file_create_form('%s/private/' % app, 'private')}}<em>{{=T('or alternatively')}}</em></div>
<div class="span3">{{=file_upload_form('%s/private/' % app, 'private')}}</div> <div class="span3">{{=file_upload_form('%s/private/' % app, 'private')}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- PLUGINS --> <!-- PLUGINS -->
<h3 id="_plugins" rel="pagebookmark"> <h5 id="_plugins">
<span class="component" onclick="collapse('plugins_inner');">{{=T("Plugins")}}</span> <label class="component" for="plugins_inner" data-tooltip="{{=T('To create a plugin, name a file/folder plugin_[name]')}}">{{=T("Plugins files")}}</label>
<a href="#plugins" rel="tooltip" data-placement="right" data-original-title="{{=T('To create a plugin, name a file/folder plugin_[name]')}}"> </h5>
{{=helpicon()}} <div class="accordion">
<span>{{=T("To create a plugin, name a file/folder plugin_[name]")}}</span> <input type="checkbox" id="plugins_inner" checked>
</a><span id="plugins" class="hashstick">&nbsp;</span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a> <div>
</h3> <a href="#" class="right btn rounded small yellow">top</a>
<div id="plugins_inner" class="component_contents">
{{if plugins:}} {{if plugins:}}
<ul class="unstyled act_edit"> <ul class="unstyled act_edit">
{{for plugin in plugins:}} {{for plugin in plugins:}}
@@ -459,14 +453,16 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
<div class="controls comptools"> <div class="controls comptools">
{{=button(URL(c="default", f="plugins", args=[app,]), T('Download plugins from repository'))}} {{=button(URL(c="default", f="plugins", args=[app,]), T('Download plugins from repository'))}}
</div> </div>
<div class="controls formfield"> <div class="silver rounded padded">
<button onclick="jQuery('#form8').slideToggle()" class="btn btn-mini">{{=T('Upload')}}</button> <button onclick="jQuery('#form8').slideToggle()" class="btn rounded small">{{=T('Upload')}}</button>
<div id="form8" class="row-fluid" style="display:none"> <div id="form8" class="row-fluid" style="display:none">
<div class="row-fluid"> <div class="row-fluid">
<div class="span3">{{=upload_plugin_form(app, 'plugins')}}</div> <div class="span3">{{=upload_plugin_form(app, 'plugins')}}</div>
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
<script> <script>
function filter_files() { function filter_files() {
@@ -493,3 +489,4 @@ jQuery(document).ready(function(){
}); });
</script> </script>
<!-- end "design" block --> <!-- end "design" block -->
+1 -1
View File
@@ -32,7 +32,7 @@ def file_create_form(location, anchor=None, helptext=""):
<!-- begin "edit" block --> <!-- begin "edit" block -->
{{ {{
def shortcut(combo, description): def shortcut(combo, description):
return XML('<li class="span5"><span class="teletype-text">%s</span><span>%s</span></li>' % (combo, description)) return XML('<li><span class="teletype-text">%s</span><span>%s</span></li>' % (combo, description))
def listfiles(app, dir, regexp='.*\.py$'): def listfiles(app, dir, regexp='.*\.py$'):
files = sorted( files = sorted(
listdir(apath('%(app)s/%(dir)s/' % {'app':app, 'dir':dir}, r=request), regexp)) listdir(apath('%(app)s/%(dir)s/' % {'app':app, 'dir':dir}, r=request), regexp))
+6 -7
View File
@@ -1,15 +1,14 @@
{{extend 'layout.html'}} {{extend 'layout.html'}}
{{block sectionclass}}login{{end}}
<!-- begin "index" block --> <!-- begin "index" block -->
<h2>web2py&trade; {{=T('Web Framework')}}</h2> <h2>web2py&trade; {{=T('Web Framework')}}</h2>
<h3>{{=T('Login to the Administrative Interface')}}</h3> <div class="twothirds padded lifted">
<div class="form row-fluid">
{{if request.is_https or request.is_local:}} {{if request.is_https or request.is_local:}}
<form action="{{=URL(r=request)}}" method="post" class="span4 well"> <form action="{{=URL(r=request)}}" method="post" class="span4 well">
<label for="password">{{=T('Administrator Password:')}}</label> <h5>{{=T('Login to the Administrative Interface')}}</h5>
<input type="password" name="password" id="password"/> <label class="spaced" for="password">{{=T('Administrator Password:')}}</label>
<input type="hidden" name="send" value="{{=send}}"/> <input class="spaced" type="password" name="password" id="password"/>
<div class="controls"><button type="submit" name="login" class="btn">{{=T('Login')}}</button></div> <input class="spaced" type="hidden" name="send" value="{{=send}}"/>
<button class="spaced" type="submit" name="login">{{=T('Login')}}</button>
</form> </form>
{{else:}} {{else:}}
<p class="help span7 alert alert-block alert-warning">{{=T('ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.')}}</p> <p class="help span7 alert alert-block alert-warning">{{=T('ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.')}}</p>
+24 -22
View File
@@ -1,19 +1,19 @@
{{extend 'layout.html'}} {{extend 'layout.html'}}
{{import os, glob}} {{import os, glob}}
{{block sectionclass}}site{{end}}
<!-- begin "site" block --> <!-- begin "site" block -->
<div class="row-fluid"> <div class="container">
<div class="applist f60 span7"> <div class="twothirds">
<div class="applist_inner"> <div class="padded">
<h2>{{=T("Installed applications")}}</h2> <h2>{{=T("Installed applications")}}</h2>
<table width="100%" class="table"> <table>
<tbody>
{{for a in apps:}} {{for a in apps:}}
<tr>{{buttons = []}} <tr>{{buttons = []}}
<td> <td>
{{if a==request.application:}} {{if a==request.application:}}
<h4 class="currentapp">{{=a}} ({{=T('currently running')}})</h4> <a class="btn rounded gray">{{=a}} ({{=T('currently running')}})</a>
{{else:}} {{else:}}
<h4 class="editableapp">{{=A(a,_href=URL(a,'default','index'))}}</h4> <a class="btn rounded orange" href="{{=URL(a,'default','index')}}">{{=a}}</a>
{{if MULTI_USER_MODE and db.app(name=a):}}(created by {{="%(first_name)s %(last_name)s" % db.auth_user[db.app(name=a).owner]}}){{pass}} {{if MULTI_USER_MODE and db.app(name=a):}}(created by {{="%(first_name)s %(last_name)s" % db.auth_user[db.app(name=a).owner]}}){{pass}}
{{if not os.path.exists('applications/%s/compiled' % a):}} {{if not os.path.exists('applications/%s/compiled' % a):}}
{{buttons.append((URL('design',args=a), T("Edit")))}} {{buttons.append((URL('design',args=a), T("Edit")))}}
@@ -45,26 +45,28 @@
{{pass}} {{pass}}
</td> </td>
<td> <td>
<div class="btn-group"> <ul class="menu">
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#"> <li>
{{=T('Manage')}} <a class="btn white rounded">{{=T('Manage')}}</a>
<span class="caret"></span> <ul>
</a>
<ul class="dropdown-menu">
{{for link,name in buttons:}} {{for link,name in buttons:}}
{{=LI(A(name,_href=link))}} {{=LI(A(name,_href=link))}}
{{pass}} {{pass}}
</ul> </ul>
</div> </li>
</ul>
</td>
<td>
{{=button_enable(URL('enable',args=a), a) if a!='admin' else ''}} {{=button_enable(URL('enable',args=a), a) if a!='admin' else ''}}
</td> </td>
</tr> </tr>
{{pass}} {{pass}}
</tbody>
</table> </table>
</div> </div>
</div> <!-- /applist --> </div> <!-- /applist -->
<div class="sidebar fl60 span5"> <div class="third black">
<div class="sidebar_inner controls well well-small"> <div class="padded">
<!-- CHANGE ADMIN PWD --> <!-- CHANGE ADMIN PWD -->
<div class="pwdchange pull-right"> <div class="pwdchange pull-right">
{{if MULTI_USER_MODE:}} {{if MULTI_USER_MODE:}}
@@ -77,7 +79,7 @@
{{if is_manager():}} {{if is_manager():}}
<!-- VERSION --> <!-- VERSION -->
<div class="box"> <div class="box">
<h4>{{=T("Version")}}</h4> <h6>{{=T("Version")}}</h6>
<p> <p>
<tt>{{=myversion}}</tt><br/> <tt>{{=myversion}}</tt><br/>
{{running_on = T("Running on %s", request.env.server_software or 'Unknown')}} {{running_on = T("Running on %s", request.env.server_software or 'Unknown')}}
@@ -100,7 +102,7 @@
{{if MULTI_USER_MODE and is_manager():}} {{if MULTI_USER_MODE and is_manager():}}
<!-- MULTI_USER_INTERFACE --> <!-- MULTI_USER_INTERFACE -->
<div class="box"> <div class="box">
<h4>{{=T("Multi User Mode")}}</h4> <h6>{{=T("Multi User Mode")}}</h6>
<p class="row-buttons"> <p class="row-buttons">
{{=button(URL('bulk_register'),T('Bulk Register'))}} {{=button(URL('bulk_register'),T('Bulk Register'))}}
{{=button(URL('manage_students',vars={'order':'auth_user.id'}),T('Manage Students'))}} {{=button(URL('manage_students',vars={'order':'auth_user.id'}),T('Manage Students'))}}
@@ -109,7 +111,7 @@
{{pass}} {{pass}}
<!-- SCAFFOLD APP --> <!-- SCAFFOLD APP -->
<div class="box"> <div class="box">
<h4>{{=T("New simple application")}}</h4> <h6>{{=T("New simple application")}}</h6>
{{=form_create.custom.begin}} {{=form_create.custom.begin}}
{{=LABEL(T("Application name:"))}} {{=LABEL(T("Application name:"))}}
{{=form_create.custom.widget.name}} {{=form_create.custom.widget.name}}
@@ -118,7 +120,7 @@
</div> <!-- /SCAFFOLD APP --> </div> <!-- /SCAFFOLD APP -->
<!-- UPLOAD PACKAGE --> <!-- UPLOAD PACKAGE -->
<div class="box"> <div class="box">
<h4>{{=T("Upload and install packed application")}}</h4> <h6>{{=T("Upload and install packed application")}}</h6>
{{=form_update.custom.begin}} {{=form_update.custom.begin}}
<label for="appupdate_name">{{=T("Application name:")}}</label> <label for="appupdate_name">{{=T("Application name:")}}</label>
{{=form_update.custom.widget.name}} {{=form_update.custom.widget.name}}
@@ -136,7 +138,7 @@
</div> <!-- /UPLOAD PACKAGE --> </div> <!-- /UPLOAD PACKAGE -->
<!-- DEPLOY ON GAE --> <!-- DEPLOY ON GAE -->
<div class="box"> <div class="box">
<h4>{{=T("Deploy")}}</h4> <h6>{{=T("Deploy")}}</h6>
<p class="row-buttons"> <p class="row-buttons">
{{=button(URL('gae','deploy'), T('Deploy on Google App Engine'))}} {{=button(URL('gae','deploy'), T('Deploy on Google App Engine'))}}
{{=button(URL('openshift','deploy'),T('Deploy to OpenShift'))}} {{=button(URL('openshift','deploy'),T('Deploy to OpenShift'))}}
@@ -145,7 +147,7 @@
</div> <!-- /DEPLOY ON GAE --> </div> <!-- /DEPLOY ON GAE -->
<!-- APP WIZARD --> <!-- APP WIZARD -->
<div class="box"> <div class="box">
<h4>{{=T("New application wizard")}}</h4> <h6>{{=T("New application wizard")}}</h6>
<p>{{=button(URL('wizard','index'), T('Start wizard'))}}<br/> <p>{{=button(URL('wizard','index'), T('Start wizard'))}}<br/>
{{=T("(requires internet access, experimental)")}}</p> {{=T("(requires internet access, experimental)")}}</p>
</div> <!-- /APP WIZARD --> </div> <!-- /APP WIZARD -->
+59 -104
View File
@@ -1,114 +1,69 @@
<!DOCTYPE html> <html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head> <head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta charset="utf-8">
<meta http-equiv="P3P" content="CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{{=response.title or URL()}}</title> <meta name="apple-mobile-web-app-capable" content="yes" />
<link href="{{=URL('static','css/stupid.css')}}" rel="stylesheet" type="text/css"/>
<link href="{{=URL('static','css/calendar.css')}}" rel="stylesheet" type="text/css"/>
<link href="{{=URL('static','css/web2py.css')}}" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<style>
th, td {color: black}
tbody tr:hover {background-color:transparent}
tbody tr {border-bottom: none}
p {text-align: left}
pre {background-color: black!important;border-radius:5px; color:white; padding:10px}
a.btn.btn180 {padding:20px; font-size:1.2em; width:200px!important}
[type=submit], [type=button] {border-radius:5px!important;padding:5px 10px;margin-top:10px}
</style>
{{ {{
response.files.append(URL('static','css/bootstrap.min.css')) left_sidebar_enabled = globals().get('left_sidebar_enabled', False)
response.files.append(URL('static','css/bootstrap_essentials.css')) right_sidebar_enabled = globals().get('right_sidebar_enabled', False)
response.files.append(URL('static','css/bootstrap-responsive.min.css')) middle_column = {0: 'fill', 1: 'threequarters', 2: 'half'}[
(left_sidebar_enabled and 1 or 0)+(right_sidebar_enabled and 1 or 0)]
}} }}
{{include 'web2py_ajax.html'}} {{include "web2py_ajax.html"}}
</head> </head>
<body class="black">
<body class="{{=T('direction: ltr') == 'direction: rtl' and 'RTLbody' or ''}} {{block sectionclass}}home{{end}}"> <header class="black padded">
<div class="container middle max900">
<!-- NAVBAR <div class="fill middle">
============== --> <label class="ham padded fa fa-bars" for="menu"></label>
<div id="header" class="navbar navbar-inverse navbar-fixed-top"> <div class="burger accordion">
<div class="navbar-inner"> <input type="checkbox" id="menu"/>
<div class="container-fluid"> {{=MENU(response.menu,_class='menu')}}
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> </div>
<span class="icon-bar"></span> </div>
<span class="icon-bar"></span> </div>
<span class="icon-bar"></span> </header>
</button> {{if response.flash:}}
<div id="start" class="brand_wrapper"> <div class="w2p_flash">
<a href="{{=URL('default', 'index')}}" class="button brand" ><span>web2py&trade; {{=T('administrative interface')}}</span></a> {{=response.flash}}
</div> </div>
<div class="nav-collapse">
{{if response.menu is not None:}}
<ul id="menu" class="nav pull-right">
{{for _name,_active,_link in response.menu:}}
<li>{{=A(SPAN(_name), _href=_link, _class=_active and 'button select' or 'button')}}</li>
{{pass}} {{pass}}
</ul> <main class="white">
<div class="hidden">{{block sectionclass}}design{{end}}</div>
<div class="container max900">
{{if left_sidebar_enabled:}}
<div class="quarter padded">{{block left_sidebar}}{{end}}</div>
{{pass}} {{pass}}
</div><!--/.nav-collapse --> <div class="{{=middle_column}} padded">{{include}}</div>
</div><!-- /container-fluid --> {{if right_sidebar_enabled:}}
</div><!-- /navbar-inner --> <div class="quarter padded">{{block right_sidebar}}{{end}}</div>
</div><!-- /#header -->
<!-- MAIN
=========== -->
<div id="{{=globals().get('main_id', 'main')}}" class="container-fluid">
<div id="main_inner" class="row-fluid">
<div class="span12">
<div class="w2p_flash alert">{{=response.flash or ''}}</div>
{{include}}
</div><!-- /main span12 -->
</div><!-- /main row-fluid -->
</div><!-- /#main -->
<!-- FOOTER
============== -->
{{block footer}}
<footer id="footer" class="fixed">
<p><span>{{=T('Powered by')}} {{=A('web2py', _href='http://www.web2py.com')}}&trade; {{=T('created by')}} Massimo Di Pierro &copy;2007-{{=request.now.year}}
{{if hasattr(T,'get_possible_languages_info'):}}
- {{=T('Admin language')}}</span>
<select name="adminlanguage" onchange="var date = new Date();cookieDate=date.setTime(date.getTime()+(100*24*60*60*1000));document.cookie='adminLanguage='+this.options[this.selectedIndex].id+'; expires='+cookieDate+'; path=/';window.location.reload()">
{{for langinfo in sorted([(code,info[1]) for code,info in T.get_possible_languages_info().iteritems() if code != 'default']):}}
<option {{=T.accepted_language==langinfo[0] and 'selected' or ''}} {{='id='+langinfo[0]}} >{{=langinfo[1]}}</option>
{{pass}}
</select>
{{else:}}
</span>{{pass}}
</p>
</footer><!-- /#footer -->
{{end}}
<!-- BS JAVASCRIPT
====================== -->
<script src="{{=URL('static','js/bootstrap.min.js')}}"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery("[rel=tooltip]").tooltip();
jQuery(":input").attr("autocomplete","off");
});
</script>
<script>
// ====================
// upload input mask
// ====================
function FileSelectHandler(e) {
e.stopPropagation();
var filename = e.target.value.split(/\\|\//).pop();
jQuery('#fileselect>span').removeClass('txtPlaceholder').text(filename)
}
jQuery(document).ready(function(){
var iupload = jQuery('#appupdate_file');
var ow = 300, oh = 20;
var iplaceholder = jQuery('<span class="txtPlaceholder">{{=T("no package selected")}}</span>'),
iuploadbtn = jQuery('<button class="btn btn-inverse btn-mini uploadbtn"><i class="icon-white icon-circle-arrow-up"></i></button>');
iupload
.addClass('masked')
.wrap('<div id="fileselect" style="width:'+ow+'px;height:'+oh+'px"></div>')
.on('change', function(event){FileSelectHandler(event)});
jQuery('#fileselect').append(iplaceholder, iuploadbtn);
});
</script>
{{if request.function in ('index','site'):}}
<a style="position:fixed;bottom:0;left:0;z-index:1000" href="https://groups.google.com/forum/?fromgroups#!forum/web2py" target="_blank">
<!-- http://webchat.freenode.net/?channels=web2py" //-->
<img src="{{=URL('static','images/questions.png')}}" />
</a>
{{pass}} {{pass}}
</div>
</main>
<footer class="black">
<div class="container padded max900">
<div class="fill">
Copyright @ 2016 - Powered by Web2py
</div>
</div>
</footer>
</body> </body>
<script>
// prevent android horizontal scrolling
window.addEventListener("scroll", function(){window.scroll(0, window.pageYOffset);}, false);
</script>
</html> </html>