Use Roboto font in all templates.
- Only install needed font files for Roboto and Roboto Condensed which strongly reduced the directory size of 'static/font'. - Make it easier to adjust custom font by using global css font definition in app.css and projector.css. - Remove Open Sans font.
This commit is contained in:
parent
77fdfd558f
commit
fb7b265826
11
bower.json
11
bower.json
@ -35,8 +35,7 @@
|
|||||||
"ngstorage": "~0.3.11",
|
"ngstorage": "~0.3.11",
|
||||||
"ngBootbox": "~0.1.3",
|
"ngBootbox": "~0.1.3",
|
||||||
"pdfmake-dist": "~0.1.27",
|
"pdfmake-dist": "~0.1.27",
|
||||||
"open-sans-fontface": "https://github.com/OpenSlides/open-sans.git#1.4.2.post1",
|
"roboto-fontface": "~0.6.0",
|
||||||
"roboto-condensed": "~0.3.0",
|
|
||||||
"tinymce": "~4.4.3",
|
"tinymce": "~4.4.3",
|
||||||
"tinymce-i18n": "OpenSlides/tinymce-i18n#a186ad61e0aa30fdf657e88f405f966d790f0805"
|
"tinymce-i18n": "OpenSlides/tinymce-i18n#a186ad61e0aa30fdf657e88f405f966d790f0805"
|
||||||
},
|
},
|
||||||
@ -50,6 +49,14 @@
|
|||||||
"pdfjs-dist": {
|
"pdfjs-dist": {
|
||||||
"main": "build/pdf.combined.js"
|
"main": "build/pdf.combined.js"
|
||||||
},
|
},
|
||||||
|
"roboto-fontface": {
|
||||||
|
"main": [
|
||||||
|
"fonts/Roboto/Roboto-Regular.woff",
|
||||||
|
"fonts/Roboto/Roboto-Medium.woff",
|
||||||
|
"fonts/Roboto-Condensed/Roboto-Condensed-Regular.woff",
|
||||||
|
"fonts/Roboto-Condensed/Roboto-Condensed-Light.woff"
|
||||||
|
]
|
||||||
|
},
|
||||||
"tinymce": {
|
"tinymce": {
|
||||||
"main": [
|
"main": [
|
||||||
"tinymce.js",
|
"tinymce.js",
|
||||||
|
@ -97,7 +97,7 @@ gulp.task('css-libs', function () {
|
|||||||
// Catches all font files from all bower components.
|
// Catches all font files from all bower components.
|
||||||
gulp.task('fonts-libs', function() {
|
gulp.task('fonts-libs', function() {
|
||||||
return gulp.src(mainBowerFiles({
|
return gulp.src(mainBowerFiles({
|
||||||
filter: /\.(eot)|(svg)|(ttf)|(woff)|(woff2)$/
|
filter: /\.woff$/
|
||||||
}))
|
}))
|
||||||
.pipe(gulp.dest(path.join(output_directory, 'fonts')));
|
.pipe(gulp.dest(path.join(output_directory, 'fonts')));
|
||||||
});
|
});
|
||||||
|
@ -260,22 +260,18 @@
|
|||||||
<!-- main content column -->
|
<!-- main content column -->
|
||||||
<div class="col-xs-6 content" style="padding-left: calc({{ item.parentCount }}*15px)">
|
<div class="col-xs-6 content" style="padding-left: calc({{ item.parentCount }}*15px)">
|
||||||
<div class="spacer-right">
|
<div class="spacer-right">
|
||||||
<strong>
|
<i class="fa fa-ban" ng-style="{'visibility': item.is_hidden ? 'visible' : 'hidden'}"
|
||||||
<i class="fa fa-ban fa-lg" ng-style="{'visibility': item.is_hidden ? 'visible' : 'hidden'}"
|
|
||||||
title="{{ 'Internal item' | translate }}"></i>
|
title="{{ 'Internal item' | translate }}"></i>
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<!-- ID and title -->
|
<!-- ID and title -->
|
||||||
<div>
|
<div>
|
||||||
<strong>
|
|
||||||
<a class="title" ui-sref="{{ getUpdateStatePrefix(item) }}.detail({id: item.content_object.id})" ng-show="isAllowedToSeeOpenLink(item)">
|
<a class="title" ui-sref="{{ getUpdateStatePrefix(item) }}.detail({id: item.content_object.id})" ng-show="isAllowedToSeeOpenLink(item)">
|
||||||
{{ item.getListViewTitle() }}
|
{{ item.getListViewTitle() }}
|
||||||
</a>
|
</a>
|
||||||
<span class="title" ng-hide="isAllowedToSeeOpenLink(item)">
|
<span class="title" ng-hide="isAllowedToSeeOpenLink(item)">
|
||||||
{{ item.getListViewTitle() }}
|
{{ item.getListViewTitle() }}
|
||||||
</span>
|
</span>
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- hover menu -->
|
<!-- hover menu -->
|
||||||
<div os-perms="agenda.can_see" ng-class="{'hiddenDiv': !item.hover}">
|
<div os-perms="agenda.can_see" ng-class="{'hiddenDiv': !item.hover}">
|
||||||
|
@ -224,11 +224,9 @@
|
|||||||
<div class="title-col">
|
<div class="title-col">
|
||||||
<!-- title and phase -->
|
<!-- title and phase -->
|
||||||
<div>
|
<div>
|
||||||
<strong>
|
<a class="title" ui-sref="assignments.assignment.detail({id: assignment.id})">
|
||||||
<a ui-sref="assignments.assignment.detail({id: assignment.id})">
|
|
||||||
{{ assignment.title }}
|
{{ assignment.title }}
|
||||||
</a>
|
</a>
|
||||||
</strong>
|
|
||||||
<span style="padding: 5px;" ng-mouseover="assignment.phaseHover=true" ng-mouseleave="assignment.phaseHover=false">
|
<span style="padding: 5px;" ng-mouseover="assignment.phaseHover=true" ng-mouseleave="assignment.phaseHover=false">
|
||||||
<span class="label" ng-class="{'label-primary': assignment.phase == 0,
|
<span class="label" ng-class="{'label-primary': assignment.phase == 0,
|
||||||
'label-warning': assignment.phase == 1,
|
'label-warning': assignment.phase == 1,
|
||||||
|
@ -1,7 +1,55 @@
|
|||||||
/*
|
/*
|
||||||
* OpenSlides template styles of web interface
|
* Font definitions for OpenSlides site
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto Condensed';
|
||||||
|
src: url('../fonts/Roboto-Condensed-Regular.woff') format('woff');
|
||||||
|
font-weight: 100;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto Condensed Light';
|
||||||
|
src: url('../fonts/Roboto-Condensed-Light.woff') format('woff');
|
||||||
|
font-weight: 100;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
src: url('../fonts/Roboto-Regular.woff') format('woff');
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto Medium';
|
||||||
|
src: url('../fonts/Roboto-Medium.woff') format('woff');
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
}
|
||||||
|
strong, b, .os-table .title {
|
||||||
|
font-family: "Roboto Medium";
|
||||||
|
font-family: "Roboto Medium", sans-serif;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1, h2, h3, h4, h5, h6, #header .title {
|
||||||
|
font-family: "Roboto Condensed", sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
#content .col2 h4 {
|
||||||
|
font-family: 'Roboto Condensed Light';
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
#content .col1 .meta .heading .drop-down-name, #content .col1 .meta h3 {
|
||||||
|
font-family: 'Roboto Condensed Light';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Template styles for OpenSlides site
|
||||||
|
*/
|
||||||
|
|
||||||
* { /* set margin/padding for all (block) elements to null */
|
* { /* set margin/padding for all (block) elements to null */
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -9,8 +57,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: "Open Sans",Helvetica,Arial,sans-serif;
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
color: #222;
|
color: #222;
|
||||||
@ -18,7 +64,6 @@ body {
|
|||||||
background: #e8eaed;
|
background: #e8eaed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
div {
|
div {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
@ -28,8 +73,6 @@ blockquote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
font-family: "Roboto Condensed",Helvetica,Arial,sans-serif;
|
|
||||||
font-weight: 400;
|
|
||||||
line-height: 1.1;
|
line-height: 1.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,8 +157,6 @@ img {
|
|||||||
#header .title {
|
#header .title {
|
||||||
float: left;
|
float: left;
|
||||||
margin: 2px 0 0 -5px;
|
margin: 2px 0 0 -5px;
|
||||||
font-family: "Roboto Condensed",Helvetica,Arial,sans-serif;
|
|
||||||
font-weight: 400;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,11 +466,10 @@ img {
|
|||||||
content: attr(data-line-number);
|
content: attr(data-line-number);
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 20px;
|
left: 20px;
|
||||||
top: 12px;
|
top: 10px;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
color: gray;
|
color: gray;
|
||||||
font-family: Courier, serif;
|
font-size: 12px;
|
||||||
font-size: 13px;
|
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,10 +483,9 @@ img {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
content: attr(data-line-number);
|
content: attr(data-line-number);
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
font-size: 11px;
|
font-size: 10px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
color: gray;
|
color: gray;
|
||||||
font-family: Courier, serif;
|
|
||||||
margin-top: -3px;
|
margin-top: -3px;
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
@ -678,8 +717,6 @@ img {
|
|||||||
#content .col2 h4 {
|
#content .col2 h4 {
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
font-family: 'Roboto Condensed Light';
|
|
||||||
font-weight: 300;
|
|
||||||
color: #444;
|
color: #444;
|
||||||
}
|
}
|
||||||
#content .col1 .meta .heading, #content .col1 .meta h3 {
|
#content .col1 .meta .heading, #content .col1 .meta h3 {
|
||||||
@ -691,9 +728,6 @@ img {
|
|||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
#content .col1 .meta .heading .drop-down-name, #content .col1 .meta h3 {
|
|
||||||
font-family: 'Roboto Condensed Light';
|
|
||||||
}
|
|
||||||
|
|
||||||
#content .col2 a:hover h4 {
|
#content .col2 a:hover h4 {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@ -1404,7 +1438,7 @@ img {
|
|||||||
/* override booststrap's label class to fix linebreak and add spacing */
|
/* override booststrap's label class to fix linebreak and add spacing */
|
||||||
.label {
|
.label {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: .3em .6em;
|
padding: .4em .6em;
|
||||||
margin-right: .2em;
|
margin-right: .2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1523,6 +1557,11 @@ tr.selected td {
|
|||||||
float: left;
|
float: left;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.motion-text.line-numbers-outside .os-line-number:after {
|
||||||
|
font-size: 10px;
|
||||||
|
top: 9px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,39 @@
|
|||||||
/*
|
/*
|
||||||
* OpenSlides default projector styles
|
* Font definitions for OpenSlides projector
|
||||||
|
*/
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto Condensed';
|
||||||
|
src: url('../fonts/Roboto-Condensed-Regular.woff') format('woff');
|
||||||
|
font-weight: 100;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto Condensed Light';
|
||||||
|
src: url('../fonts/Roboto-Condensed-Light.woff') format('woff');
|
||||||
|
font-weight: 100;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
src: url('../fonts/Roboto-Regular.woff') format('woff');
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
}
|
||||||
|
h1, h2, h3, h4, h5, h6, .countdown, .message {
|
||||||
|
font-family: "Roboto Condensed", sans-serif;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
#header, #currentTime, #footer {
|
||||||
|
font-family: 'Roboto Condensed Light';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Template styles for OpenSlides projector
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -11,7 +45,6 @@ body {
|
|||||||
font-size: 20px !important;
|
font-size: 20px !important;
|
||||||
line-height: 24px !important;
|
line-height: 24px !important;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-family: "Open Sans",Helvetica,Arial,sans-serif;
|
|
||||||
color: #222;
|
color: #222;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,7 +97,6 @@ body {
|
|||||||
box-shadow: 0 0 7px rgba(0,0,0,0.6);
|
box-shadow: 0 0 7px rgba(0,0,0,0.6);
|
||||||
height: 70px;
|
height: 70px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
font-family: 'Roboto Condensed Light';
|
|
||||||
}
|
}
|
||||||
#logo {
|
#logo {
|
||||||
position: relative;
|
position: relative;
|
||||||
@ -94,7 +126,6 @@ body {
|
|||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
#currentTime {
|
#currentTime {
|
||||||
font-family: 'Roboto Condensed Light';
|
|
||||||
border: 0 solid #000000;
|
border: 0 solid #000000;
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -104,7 +135,6 @@ body {
|
|||||||
padding-left: 30px;
|
padding-left: 30px;
|
||||||
}
|
}
|
||||||
#footer {
|
#footer {
|
||||||
font-family: 'Roboto Condensed Light';
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
@ -151,11 +181,6 @@ body {
|
|||||||
display: block !important;
|
display: block !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "Roboto Condensed",Helvetica,Arial,sans-serif;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 2.25em;
|
font-size: 2.25em;
|
||||||
line-height: 1.1em;
|
line-height: 1.1em;
|
||||||
@ -261,7 +286,6 @@ hr {
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
border-radius: 7px 7px 7px 7px;
|
border-radius: 7px 7px 7px 7px;
|
||||||
z-index: 320;
|
z-index: 320;
|
||||||
font-family: "Roboto Condensed",Helvetica,Arial,sans-serif;
|
|
||||||
}
|
}
|
||||||
.countdown .description {
|
.countdown .description {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -287,7 +311,6 @@ hr {
|
|||||||
z-index: 300;
|
z-index: 300;
|
||||||
}
|
}
|
||||||
.message {
|
.message {
|
||||||
font-family: "Roboto Condensed",Helvetica,Arial,sans-serif;
|
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 35%;
|
top: 35%;
|
||||||
@ -426,7 +449,6 @@ tr.elected td {
|
|||||||
left: -25px;
|
left: -25px;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
color: gray;
|
color: gray;
|
||||||
font-family: Courier, serif;
|
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
@ -444,7 +466,6 @@ tr.elected td {
|
|||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
color: gray;
|
color: gray;
|
||||||
font-family: Courier, serif;
|
|
||||||
margin-top: -5px;
|
margin-top: -5px;
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
|
@ -279,16 +279,12 @@
|
|||||||
<!-- main content column -->
|
<!-- main content column -->
|
||||||
<div class="col-xs-6 content">
|
<div class="col-xs-6 content">
|
||||||
<div class="spacer-right"> <!-- horizontal block -->
|
<div class="spacer-right"> <!-- horizontal block -->
|
||||||
<strong>
|
|
||||||
<i ng-style="{'visibility': mediafile.private ? 'visible' : 'hidden'}" class="fa fa-lock fa-lg"
|
<i ng-style="{'visibility': mediafile.private ? 'visible' : 'hidden'}" class="fa fa-lock fa-lg"
|
||||||
title="{{ 'Is private' | translate }}"></i>
|
title="{{ 'Is private' | translate }}"></i>
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div> <!-- vertical block -->
|
<div> <!-- vertical block -->
|
||||||
<strong>
|
<a ng-href="{{ mediafile.mediafileUrl }}" class="title" target="_blank">{{ mediafile.title_or_filename }}</a>
|
||||||
<a ng-href="{{ mediafile.mediafileUrl }}" target="_blank">{{ mediafile.title_or_filename }}</a>
|
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div><small>{{ mediafile.uploader.get_full_name() }}</small></div>
|
<div><small>{{ mediafile.uploader.get_full_name() }}</small></div>
|
||||||
<div os-perms="mediafiles.can_manage" ng-class="{'hiddenDiv': !mediafile.hover}">
|
<div os-perms="mediafiles.can_manage" ng-class="{'hiddenDiv': !mediafile.hover}">
|
||||||
|
@ -343,9 +343,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<!-- ID and title -->
|
<!-- ID and title -->
|
||||||
<div>
|
<div>
|
||||||
<strong>
|
|
||||||
<a class="title" ui-sref="motions.motion.detail({id: motion.id})">{{ motion.getTitle() }}</a>
|
<a class="title" ui-sref="motions.motion.detail({id: motion.id})">{{ motion.getTitle() }}</a>
|
||||||
</strong>
|
|
||||||
<i class="fa fa-paperclip" ng-if="motion.attachments_id.length > 0"></i>
|
<i class="fa fa-paperclip" ng-if="motion.attachments_id.length > 0"></i>
|
||||||
<span style="padding: 5px;" ng-mouseover="motion.stateHover=true" ng-mouseleave="motion.stateHover=false">
|
<span style="padding: 5px;" ng-mouseover="motion.stateHover=true" ng-mouseleave="motion.stateHover=false">
|
||||||
<span class="label" ng-class="'label-'+motion.state.css_class">
|
<span class="label" ng-class="'label-'+motion.state.css_class">
|
||||||
|
@ -277,18 +277,14 @@
|
|||||||
<!-- main content column -->
|
<!-- main content column -->
|
||||||
<div class="col-xs-6 content">
|
<div class="col-xs-6 content">
|
||||||
<div class="spacer-right"> <!-- horizontal block -->
|
<div class="spacer-right"> <!-- horizontal block -->
|
||||||
<strong>
|
|
||||||
<i ng-style="{'visibility': user.is_active === false ? 'visible' : 'hidden'}" class="fa fa-ban"
|
<i ng-style="{'visibility': user.is_active === false ? 'visible' : 'hidden'}" class="fa fa-ban"
|
||||||
title="{{ 'Is inactive' | translate }}"></i>
|
title="{{ 'Is inactive' | translate }}"></i>
|
||||||
<i ng-style="{'visibility': user.is_committee ? 'visible' : 'hidden'}" class="fa fa-university"
|
<i ng-style="{'visibility': user.is_committee ? 'visible' : 'hidden'}" class="fa fa-university"
|
||||||
title="{{ 'Is a committee' | translate }}"></i>
|
title="{{ 'Is a committee' | translate }}"></i>
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div> <!-- vertical block -->
|
<div> <!-- vertical block -->
|
||||||
<strong>
|
|
||||||
<a ui-sref="users.user.detail({id: user.id})" class="title">{{ user.get_short_name() }}</a>
|
<a ui-sref="users.user.detail({id: user.id})" class="title">{{ user.get_short_name() }}</a>
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div os-perms="users.can_manage"> <!-- user number -->
|
<div os-perms="users.can_manage"> <!-- user number -->
|
||||||
<div ng-if="user.number" editable-text="user.number" onaftersave="save(user)">
|
<div ng-if="user.number" editable-text="user.number" onaftersave="save(user)">
|
||||||
|
Loading…
Reference in New Issue
Block a user