Commit 458f8fcf authored by Edward Lim's avatar Edward Lim

Added addon module files

parents
Pipeline #150 failed with stages
Custom Backend Theme
=====================
This is a customized Backend Theme.
Credits
=======
Contributors
------------
* Edward Allen L. Lim <e@eal.im>
# -*- encoding: utf-8 -*-
import controllers
\ No newline at end of file
# -*- encoding: utf-8 -*-
{
# Module information
'name': 'Responsive Backend Theme',
'sequence': -4,
'version': '3.0',
'category': 'Themes/Backend',
# Your information
'author': 'Edward Allen L. Lim',
'website': 'e@eal.im',
'license': 'AGPL-3',
'summary': 'Responsive Backend Theme',
'images': [
'images/screen.png'
],
# Dependencies
'depends': [
'web',
],
# Views templates, pages, menus, options and snippets
'data': [
'views/backend.xml',
],
# Qweb templates
'qweb': [
'static/src/xml/backend.xml',
],
# Technical options
'installable': True,
'auto_install': True,
}
# -*- coding: utf-8 -*-
from . import main
# -*- coding: utf-8 -*-
import functools
import jinja2
import logging
import os
import simplejson
import sys
import werkzeug.utils
import werkzeug.wrappers
try:
import xlwt
except ImportError:
xlwt = None
import openerp
import openerp.modules.registry
from openerp.addons.web.controllers.main import Database
from openerp.tools import topological_sort
from openerp import http
from openerp.http import request, serialize_exception as _serialize_exception
_logger = logging.getLogger(__name__)
if hasattr(sys, 'frozen'):
# When running on compiled windows binary, we don't have access to package loader.
path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'views'))
loader = jinja2.FileSystemLoader(path)
else:
loader = jinja2.PackageLoader('openerp.addons.responsive_backend_theme', "views")
env = jinja2.Environment(loader=loader, autoescape=True)
env.filters["json"] = simplejson.dumps
# 1 week cache for asset bundles as advised by Google Page Speed
BUNDLE_MAXAGE = 60 * 60 * 24 * 7
#----------------------------------------------------------
# OpenERP Web helpers
#----------------------------------------------------------
db_list = http.db_list
db_monodb = http.db_monodb
def serialize_exception(f):
@functools.wraps(f)
def wrap(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception, e:
_logger.exception("An exception occured during an http request")
se = _serialize_exception(e)
error = {
'code': 200,
'message': "ERP Server Error",
'data': se
}
return werkzeug.exceptions.InternalServerError(simplejson.dumps(error))
return wrap
def module_boot(db=None):
server_wide_modules = openerp.conf.server_wide_modules or ['web']
serverside = []
dbside = []
for i in server_wide_modules:
if i in http.addons_manifest:
serverside.append(i)
monodb = db or db_monodb()
if monodb:
dbside = module_installed_bypass_session(monodb)
dbside = [i for i in dbside if i not in serverside]
addons = serverside + dbside
return addons
def module_installed_bypass_session(dbname):
loadable = http.addons_manifest.keys()
modules = {}
try:
registry = openerp.modules.registry.RegistryManager.get(dbname)
with registry.cursor() as cr:
m = registry.get('ir.module.module')
# TODO The following code should move to ir.module.module.list_installed_modules()
domain = [('state','=','installed'), ('name','in', loadable)]
ids = m.search(cr, 1, [('state','=','installed'), ('name','in', loadable)])
for module in m.read(cr, 1, ids, ['name', 'dependencies_id']):
modules[module['name']] = []
deps = module.get('dependencies_id')
if deps:
deps_read = registry.get('ir.module.module.dependency').read(cr, 1, deps, ['name'])
dependencies = [i['name'] for i in deps_read]
modules[module['name']] = dependencies
except:
pass
sorted_modules = topological_sort(modules)
return sorted_modules
class DatabaseBackend(Database):
@http.route('/web/database/selector', type='http', auth="none")
def selector(self, **kw):
try:
dbs = http.db_list()
if not dbs:
return http.local_redirect('/web/database/manager')
except openerp.exceptions.AccessDenied:
dbs = False
return env.get_template("database_selector_backend.html").render({
'databases': dbs,
'debug': request.debug,
'error': kw.get('error')
})
@http.route('/web/database/manager', type='http', auth="none")
def manager(self, **kw):
print("OKAY")
# TODO: migrate the webclient's database manager to server side views
request.session.logout()
return env.get_template("database_manager_backend.html").render({
'modules': simplejson.dumps(module_boot()),
})
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:#875A7B;">Responsive Backend Theme</h2>
<div class="oe_demo oe_picture oe_screenshot">
<img src="screen.png">
</div>
<div>
<div class="oe_demo oe_picture oe_screenshot">
<img src="apps.png">
</div>
<div>
<div class="oe_demo oe_picture oe_screenshot">
<img src="treesale.png">
</div>
<div>
<div class="oe_demo oe_picture oe_screenshot">
<img src="formsale.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_separator">
</section>
<section class="oe_container oe_dark">
<div class="oe_row">
<div class="oe_span12 oe_centeralign">
<br/>
<h3>Help & Support</h3>
<br/> Contact: <a href="e@eal.im" subject="Responsive Backend Theme">Email Support</a><br/>
<br/>
</div>
</div>
</section>
/*
# -*- encoding: utf-8 -*-
/* Extra small devices (phones, less than 768px) */
/* No media query since this is the default in Bootstrap */
/* PRIMARY COLOR: #875A7B*/
/* SOCONDARY COLOR: #593e52*/
/* BUTTON COLOR: #3a9630*/
/* BUTTON COLOR HOVER: #6fc765*/
.openerp .oe_form_sheet_width {
max-width: 95%;
}
.openerp .oe_leftbar {
background-color: #fff;
border-right: 1px solid #D1D1D1;
}
#oe_main_menu_navbar .oe_systray #oe_topbar_imbutton_icon,
#oe_main_menu_navbar .oe_systray #oe_attendance_sign_in_out_icon {
color: white;
}
.openerp .oe_form header,
.openerp .oe_view_manager_current > .oe_view_manager_header {
border-bottom: 1px solid #D1D1D1;
background: #d4dae1;
box-shadow: none;
}
.openerp .oe_horizontal_separator,
.openerp .oe_button.oe_link span,
.openerp .oe_application a,
.openerp .ui-widget-content a,
.openerp .oe_view_manager table.oe_view_manager_header h2 a,
.openerp .oe_secondary_menu_section {
color: #1D559D;
}
.openerp .nav-pills > li.active > a,
.openerp a.list-group-item.active > a {
background-color: #1D559D;
}
.openerp .nav-pills > li.active a:hover,
.openerp .nav-pills > li.active a:focus,
.openerp a.list-group-item.active a:hover,
.openerp a.list-group-item.active a:focus {
background-color: #446b9d;
}
.navbar-inverse {
background-color: #1D559D;
border-color: #D1D1D1;
}
.navbar-inverse .navbar-collapse,
.navbar-inverse .navbar-form {
border-color: #D1D1D1;
}
.navbar-inverse .navbar-nav > li > a {
color: white;
line-height: 21px !important;
}
.openerp .nav-pills li > a{
color: black;
}
/* Small devices (tablets, 768px and up) */
@media (min-width: 768px) {
}
/* Medium devices (desktops, 992px and up) */
@media (min-width: 992px) {
}
/* Large devices (large desktops, 1200px and up) */
@media (min-width: 1200px) {
}
#######################################################
#oe_main_menu_navbar.navbar {
background-color: #875A7B !important;
border-color:#875A7B !important;
color: #ffffff !important;
}
#oe_main_menu_navbar .navbar-header {
margin-right: 15px !important;
}
.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form {
padding: 0px !important;
background-color: #875A7B !important;
border-color: #875A7B !important;
}
#fa_fa_th_menu {
margin-left: 10px !important;
margin-right: 10px !important;
}
#oe_main_menu_navbar li a.oe_menu_toggler {
color: #ffff !important;
}
.openerp .nav-pills > li.active > a, .openerp a.list-group-item.active > a {
background-color: transparent !important;
}
.openerp .oe_loading {
display: none;
z-index: 1001;
position: fixed;
top: 97% !important;
bottom: 0 !important;
right: 0 !important;
padding: 4px 12px;
background: #875A7B;
border-color:#875A7B !important;
color: white;
text-align: center;
border: 1px solid #6d315d;
border-top: none;
-moz-border-radius-bottomright: 0px;
-moz-border-radius-bottomleft: 0px;
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
}
.openerp .oe_leftbar > div {
background-color: #593e52 !important;
}
.openerp .nav-pills li > a {
padding: 15px !important;
border-radius: 0px;
color: #fff;
}
.openerp .nav-pills li {
display: block;
margin: 0;
padding: 0;
border: 0px;
background: linear-gradient(to right,#875A7B 50%, #593e52 50%);
background-size: 200% 100%;
background-position: right bottom;
transition: all 0.2s ease-out;
}
.openerp .nav-pills li:hover {
background-position: left bottom;
}
.openerp .nav-pills li > a, .openerp .nav-pills > li.active > a, .openerp a.list-group-item.active > a {
background-color: transparent !important;
display: block;
position: relative;
margin: 0;
width: 220px;
border: 0px;
padding: 8px 15px;
text-decoration: none;
font-weight: 300;
overflow: hidden;
text-overflow: ellipsis;
color: #FFFFFF;
transition: all 0.2s ease-out;
}
.openerp .oe_secondary_menu_section {
color: #ffffff !important;
margin-left: 0px !important;
padding-left: 8px !important;
padding-top: 8px !important;
padding-bottom: 8px !important;
text-transform: uppercase !important;
background-color: #875A7B !important;
}
.navbar-inverse .navbar-toggle {
background-color: transparent !important;
}
.navbar-inverse {
background-color: #875A7B !important;
border-color: #875A7B !important;
}
.oe_module_desc button {
padding-left: 30px !important;
padding-right: 30px !important;
padding-top: 10px !important;
padding-bottom: 10px !important;
}
.openerp .oe_kanban_view .oe_kanban_action_button {
padding-left: 30px !important;
padding-right: 30px !important;
padding-top: 10px !important;
padding-bottom: 10px !important;
height: auto !important;
background-color:#3a9630 !important;
border-color:#3a9630 !important;
}
.openerp .oe_kanban_view .oe_kanban_action_button:hover {
background-color:#6fc765 !important;
border-color:#6fc765 !important;
}
.openerp button.oe_button, button.oe_dropdown_toggle, .openerp button.oe_highlight {
padding-left: 30px !important;
padding-right: 30px !important;
padding-top: 10px !important;
padding-bottom: 10px !important;
background-color:#3a9630 !important;
border-color:#3a9630 !important;
}
.openerp button.oe_button:hover, button.oe_dropdown_toggle:hover, .openerp button.oe_highlight:hover {
background-color:#6fc765 !important;
border-color:#6fc765 !important;
}
.openerp button.oe_dropdown_toggle, .openerp button.oe_highlight {
padding-left: 30px !important;
padding-right: 30px !important;
padding-top: 10px !important;
padding-bottom: 10px !important;
background-color:#3a9630 !important;
border-color:#3a9630 !important;
}
.openerp button.oe_dropdown_toggle:hover, .openerp button.oe_highlight:hover {
background-color:#6fc765 !important;
border-color:#6fc765 !important;
}
@media (max-width: 768px) {
#leftbar_toggle {
display: none !important;
}
.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form {
text-align: center !important;
}
.navbar-nav .open .dropdown-menu {
text-align: center !important;
}
}
@media (max-width: 767px) {
#leftbar_toggle {
display: none !important;
}
.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form {
text-align: center !important;
}
.navbar-nav .open .dropdown-menu {
text-align: center !important;
}
}
.navbar-left > li {
}
#oe_main_menu_navbar li a, #oe_main_menu_navbar li button {
padding: 13px !important;
}
.navbar-nav > li:hover {
background: #593e52 !important;
}
.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus, .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
color: #fff;
background-color: #593e52 !important;
}
#oe_main_menu_navbar li a, #oe_main_menu_navbar li button {
margin-top: 0px !important;
}
#oe_main_menu_navbar #menu_more li a.oe_menu_toggler {
color: black !important;
}
.openerp .oe_sidebar_suggestion .oe_suggest_items .oe_suggested_item_content button, .openerp .oe_followers button.oe_follower {
padding-left: 30px !important;
padding-right: 30px !important;
padding-top: 10px !important;
padding-bottom: 10px !important;
background-color:#3a9630 !important;
border-color:#3a9630 !important;
}
.openerp .oe_sidebar_suggestion .oe_suggest_items .oe_suggested_item_content button:hover, .openerp .oe_followers button.oe_follower:hover {
background-color:#6fc765 !important;
border-color:#6fc765 !important;
}
.openerp .oe_form input[type="text"], .openerp .oe_form input[type="password"], .openerp .oe_form input[type="file"], .openerp .oe_form select, .openerp .oe_form textarea {
min-height: 30px !important;
}
body.oe_single_form .oe_single_form_container {
background-color: #875A7B !important;
color: white !important;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
box-shadow: inset 0 0 5px grey;
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
background: #875A7B;
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
background: #875A7B;
}
.pace {
-webkit-pointer-events: none;
pointer-events: none;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.pace-inactive {
display: none;
}
.pace .pace-progress {
background: #ffffff;
position: fixed;
z-index: 2000;
top: 0;
right: 100%;
width: 100%;
height: 4px;
}
This diff is collapsed.
/*
# -*- encoding: utf-8 -*-
*/
// Check jQuery available
if (typeof jQuery === 'undefined') { throw new Error('Theme JavaScript requires jQuery') }
+function ($) {
'use strict';
openerp.reponsive_backend_theme = function(instance, local) {
var _t = instance.web._t,
_lt = instance.web._lt;
var QWeb = instance.web.qweb;
}
}(jQuery);
/*
# -*- encoding: utf-8 -*-
*/
openerp.responsive_backend_theme = function(instance, local) {
var _t = instance.web._t;
openerp_FieldMany2ManyTagsMultiSelection(instance);
openerp_listview_html_widget(instance);
web_listview_sticky(instance);
var QWeb = instance.web.qweb;
instance.web.Client.include({
show_annoucement_bar : function() {
return;
},
bind_events : function() {
var self = this;
this._super();
var root = self.$el.parents();
$("#oe_main_menu_navbar.navbar").css("padding-left", "220px");
var elem_sm = $("<button id='leftbar_toggle' type='button' class='navbar-toggle left'><span class='fa fa-th' style='color:#ffffff;font-size: 25px;'></span></button>");
elem_sm.prependTo(root.find('.navbar-header'));
$(document).ready(function() {
$('.page-loading').show();
});
self.$el.on('click', '#leftbar_toggle', function() {
var leftbar = root.find('.oe_leftbar');
if (leftbar.css('display') == 'none') {
leftbar.removeClass("hide");
$("#oe_main_menu_navbar.navbar").css("padding-left", "220px");
leftbar.addClass("show");
} else {
$("#oe_main_menu_navbar.navbar").css("padding-left", "0px");
leftbar.removeClass("show");
leftbar.addClass("hide");
}
});
$('.oe_application').click(function () {
var leftbar = root.find('.oe_leftbar');
$("#oe_main_menu_navbar.navbar").css("padding-left", "0px");
leftbar.removeClass("show");
leftbar.addClass("hide");
});
$('ul.nav.navbar-nav.navbar-left.oe_application_menu_placeholder li a').click(function () {
var leftbar = root.find('.oe_leftbar');
if (leftbar.css('display') == 'none') {
leftbar.removeClass("hide");
$("#oe_main_menu_navbar.navbar").css("padding-left", "220px");
leftbar.addClass("show");
}
});
}
});
instance.web.Menu.include({
reflow : function(behavior) {
var self = this;
var $more_container = this.$('#menu_more_container').hide();
var $more = this.$('#menu_more');
var $systray = this.$el.parents().find('.oe_systray');
$more.children('li').insertBefore($more_container);
// Pull all the items out of the more menu
// 'all_outside' beahavior should display all the items, so hide the more menu and exit
if (behavior === 'all_outside') {
// Show list of menu items
self.$el.show();
this.$el.find('li').show();
$more_container.hide();
return;
}
// Hide all menu items
var $toplevel_items = this.$el.find('li').not($more_container).not($systray.find('li')).hide();
// Show list of menu items (which is empty for now since all menu items are hidden)
self.$el.show();
$toplevel_items.each(function() {
var remaining_space = self.$el.parent().width() - $more_container.outerWidth() - 75;
self.$el.parent().children(':visible').each(function() {
remaining_space -= $(this).outerWidth();
});
if ($(this).width() >= remaining_space) {
return false;
// the current item will be appended in more_container
}
$(this).show();
// show the current item in menu bar
});
$more.append($toplevel_items.filter(':hidden').show());
$more_container.toggle(!!$more.children().length);
// Hide toplevel item if there is only one
var $toplevel = self.$el.children("li:visible");
if ($toplevel.length === 1) {
$toplevel.hide();
}
},
open_menu : function(id) {
var self = this;
var root = self.$el.parents();
var oe_main_menu_placeholder = root.find('#oe_main_menu_placeholder');
if (oe_main_menu_placeholder.hasClass("in")) {
oe_main_menu_placeholder.removeClass("in");
}
this._super(id);
}
});
};
/*
# -*- encoding: utf-8 -*-
*/
openerp_listview_html_widget= function(instance) {
var _t = instance.web._t;
instance.web.list.columns.map['field.html'] = 'instance.web.list.HtmlColumn';
instance.web.list.HtmlColumn = instance.web.list.Column.extend({
_format: function (row_data, options) {
return instance.web.format_value(
row_data[this.id].value, this, options.value_if_empty);
}
});
};
/*
# -*- encoding: utf-8 -*-
*/
web_listview_sticky = function (instance) {
var _t = instance.web._t,
_lt = instance.web._lt;
var QWeb = instance.web.qweb;
//Sticky Table Header
instance.web.ListView.include({
load_list: function () {
var self = this;
self._super.apply(this, arguments);
var one2many_length = self.$el.parents('.oe_form_field.oe_form_field_one2many').length;
var scrollArea = self.$el.parents('.oe_view_manager.oe_view_manager_current').find('.oe_view_manager_wrapper .oe_view_manager_body')[0];
if(scrollArea && one2many_length == 0){
self.$el.find('table.oe_list_content').each(function(){
$(this).stickyTableHeaders({scrollableArea: scrollArea});
});
}
},
});
};
\ No newline at end of file
This diff is collapsed.
/*
# -*- encoding: utf-8 -*-
*/
openerp_FieldMany2ManyTagsMultiSelection = function(instance) {
var _t = instance.web._t;
instance.web.form.CompletionFieldMixin._search_create_popup = function(view, ids, context) {
var self = this;
var pop = new instance.web.form.SelectCreatePopup(this);
var domain = self.build_domain();
if (self.field.type == 'many2many') {
var selected_ids = self.get_search_blacklist();
if (selected_ids.length > 0) {
domain = new instance.web.CompoundDomain(domain, ["!", ["id", "in", selected_ids]]);
}
}
pop.select_element(self.field.relation, {
title : (view === 'search' ? _t("Search: ") : _t("Create: ")) + this.string,
initial_ids : ids ? _.map(ids, function(x) {
return x[0];
}) : undefined,
initial_view : view,
disable_multiple_selection : this.field.type != 'many2many',
}, domain, new instance.web.CompoundContext(self.build_context(), context || {}));
pop.on("elements_selected", self, function(element_ids) {
for (var i = 0,
len = element_ids.length; i < len; i++) {
self.add_id(element_ids[i]);
if (self.field.type != 'many2many') {
break;
}
}
self.focus();
});
};
};
/*
# -*- encoding: utf-8 -*-
*/
/*! */
;(function ($, window, undefined) {
'use strict';
var name = 'stickyTableHeaders',
id = 0,
defaults = {
fixedOffset: 0,
leftOffset: 0,
marginTop: 0,
objDocument: document,
objHead: 'head',
objWindow: window,
scrollableArea: window
};
function Plugin (el, options) {
// To avoid scope issues, use 'base' instead of 'this'
// to reference this class from internal events and functions.
var base = this;
// Access to jQuery and DOM versions of element
base.$el = $(el);
base.el = el;
base.id = id++;
// Listen for destroyed, call teardown
base.$el.bind('destroyed',
$.proxy(base.teardown, base));
// Cache DOM refs for performance reasons
base.$clonedHeader = null;
base.$originalHeader = null;
// Keep track of state
base.isSticky = false;
base.hasBeenSticky = false;
base.leftOffset = null;
base.topOffset = null;
base.init = function () {
base.setOptions(options);
base.$el.each(function () {
var $this = $(this);
// remove padding on <table> to fix issue #7
$this.css('padding', 0);
base.$originalHeader = $('thead:first', this);
base.$clonedHeader = base.$originalHeader.clone();
$this.trigger('clonedHeader.' + name, [base.$clonedHeader]);
base.$clonedHeader.addClass('tableFloatingHeader');
base.$clonedHeader.css('display', 'none');
base.$originalHeader.addClass('tableFloatingHeaderOriginal');
base.$originalHeader.after(base.$clonedHeader);
base.$printStyle = $('<style type="text/css" media="print">' +
'.tableFloatingHeader{display:none !important;}' +
'.tableFloatingHeaderOriginal{position:static !important;}' +
'</style>');
base.$head.append(base.$printStyle);
});
base.updateWidth();
base.toggleHeaders();
base.bind();
};
base.destroy = function (){
base.$el.unbind('destroyed', base.teardown);
base.teardown();
};
base.teardown = function(){
if (base.isSticky) {
base.$originalHeader.css('position', 'static');
}
$.removeData(base.el, 'plugin_' + name);
base.unbind();
base.$clonedHeader.remove();
base.$originalHeader.removeClass('tableFloatingHeaderOriginal');
base.$originalHeader.css('visibility', 'visible');
base.$printStyle.remove();
base.el = null;
base.$el = null;
};
base.bind = function(){
base.$scrollableArea.on('scroll.' + name, base.toggleHeaders);
if (!base.isWindowScrolling) {
base.$window.on('scroll.' + name + base.id, base.setPositionValues);
base.$window.on('resize.' + name + base.id, base.toggleHeaders);
base.$window.on('resize.' + name + base.id, base.updateWidth);
}
base.$scrollableArea.on('resize.' + name, base.toggleHeaders);
base.$scrollableArea.on('resize.' + name, base.updateWidth);
};
base.unbind = function(){
// unbind window events by specifying handle so we don't remove too much
base.$scrollableArea.off('.' + name, base.toggleHeaders);
if (!base.isWindowScrolling) {
base.$window.off('.' + name + base.id, base.setPositionValues);
base.$window.off('.' + name + base.id, base.toggleHeaders);
}
base.$scrollableArea.off('.' + name, base.updateWidth);
};
base.toggleHeaders = function () {
if (base.$el) {
base.$el.each(function () {
var $this = $(this),
newLeft,
newTopOffset = base.isWindowScrolling ? (
isNaN(base.options.fixedOffset) ?
base.options.fixedOffset.outerHeight() :
base.options.fixedOffset
) :
base.$scrollableArea.offset().top + (!isNaN(base.options.fixedOffset) ? base.options.fixedOffset : 0),
offset = $this.offset(),
scrollTop = base.$scrollableArea.scrollTop(),
scrollLeft = base.$scrollableArea.scrollLeft(),
scrolledPastTop = base.isWindowScrolling ?
scrollTop > offset.top :
newTopOffset > offset.top,
notScrolledPastBottom = (base.isWindowScrolling ? scrollTop : 0) <
(offset.top + $this.height() - base.$clonedHeader.height() - (base.isWindowScrolling ? 0 : newTopOffset));
if (scrolledPastTop && notScrolledPastBottom) {
newLeft = 0;
base.$originalHeader.css({
'position': 'absolute',
'margin-top': base.options.marginTop,
'left': newLeft,
'z-index': 3 // #18: opacity bug
});
base.leftOffset = newLeft;
base.topOffset = scrollTop;
base.$clonedHeader.css('display', '');
if (!base.isSticky) {
base.isSticky = true;
// make sure the width is correct: the user might have resized the browser while in static mode
base.updateWidth();
$this.trigger('enabledStickiness.' + name);
}
base.setPositionValues();
} else if (base.isSticky) {
base.$originalHeader.css('position', 'static');
base.$clonedHeader.css('display', 'none');
base.isSticky = false;
base.resetWidth($('td,th', base.$clonedHeader), $('td,th', base.$originalHeader));
$this.trigger('disabledStickiness.' + name);
}
});
}
};
base.setPositionValues = function () {
var winScrollTop = base.$window.scrollTop(),
winScrollLeft = base.$window.scrollLeft();
if (!base.isSticky ||
winScrollTop < 0 || winScrollTop + base.$window.height() > base.$document.height() ||
winScrollLeft < 0 || winScrollLeft + base.$window.width() > base.$document.width()) {
return;
}
base.$originalHeader.css({
'top': base.topOffset,
'left': base.leftOffset - (base.isWindowScrolling ? 0 : winScrollLeft)
});
};
base.updateWidth = function () {
if (!base.isSticky) {
return;
}
// Copy cell widths from clone
if (!base.$originalHeaderCells) {
base.$originalHeaderCells = $('th,td', base.$originalHeader);
}
if (!base.$clonedHeaderCells) {
base.$clonedHeaderCells = $('th,td', base.$clonedHeader);
}
var cellWidths = base.getWidth(base.$clonedHeaderCells);
base.setWidth(cellWidths, base.$clonedHeaderCells, base.$originalHeaderCells);
// Copy row width from whole table
base.$originalHeader.css('width', base.$clonedHeader.width());
};
base.getWidth = function ($clonedHeaders) {
var widths = [];
$clonedHeaders.each(function (index) {
var width, $this = $(this);
if ($this.css('box-sizing') === 'border-box') {
var boundingClientRect = $this[0].getBoundingClientRect();
if(boundingClientRect.width) {
width = boundingClientRect.width; // #39: border-box bug
} else {
width = boundingClientRect.right - boundingClientRect.left; // ie8 bug: getBoundingClientRect() does not have a width property
}
} else {
var $origTh = $('th', base.$originalHeader);
if ($origTh.css('border-collapse') === 'collapse') {
if (window.getComputedStyle) {
width = parseFloat(window.getComputedStyle(this, null).width);
} else {
// ie8 only
var leftPadding = parseFloat($this.css('padding-left'));
var rightPadding = parseFloat($this.css('padding-right'));
// Needs more investigation - this is assuming constant border around this cell and it's neighbours.
var border = parseFloat($this.css('border-width'));
width = $this.outerWidth() - leftPadding - rightPadding - border;
}
} else {
width = $this.width();
}
}
widths[index] = width;
});
return widths;
};
base.setWidth = function (widths, $clonedHeaders, $origHeaders) {
$clonedHeaders.each(function (index) {
var width = widths[index];
$origHeaders.eq(index).css({
'min-width': width,
'max-width': width
});
});
};
base.resetWidth = function ($clonedHeaders, $origHeaders) {
$clonedHeaders.each(function (index) {
var $this = $(this);
$origHeaders.eq(index).css({
'min-width': $this.css('min-width'),
'max-width': $this.css('max-width')
});
});
};
base.setOptions = function (options) {
base.options = $.extend({}, defaults, options);
base.$window = $(base.options.objWindow);
base.$head = $(base.options.objHead);
base.$document = $(base.options.objDocument);
base.$scrollableArea = $(base.options.scrollableArea);
base.isWindowScrolling = base.$scrollableArea[0] === base.$window[0];
};
base.updateOptions = function (options) {
base.setOptions(options);
// scrollableArea might have changed
base.unbind();
base.bind();
base.updateWidth();
base.toggleHeaders();
};
// Run initializer
base.init();
}
// A plugin wrapper around the constructor,
// preventing against multiple instantiations
$.fn[name] = function ( options ) {
return this.each(function () {
var instance = $.data(this, 'plugin_' + name);
if (instance) {
if (typeof options === 'string') {
instance[options].apply(instance);
} else {
instance.updateOptions(options);
}
} else if(options !== 'destroy') {
$.data(this, 'plugin_' + name, new Plugin( this, options ));
}
});
};
})(jQuery, window);
<?xml version="1.0" encoding="utf-8"?>
<!-- Author: e@eal.im -->
<templates>
<!-- Qweb templates for Backend -->
<t t-extend="UserMenu">
<t t-jquery="ul" t-operation="replace">
<ul class="dropdown-menu">
<li><a href="#" data-menu="settings">Preferences</a></li>
<li><a href="#" data-menu="about">About Development</a></li>
<li><a href="#" data-menu="logout">Log out</a></li>
</ul>
</t>
</t>
</templates>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Author: e@eal.im -->
<openerp>
<data>
<!-- Setting theme favicon -->
<template id="layout" inherit_id="web.layout" name="Setting favicon" priority="20">
<xpath expr="//link[@rel='shortcut icon']" position="replace">
<link rel="shortcut icon" href="/responsive_backend_theme/static/src/img/favicon.ico" type="image/x-icon"/>
</xpath>
</template>
<!-- Add theme CSS and Javascript -->
<template id="assets_backend" inherit_id="web.assets_backend" name="Custom CSS and JS">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/responsive_backend_theme/static/src/css/backend.css"/>
<script type="text/javascript" src="/responsive_backend_theme/static/src/js/backend.js"></script>
<script type="text/javascript"
src="/responsive_backend_theme/static/src/js/sticky_table_headers.js"></script>
<script type="text/javascript" src="/responsive_backend_theme/static/src/js/base.js"></script>
<script type="text/javascript"
src="/responsive_backend_theme/static/src/js/many2many_tags_multi_selection.js"></script>
<script type="text/javascript"
src="/responsive_backend_theme/static/src/js/listview_html_widget.js"></script>
<script type="text/javascript" src="/responsive_backend_theme/static/src/js/listview_sticky.js"></script>
<script type="text/javascript" src="/responsive_backend_theme/static/src/js/loading.js"></script>
<style>
@keyframes page-load {
from {
width:0;
}
to {
width:100%;
}
}
.page-loading::before {
content:" ";
display:block;
position:fixed;
z-index:10;
height:2px;
width:100%;
top:0;
left:0;
background-color:#06D;
animation: page-load ease-out 2s;
}
</style>
</xpath>
</template>
<template id="customizing_css_id" inherit_id="web.assets_common" name="customizing_css_name">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/responsive_backend_theme/static/src/css/list_view.css"/>
<style>
@keyframes page-load {
from {
width:0;
}
to {
width:100%;
}
}
.page-loading::before {
content:" ";
display:block;
position:fixed;
z-index:10;
height:2px;
width:100%;
top:0;
left:0;
background-color:#06D;
animation: page-load ease-out 2s;
}
</style>
</xpath>
</template>
<!-- Remove login footer and change logo -->
<!-- Priority 10 to be applied before website.login_layout if installed -->
<template id="login_layout" inherit_id="web.login_layout" name="Remove login footer and change logo"
priority="10">
<xpath expr="//div[@class='oe_single_form_footer']" position="replace">
<div></div>
</xpath>
</template>
<template id="menu_secondary" inherit_id="web.menu_secondary" name="Force logo in backend" priority="20">
<xpath expr="//a[@class='oe_logo']" position="replace">
<a class="test" t-att-href="'/web'">
<center>
<img src='/web/binary/company_logo' style="border-radius: 5px;margin:10px;"/>
</center>
</a>
</xpath>
<xpath expr="//div[@class='oe_footer']" position="replace">
<div></div>
</xpath>
</template>
</data>
</openerp>
<!DOCTYPE html>
<html style="height: 100%;">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Odoo</title>
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" href="/web/static/src/css/full.css"/>
<script src="/web/static/lib/es5-shim/es5-shim.min.js" type="text/javascript"></script>
<script src="/web/static/lib/underscore/underscore.js" type="text/javascript"></script>
<script src="/web/static/lib/underscore.string/lib/underscore.string.js" type="text/javascript"></script>
<script src="/web/static/lib/datejs/globalization/en-US.js" type="text/javascript"></script>
<script src="/web/static/lib/spinjs/spin.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery/jquery.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.blockUI/jquery.blockUI.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.hotkeys/jquery.hotkeys.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.placeholder/jquery.placeholder.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.timeago/jquery.timeago.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.form/jquery.form.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.ba-bbq/jquery.ba-bbq.js" type="text/javascript"></script>
<script src="/web/static/lib/datejs/core.js" type="text/javascript"></script>
<script src="/web/static/lib/datejs/parser.js" type="text/javascript"></script>
<script src="/web/static/lib/datejs/sugarpak.js" type="text/javascript"></script>
<script src="/web/static/lib/datejs/extras.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.validate/jquery.validate.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.autosize/jquery.autosize.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.scrollTo/jquery.scrollTo-min.js" type="text/javascript"></script>
<script src="/web/static/lib/cleditor/jquery.cleditor.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.textext/jquery.textext.js" type="text/javascript"></script>
<script src="/web/static/lib/select2/select2.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.ui.timepicker/js/jquery-ui-timepicker-addon.js" type="text/javascript"></script>
<script src="/web/static/lib/jquery.ui.notify/js/jquery.notify.js" type="text/javascript"></script>
<script src="/web/static/lib/bootstrap/js/bootstrap.js" type="text/javascript"></script>
<script src="/web/static/lib/backbone/backbone.js" type="text/javascript"></script>
<script src="/web/static/lib/qweb/qweb2.js" type="text/javascript"></script>
<script src="/web/static/src/js/openerpframework.js" type="text/javascript"></script>
<script src="/web/static/lib/py.js/lib/py.js" type="text/javascript"></script>
<script src="/web/static/src/js/boot.js" type="text/javascript"></script>
<script src="/web/static/src/js/testing.js" type="text/javascript"></script>
<script src="/web/static/src/js/pyeval.js" type="text/javascript"></script>
<script src="/web/static/src/js/core.js" type="text/javascript"></script>
<script src="/web/static/src/js/formats.js" type="text/javascript"></script>
<script src="/web/static/src/js/chrome.js" type="text/javascript"></script>
<script src="/web/static/src/js/views.js" type="text/javascript"></script>
<script src="/web/static/src/js/data.js" type="text/javascript"></script>
<script src="/web/static/src/js/data_export.js" type="text/javascript"></script>
<script src="/web/static/src/js/search.js" type="text/javascript"></script>
<script src="/web/static/src/js/view_list.js" type="text/javascript"></script>
<script src="/web/static/src/js/view_form.js" type="text/javascript"></script>
<script src="/web/static/src/js/view_list_editable.js" type="text/javascript"></script>
<script src="/web/static/src/js/view_tree.js" type="text/javascript"></script>
<script src="/base/static/src/js/apps.js" type="text/javascript"></script>
<script src="/web/static/src/js/tour.js" type="text/javascript"></script>
<link href="/web/static/lib/fontawesome/css/font-awesome.css" rel="stylesheet"/>
<link href="/web/static/lib/cleditor/jquery.cleditor.css" rel="stylesheet"/>
<link href="/web/static/lib/jquery.textext/jquery.textext.css" rel="stylesheet"/>
<link href="/web/static/lib/select2/select2.css" rel="stylesheet"/>
<link href="/web/static/lib/jquery.ui.bootstrap/css/custom-theme/jquery-ui-1.9.0.custom.css" rel="stylesheet"/>
<link href="/web/static/lib/jquery.ui.timepicker/css/jquery-ui-timepicker-addon.css" rel="stylesheet"/>
<link href="/web/static/lib/jquery.ui.notify/css/ui.notify.css" rel="stylesheet"/>
<link href="/web/static/lib/bootstrap/css/bootstrap.css" rel="stylesheet"/>
<link href="/web/static/src/css/base.css" rel="stylesheet"/>
<link href="/web/static/src/css/data_export.css" rel="stylesheet"/>
<link href="/base/static/src/css/modules.css" rel="stylesheet"/>
<link rel="stylesheet" href="/responsive_backend_theme/static/src/css/backend.css"/>
<script type="text/javascript" src="/responsive_backend_theme/static/src/js/loading.js"></script>
<script type="text/javascript">
$(function () {
/* Do not forward port this block! */
if ($.browser.chrome) {
var chrome_version = $.browser.version.split('.')[0];
if (parseInt(chrome_version, 10) >= 50) {
openerp.loadCSS('/web/static/src/css/chrome50.css');
}
}
var s = new openerp.init({{ modules|safe }});
var wc = new s.web.WebClient(null, {action: 'database_manager'});
wc.setElement($(document.body));
wc.start();
});
</script>
</head>
<body>
<nav id="oe_main_menu_navbar" class="navbar navbar-inverse" role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse" id="oe_main_menu_placeholder">
<ul class="nav navbar-nav navbar-right oe_user_menu_placeholder"></ul>
</div>
</nav>
<div class="openerp openerp_webclient_container">
<table class="oe_webclient">
<tr>
<td class="oe_leftbar" valign="top">
<div>
<a class="oe_logo">
<span class="oe_logo_edit">Edit Company data</span>
<img src='/web/binary/company_logo'/>
</a>
<div>
<div>
<div class="oe_secondary_menus_container"></div>
</div>
</div>
<div class="oe_footer">
Powered by <a href="http://www.eal.im" target="_blank"><span>eal.im</span></a>
</div>
</div>
</td>
<td class="oe_application">
</td>
</tr>
</table>
</div>
<!--[if lte IE 8]>
<script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
<script>CFInstall.check({mode: "overlay"});</script>
<![endif]-->
</body>
</html>
<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>ERP</title>
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="/web/static/src/css/full.css">
<link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css">
<link rel="stylesheet" href="/web/static/lib/bootstrap/css/bootstrap.css">
<link rel="stylesheet" href="/web/static/src/css/base.css">
<link rel="stylesheet" href="/responsive_backend_theme/static/src/css/backend.css"/>
<script type="text/javascript" src="/responsive_backend_theme/static/src/js/loading.js"></script>
<script type="text/javascript">
function dbchanged() {
document.getElementById('dbselector').submit();
}
</script>
<body class="oe_single_form">
<div class="oe_single_form_container modal-content">
<form class="oe_dbselector_form" id="dbselector" role="form" action="/web" method="get">
<div class="oe_single_form_logo">
<img src="/web/static/src/img/logo2.png"/>
</div>
<hr/>
{% if error %}
<p class="alert alert-danger">
{{ error }}
</p>
{% endif %}
<div class="form-group field-db">
<label for="db" class="control-label">Select database</label>
{% if databases %}
<select name="db" id="db" class="form-control" required="required" autofocus="autofocus"
onchange="dbchanged()">
<option></option>
{% for db in databases %}
<option value="{{ db }}">{{ db }}</option>
{% endfor %}
</select>
{% else %}
<input type="text" name="db" id="db" class="form-control" required="required" autofocus="autofocus"/>
{% endif %}
</div>
{% if debug %}
<input type="hidden" name="debug" value=""/>
{% endif %}
<noscript>
<hr/>
<input type="submit" value="Continue" class="btn btn-primary pull-right"/>
</noscript>
<div class="oe_single_form_footer">
<a class="oe_login_manage_db" href="/web/database/manager{% if debug %}?debug{% endif %}">Manage
Databases</a> |
<a href="http://www.eal.im" target="_blank">Powered by <span>eal.im</span></a>
</div>
</form>
</div>
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment