forked from Techsystech/web
[ADD] web_last_viewed_records
parent
56697a1cee
commit
640cfda39d
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
'name' : 'Last viewed records',
|
||||||
|
'version' : '1.0.0',
|
||||||
|
'author' : 'Ivan Yelizariev',
|
||||||
|
'category' : 'Base',
|
||||||
|
'website' : 'https://yelizariev.github.io',
|
||||||
|
'description': """
|
||||||
|
The idea is taken from SugarCRM's "Last viewed" feature.
|
||||||
|
|
||||||
|
This module doesn't affect on server performance, because it uses browser's localStorage to save history. But dissadvantage is that history is not synced accross browsers.
|
||||||
|
|
||||||
|
FIXME: doesn't work in a res.config view
|
||||||
|
|
||||||
|
Tested on 8.0 ab7b5d7732a7c222a0aea45bd173742acd47242d.
|
||||||
|
|
||||||
|
Further information and discussion: https://yelizariev.github.io/odoo/module/2015/02/18/last-viewed-records.html
|
||||||
|
""",
|
||||||
|
'depends' : ['web', 'mail'],
|
||||||
|
'data':[
|
||||||
|
'views.xml',
|
||||||
|
],
|
||||||
|
'qweb' : [
|
||||||
|
"static/src/xml/*.xml",
|
||||||
|
],
|
||||||
|
'installable': True
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
.oe_last_viewed_item.selected{
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_last_viewed_item .oe_e {
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: 300 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_last_viewed_item .list:after, .openerp .oe_last_viewed_item .tree:after {
|
||||||
|
padding: 2px;
|
||||||
|
content: "i";
|
||||||
|
}
|
||||||
|
.openerp .oe_last_viewed_item .form:after {
|
||||||
|
content: "m";
|
||||||
|
}
|
||||||
|
.openerp .oe_last_viewed_item .graph:after {
|
||||||
|
font-family: "mnmliconsRegular" !important;
|
||||||
|
font-size: 21px;
|
||||||
|
font-weight: 300 !important;
|
||||||
|
content: "}";
|
||||||
|
top: -2px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.openerp .oe_last_viewed_item .gantt:after {
|
||||||
|
font-family: "mnmliconsRegular" !important;
|
||||||
|
font-size: 21px;
|
||||||
|
font-weight: 300 !important;
|
||||||
|
content: "y";
|
||||||
|
top: -2px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.openerp .oe_last_viewed_item .calendar:after {
|
||||||
|
content: "P";
|
||||||
|
}
|
||||||
|
.openerp .oe_last_viewed_item .kanban:after {
|
||||||
|
content: "k";
|
||||||
|
}
|
||||||
|
.openerp .oe_last_viewed_item .diagram:after {
|
||||||
|
content: "f";
|
||||||
|
}
|
||||||
|
.oe_last_viewed_icon{
|
||||||
|
font-family: "entypoRegular" !important;
|
||||||
|
font-size: 1.8em;
|
||||||
|
}
|
|
@ -0,0 +1,174 @@
|
||||||
|
openerp.web_last_viewed_records = function(instance){
|
||||||
|
var QWeb = instance.web.qweb;
|
||||||
|
var _t = instance.web._t;
|
||||||
|
|
||||||
|
instance.web.ActionManager.include({
|
||||||
|
last_viewed_history_var: 'odoo_last_viewed',
|
||||||
|
last_viewed_history_size: 8,
|
||||||
|
init:function(){
|
||||||
|
this._super.apply(this, arguments);
|
||||||
|
|
||||||
|
this.last_viewed = [];
|
||||||
|
var last_viewed = this.load_last_viewed_history().last_viewed || [];
|
||||||
|
for (var i=last_viewed.length-1; i>=0; i--){
|
||||||
|
this.unshift_last_viewed(last_viewed[i]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
add_last_viewed: function(item){
|
||||||
|
if (_.any(this.last_viewed, function(x){
|
||||||
|
if (x['title'] != item['title'] ||
|
||||||
|
x['view_type'] != item['view_type'] ||
|
||||||
|
x['url']['model'] != item['url']['model'])
|
||||||
|
return false;
|
||||||
|
if (x['view_type'] == 'form' && x['id'] != item['id'])
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//save json data to localStorage
|
||||||
|
var data = this.load_last_viewed_history();
|
||||||
|
data.last_viewed = data.last_viewed || []
|
||||||
|
data.last_viewed.unshift(item);
|
||||||
|
data.last_viewed.splice(this.last_viewed_history_size);
|
||||||
|
this.save_last_viewed_history(data);
|
||||||
|
|
||||||
|
this.unshift_last_viewed(item);
|
||||||
|
},
|
||||||
|
unshift_last_viewed: function(item){
|
||||||
|
var self = this;
|
||||||
|
this.last_viewed.unshift(item);
|
||||||
|
this.last_viewed.splice(this.last_viewed_history_size);
|
||||||
|
},
|
||||||
|
load_last_viewed_history: function(){
|
||||||
|
var data = localStorage[this.last_viewed_history_var] || '{}';
|
||||||
|
return JSON.parse(data);
|
||||||
|
},
|
||||||
|
save_last_viewed_history: function(data){
|
||||||
|
localStorage[this.last_viewed_history_var] = JSON.stringify(data);
|
||||||
|
},
|
||||||
|
// icon map: http://bistro.convergencecms.co/entypo
|
||||||
|
_model2icon: {
|
||||||
|
'res.partner':'+',
|
||||||
|
'crm.lead':'4',
|
||||||
|
'sale.order':'l',
|
||||||
|
'account.analytic.account':'7',
|
||||||
|
'crm.phonecall':'!',
|
||||||
|
'hr.employee':'.',
|
||||||
|
'hr.applicant':'-',
|
||||||
|
'project.project':'t',
|
||||||
|
'project.task':'W',
|
||||||
|
'account.invoice':'h',
|
||||||
|
'ir.module.module':'Z',
|
||||||
|
'hr_timesheet_sheet.sheet': 'N',
|
||||||
|
'res.groups': ',',
|
||||||
|
'res.company': '_',
|
||||||
|
'res.user': 'ó',
|
||||||
|
'gamification.challenge':'è',
|
||||||
|
'gamification.badge':'8',
|
||||||
|
},
|
||||||
|
get_last_viewed_title: function(){
|
||||||
|
var titles = [];
|
||||||
|
for (var i = 0; i < this.last_viewed.length; i += 1) {
|
||||||
|
var item = this.last_viewed[i];
|
||||||
|
var label = item.title;
|
||||||
|
var selected = false;//item.action.id == this.inner_action.id && item.action.res_id == this.inner_action.res_id;
|
||||||
|
var view_type = item.view_type;
|
||||||
|
var url = $.param(item.url);
|
||||||
|
var model = item.url.model;
|
||||||
|
var title = model;
|
||||||
|
|
||||||
|
var icon = this._model2icon[model];
|
||||||
|
if (!icon && /\.settings/.test(model))
|
||||||
|
icon = 'c';
|
||||||
|
if (icon)
|
||||||
|
icon = _.str.sprintf('<span class="oe_last_viewed_icon">%s</span>', icon);
|
||||||
|
titles.push(_.str.sprintf('<a title="%s" href="#%s" class="oe_last_viewed_item %s">%s %s <span class="oe_e %s"/></a>',
|
||||||
|
title,
|
||||||
|
url,
|
||||||
|
selected && 'selected' || '',
|
||||||
|
icon || '',
|
||||||
|
label,
|
||||||
|
view_type != 'form' && view_type || ''
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return titles.join(' <span class="oe_fade">|</span> ');
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
instance.web.ViewManagerAction.include({
|
||||||
|
try_add_last_viewed: function(view_type){
|
||||||
|
var view = this.views[view_type];
|
||||||
|
var act = view.options.action;
|
||||||
|
if (!act.type)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (act.target == 'new')
|
||||||
|
//skip widgets and popup forms
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var url = {
|
||||||
|
'view_type': view_type,
|
||||||
|
'model': act.res_model,
|
||||||
|
'menu_id': act.menu_id,
|
||||||
|
'action': act.id
|
||||||
|
}
|
||||||
|
var title = act.display_name;
|
||||||
|
var dr = view.controller.datarecord;
|
||||||
|
if (dr){
|
||||||
|
title = dr.display_name || title;
|
||||||
|
if (view_type=='form'){
|
||||||
|
url['id'] = dr.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (view_type=='form' && !url['id'])
|
||||||
|
return false;
|
||||||
|
var last_viewed_item = {
|
||||||
|
'title': title,
|
||||||
|
'url': url,
|
||||||
|
'view_type': view_type,
|
||||||
|
}
|
||||||
|
this.ActionManager.add_last_viewed(last_viewed_item);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
do_create_view: function(view_type) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
var res = this._super.apply(this, arguments);
|
||||||
|
|
||||||
|
var view = this.views[view_type];
|
||||||
|
|
||||||
|
var exec = function(){
|
||||||
|
if (self.active_view == view_type && self.try_add_last_viewed(view_type)){
|
||||||
|
self.update_last_viewed_title()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exec();
|
||||||
|
view.controller.on('change:title', this, function(){
|
||||||
|
exec()
|
||||||
|
})
|
||||||
|
|
||||||
|
return res;
|
||||||
|
|
||||||
|
},
|
||||||
|
update_last_viewed_title: function(){
|
||||||
|
this.$el.find('.oe_view_manager_last_viewed').html(this.get_action_manager().get_last_viewed_title());
|
||||||
|
},
|
||||||
|
set_title: function(){
|
||||||
|
this._super.apply(this, arguments);
|
||||||
|
if (this.action.target!='new')
|
||||||
|
this.update_last_viewed_title();
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
instance.mail.Wall.include({
|
||||||
|
start: function() {
|
||||||
|
this._super();
|
||||||
|
this.update_last_viewed_title();
|
||||||
|
},
|
||||||
|
update_last_viewed_title: function(){
|
||||||
|
this.$el.find('.oe_view_manager_last_viewed').html(this.ActionManager.get_last_viewed_title());
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<templates>
|
||||||
|
|
||||||
|
<t t-name="web_last_viewed_records.header">
|
||||||
|
<tr class="oe_header_row">
|
||||||
|
<td t-att-colspan="colspan or '3'">
|
||||||
|
<div class="oe_view_manager_last_viewed"/>
|
||||||
|
</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</t>
|
||||||
|
<t t-extend="ViewManagerAction">
|
||||||
|
<t t-jquery="tr.oe_header_row_top" t-operation="after">
|
||||||
|
<t t-call="web_last_viewed_records.header"/>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
<t t-extend="mail.wall">
|
||||||
|
<t t-jquery="tr.oe_header_row_top" t-operation="after">
|
||||||
|
<t t-call="web_last_viewed_records.header">
|
||||||
|
<t t-set="colspan" t-value="2"/>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</templates>
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<template id="assets_backend" name="custom bar assets" inherit_id="web.assets_backend">
|
||||||
|
<xpath expr="." position="inside">
|
||||||
|
<link rel="stylesheet" href="/web_last_viewed_records/static/src/css/main.css"/>
|
||||||
|
<script type="text/javascript" src="/web_last_viewed_records/static/src/js/main.js"></script>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
||||||
|
|
Loading…
Reference in New Issue