Merge pull request #128 from mistercrunch/css_templates

Allowing definition of css templates
This commit is contained in:
Maxime Beauchemin 2016-02-03 18:09:21 -08:00
commit cf5d290a12
5 changed files with 75 additions and 2 deletions

View File

@ -0,0 +1,34 @@
"""css templates
Revision ID: d827694c7555
Revises: 43df8de3a5f4
Create Date: 2016-02-03 17:41:10.944019
"""
# revision identifiers, used by Alembic.
revision = 'd827694c7555'
down_revision = '43df8de3a5f4'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
def upgrade():
op.create_table('css_templates',
sa.Column('created_on', sa.DateTime(), nullable=False),
sa.Column('changed_on', sa.DateTime(), nullable=False),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('template_name', sa.String(length=250), nullable=True),
sa.Column('css', sa.Text(), nullable=True),
sa.Column('changed_by_fk', sa.Integer(), nullable=True),
sa.Column('created_by_fk', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['changed_by_fk'], ['ab_user.id'], ),
sa.ForeignKeyConstraint(['created_by_fk'], ['ab_user.id'], ),
sa.PrimaryKeyConstraint('id')
)
def downgrade():
op.drop_table('css_templates')

View File

@ -62,6 +62,14 @@ class Url(Model, AuditMixinNullable):
url = Column(Text)
class CssTemplate(Model, AuditMixinNullable):
"""CSS templates for dashboards"""
__tablename__ = 'css_templates'
id = Column(Integer, primary_key=True)
template_name = Column(String(250))
css = Column(Text)
class Slice(Model, AuditMixinNullable):
"""A slice is essentially a report or a view on data"""
__tablename__ = 'slices'

View File

@ -489,6 +489,13 @@ var px = (function() {
error: function() {alert("Error :(")},
});
});
$(".select2").select2({dropdownAutoWidth : true});
$("#css_template").on("change", function() {
var css = $(this).find('option:selected').data('css');
$('#dash_css').val(css);
$("#user_style").html(css);
})
$("a.closeslice").click(function() {
var li = $(this).parents("li");
gridster.remove_widget(li);

View File

@ -23,7 +23,14 @@
<h4 class="modal-title" id="myModalLabel">Dashboard CSS</h4>
</div>
<div class="modal-body">
<textarea id="dash_css" rows="30" cols="60">
<select id="css_template" class="select2">
{% for t in templates %}
<option value="{{ t.id }}" data-css="{{t.css}}">
{{ t.template_name }}
</option>
{% endfor %}
</select><br>
<textarea id="dash_css" rows="30" cols="60" style="margin-top: 5px;">
{%- if dashboard.css %}
{{- dashboard.css }}
{% else %}
@ -58,7 +65,7 @@ body {
<i class="fa fa-filter"></i>
</button>
<button type="button" id="css" class="btn btn-default" data-toggle="modal" data-target="#css_modal">
<i class="fa fa-code"></i>
<i class="fa fa-css3"></i>
</button>
<a id="editdash" class="btn btn-default" href="/dashboardmodelview/edit/{{ dashboard.id }}">
<i class="fa fa-edit"></i>

View File

@ -198,6 +198,20 @@ appbuilder.add_view(
category_icon='fa-database',)
class CssTemplateModelView(PanoramixModelView, DeleteMixin):
datamodel = SQLAInterface(models.CssTemplate)
list_columns = ['template_name']
edit_columns = ['template_name', 'css']
add_columns = edit_columns
appbuilder.add_view(
CssTemplateModelView,
"CSS Templates",
icon="fa-css3",
category="",
category_icon='',)
class SliceModelView(PanoramixModelView, DeleteMixin):
datamodel = SQLAInterface(models.Slice)
can_add = False
@ -539,6 +553,8 @@ class Panoramix(BaseView):
else:
qry = qry.filter_by(slug=identifier)
templates = session.query(models.CssTemplate).all()
dashboard = qry.first()
pos_dict = {}
if dashboard.position_json:
@ -547,6 +563,7 @@ class Panoramix(BaseView):
for o in json.loads(dashboard.position_json)}
return self.render_template(
"panoramix/dashboard.html", dashboard=dashboard,
templates=templates,
pos_dict=pos_dict)
@has_access