Merge pull request #1723 from emanuelschuetze/newTemplateDesign

New template design
This commit is contained in:
Norman Jäckel 2015-11-30 20:40:37 +01:00
commit 9504cfe348
60 changed files with 2749 additions and 2450 deletions

View File

@ -16,3 +16,4 @@ Authors of OpenSlides in chronological order of first contribution:
Dominik Breu <dominikbreu@yahoo.de> Dominik Breu <dominikbreu@yahoo.de>
André Böhlke <ab@bcoding.de> André Böhlke <ab@bcoding.de>
René von der Haar <rene.vonderhaar@medienweite.de> (Logo design) René von der Haar <rene.vonderhaar@medienweite.de> (Logo design)
Jörn Bensch <bensch@triagonale.de> (Template design)

View File

@ -20,7 +20,6 @@
"angular-ui-switch": "~0.1.1", "angular-ui-switch": "~0.1.1",
"angular-ui-tree": "~2.2.0", "angular-ui-tree": "~2.2.0",
"angular-gettext": "~2.1.2", "angular-gettext": "~2.1.2",
"angular-xeditable": "~0.1.9",
"angular-scroll-glue": "~2.0.6", "angular-scroll-glue": "~2.0.6",
"ngBootbox": "~0.1.2", "ngBootbox": "~0.1.2",
"ng-dialog": "~0.5.6", "ng-dialog": "~0.5.6",
@ -30,6 +29,8 @@
"js-data-angular": "~3.1.0", "js-data-angular": "~3.1.0",
"ng-file-upload": "~9.1.2", "ng-file-upload": "~9.1.2",
"ckeditor": "~4.5.4", "ckeditor": "~4.5.4",
"angular-ckeditor": "~1.0.0" "angular-ckeditor": "~1.0.0",
"roboto-condensed": "~0.3.0",
"opensans-webfont-for-bower": "a4b3b75afa"
} }
} }

View File

@ -83,6 +83,7 @@ angular.module('OpenSlidesApp.agenda.site', ['OpenSlidesApp.agenda'])
$scope.items = AgendaTree.getFlatTree(Agenda.getAll()); $scope.items = AgendaTree.getFlatTree(Agenda.getAll());
}); });
$scope.alert = {}; $scope.alert = {};
$scope.isFilter = true;
// project related item (content object) // project related item (content object)
$scope.project = function (item) { $scope.project = function (item) {

View File

@ -1,10 +1,17 @@
<h1>{{ item.title }}</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="agenda.item.list" class="btn btn-sm btn-default"> <a ui-sref="agenda.item.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to agenda</translate> <translate>Back to agenda</translate>
</a> </a>
<!-- TODO: project list
ng-class="{ 'btn-primary': item.isListOfSpeakersProjected() }"-->
<a os-perms="core.can_manage_projector" class="btn btn-default btn-sm"
ng-click="projectListOfSpeakers()">
<i class="fa fa-video-camera"></i>
<translate>List of speakers</translate>
</a>
<!-- project --> <!-- project -->
<a os-perms="core.can_manage_projector" class="btn btn-default btn-sm" <a os-perms="core.can_manage_projector" class="btn btn-default btn-sm"
ng-class="{ 'btn-primary': item.isProjected() }" ng-class="{ 'btn-primary': item.isProjected() }"
@ -12,40 +19,35 @@
title="{{ 'Project item' | translate }}"> title="{{ 'Project item' | translate }}">
<i class="fa fa-video-camera"></i> <i class="fa fa-video-camera"></i>
</a> </a>
</div>
<h1>{{ item.title }}</h1>
<h2><translate>List of speakers</translate></h2>
</div>
</div> </div>
<div class="details">
<h2> <div class="pull-right">
<translate>List of speakers</translate>
<span os-perms="agenda.can_manage"> <span os-perms="agenda.can_manage">
<button ng-if="item.speaker_list_closed" ng-click="closeList(false)" <button ng-if="item.speaker_list_closed" ng-click="closeList(false)"
class="btn btn-sm btn-danger" translate> class="btn btn-sm btn-default" translate>
Closed <i class="fa fa-toggle-off"></i>
Close
</button> </button>
<button ng-if="!item.speaker_list_closed" ng-click="closeList(true)" <button ng-if="!item.speaker_list_closed" ng-click="closeList(true)"
class="btn btn-sm btn-success" translate> class="btn btn-sm btn-default" translate>
Opened <i class="fa fa-toggle-on"></i>
Open
</button> </button>
</span> </span>
<!-- TODO: project list </div>
ng-class="{ 'btn-primary': item.isListOfSpeakersProjected() }"-->
<a os-perms="core.can_manage_projector" class="btn btn-default btn-sm"
ng-click="projectListOfSpeakers()">
<i class="fa fa-video-camera"></i>
<translate>List of speakers</translate>
</a>
</h2>
<!-- TODO: <!-- TODO:
* show only 'add me' OR 'remove me' button * show only 'add me' OR 'remove me' button
--> -->
<button class="btn btn-default btn-xs" type="button" <button class="btn btn-default btn-sm" ng-click="showOldSpeakers = !showOldSpeakers">
data-toggle="collapse" data-target="#old_speakers"
aria-expanded="false" aria-controls="collapseExample">
Show all old speakers Show all old speakers
</button> </button>
<div uib-collapse="!showOldSpeakers">
<div class="collapse" id="old_speakers">
<h3 translate>Old speakers:</h3> <h3 translate>Old speakers:</h3>
<ol> <ol>
<li ng-repeat="speaker in item.speakers | filter: {end_time: '!!'}"> <li ng-repeat="speaker in item.speakers | filter: {end_time: '!!'}">
@ -116,3 +118,4 @@
<translate>Stop current speaker</translate> <translate>Stop current speaker</translate>
</button> </button>
</div> </div>
</div>

View File

@ -1,51 +0,0 @@
<h1 ng-if="item.id" translate>Edit agenda item</h1>
<h1 ng-if="!item.id" translate>New agenda item</h1>
<div id="submenu">
<a ui-sref="agenda.item.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate>
</a>
</div>
<form name="agendaItemForm">
<div class="form-group">
<label for="inputNumber" translate>Number</label>
<input type="text" ng-model="item.item_number" class="form-control" name="inputNumber">
</div>
<div class="form-group">
<label for="inputTitle" translate>Title</label>
<input type="text" ng-model="item.title" class="form-control" name="inputTitle" required>
</div>
<div class="form-group">
<label for="textareaDesciption" translate>Text</label>
<textarea ng-model="item.text" class="form-control" name="textareaText" />
</div>
<div class="form-group">
<label for="textareaComment" translate>Comment</label>
<textarea ng-model="item.comment" class="form-control" name="textareaComment" />
</div>
<div class="form-group">
<label for="inputDuration" translate>Duration</label>
<input type="text" ng-model="item.duration" class="form-control" name="inputDuration">
</div>
<div class="form-group">
<label for="selectType" translate>Type</label>
<select ng-options="type.value as type.display_name for type in types"
ng-model="item.type" class="form-control" name="selectType">
</select>
</div>
<div class="form-group">
<label for="selectTags" translate>Tags</label>
<select multiple ng-options="tag.id as tag.name for tag in tags"
ng-model="item.tags_id" class="form-control" name="selectTags">
</select>
</div>
<button type="submit" ng-click="save(item)" class="btn btn-primary" translate>
Save
</button>
<button ui-sref="agenda.item.list" class="btn btn-default" translate>
Cancel
</button>
</form>

View File

@ -1,13 +1,17 @@
<h1 translate>Import agenda items</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="agenda.item.list" class="btn btn-sm btn-default"> <a ui-sref="agenda.item.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1 translate>Import agenda items</h1>
</div>
</div> </div>
<h2 translate>Import by copy/paste</h2> <div class="details">
<h3 translate>Import by copy/paste</h3>
<p translate>Copy and paste your agenda item titles in this textbox. <p translate>Copy and paste your agenda item titles in this textbox.
Keep each item in a single line.</p> Keep each item in a single line.</p>
@ -28,7 +32,7 @@ Keep each item in a single line.</p>
<hr> <hr>
<h2 translate>Import by CSV file</h2> <h3 translate>Import by CSV file</h3>
<p translate>Select a CSV file to import agenda items! <p translate>Select a CSV file to import agenda items!
<p translate>Please note:</p> <p translate>Please note:</p>
@ -86,3 +90,4 @@ Keep each item in a single line.</p>
</button> </button>
</div> </div>
</div> </div>
</div>

View File

@ -1,6 +1,6 @@
<h1 translate>Agenda</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ng-click="newDialog()" os-perms="agenda.can_manage" class="btn btn-primary btn-sm"> <a ng-click="newDialog()" os-perms="agenda.can_manage" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i> <i class="fa fa-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
@ -21,76 +21,90 @@
<i class="fa fa-file-pdf-o fa-lg"></i> <i class="fa fa-file-pdf-o fa-lg"></i>
<translate>PDF</translate> <translate>PDF</translate>
</a> </a>
</div>
<h1 translate>Agenda</h1>
</div>
</div> </div>
<div class="details">
<div class="row"> <div class="row">
<div class="col-sm-8"> <div class="col-sm-6">
<form class="form-inline"> <form class="form-inline">
<!-- delete mode --> <!-- delete mode -->
<div os-perms-lite="agenda.can_manage" class="form-group"> <button os-perms-lite="agenda.can_manage" class="btn btn-default"
<label for="deleteSwitcher" translate>Delete mode</label> ng-click="isDeleteMode = !isDeleteMode; uncheckAll()">
<switch id="deleteSwitcher" ng-model="isDeleteMode" ng-change="uncheckAll()" <i class="fa fa-check-square-o"></i>
on="{{'On'|translate}}" off="{{'Off'|translate}}" <translate>Select</translate>...
class="green wide form-control"> </button>
</switch>
</div>
<div class="form-group"> <div class="form-group">
<!-- project agenda button --> <!-- project agenda button -->
<a ng-show="!isDeleteMode" os-perms="core.can_manage_projector" <a os-perms="core.can_manage_projector"
class="btn btn-default btn-sm form-control" class="btn btn-default form-control"
title="'Project agenda'|translate"
ng-click="projectAgenda()" ng-click="projectAgenda()"
ng-class="{ 'btn-primary': isAgendaProjected() }"> ng-class="{ 'btn-primary': isAgendaProjected() }">
<i class="fa fa-video-camera"></i> <i class="fa fa-video-camera"></i>
<translate>Project agenda</translate> <translate>Agenda</translate>
</a> </a>
<!-- auto numbering button --> <!-- auto numbering button -->
<a ng-show="!isDeleteMode" os-perms="core.can_manage_projector" <a os-perms="core.can_manage_projector"
class="btn btn-default btn-sm form-control" class="btn btn-default form-control"
ng-click="autoNumbering()"> ng-click="autoNumbering()">
<i class="fa fa-list-ol"></i> <i class="fa fa-sort-numeric-asc"></i>
<translate>Number agenda items</translate> <translate>Auto numbering</translate>
</a> </a>
<!-- delete button -->
<a ng-show="isDeleteMode && (items|filter:{selected:true}).length > 0"
os-perms="agenda.can_manage" ng-click="delete()"
class="btn btn-primary btn-sm form-control">
<i class="fa fa-trash fa-lg"></i>
<translate>Delete selected items</translate>
</a>
<!-- hidden item filter -->
<label>
<input type="checkbox" ng-model="filter.noHiddenItems" ng-true-value="1" ng-false-value="">
<translate> Hide internal agenda items</translate>
</label>
<!-- closed filter -->
<label>
<input type="checkbox" ng-model="filter.noClosedItems" ng-true-value="false" ng-false-value="">
<translate> Hide closed items</translate>
</label>
</div> </div>
</form> </form>
</div> </div>
<div class="col-sm-4"> <div class="col-sm-6">
<div class="form-inline text-right">
<div class="form-group">
<div class="input-group"> <div class="input-group">
<div class="input-group-addon"><i class="fa fa-filter"></i></div> <div class="input-group-addon"><i class="fa fa-search"></i></div>
<input type="text" os-focus-me ng-model="filter.search" class="form-control" <input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate}}"> placeholder="{{ 'Search' | translate}}">
</div>
</div>
<button class="btn btn-default" ng-click="isFilter = !isFilter">
<i class="fa fa-filter"></i>
<translate>Filter</translate>...
</button>
</div>
</div>
</div>
<div uib-collapse="isFilter" class="row">
<div class="col-sm-12 text-right">
<!-- hidden item filter -->
<input type="checkbox" ng-model="filter.noHiddenItems" ng-true-value="1" ng-false-value="">
<translate> Hide internal agenda items</translate>
<!-- closed filter -->
<input type="checkbox" ng-model="filter.noClosedItems" ng-true-value="false" ng-false-value="">
<translate> Hide closed items</translate>
</div>
</div>
<div uib-collapse="!isDeleteMode" class="row spacer">
<div class="col-sm-12 text-left">
<!-- delete button -->
<a ng-show="isDeleteMode"
os-perms="agenda.can_manage" ng-click="delete()"
class="btn btn-primary">
<i class="fa fa-trash fa-lg"></i>
<translate>Delete selected items</translate>
</a>
</div> </div>
</div> </div>
</div>
<i> <i class="spacer">
{{ items.length }} {{ "items" | translate }}<span ng-if="(items|filter:{selected:true}).length > 0">, {{ items.length }} {{ "items" | translate }}<span ng-if="(items|filter:{selected:true}).length > 0">,
{{(items|filter:{selected:true}).length}} {{ "selected" | translate }}</span> {{(items|filter:{selected:true}).length}} {{ "selected" | translate }}</span>
</i> </i>
<table class="table table-striped table-bordered table-hover"> <table class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<!-- projector column --> <!-- projector column -->
<th ng-show="!isDeleteMode" os-perms="core.can_manage_projector" class="firstColumn"></th> <th ng-show="!isDeleteMode" os-perms="core.can_manage_projector" class="minimum"></th>
<!-- delete selection column --> <!-- delete selection column -->
<th ng-show="isDeleteMode" os-perms-lite="agenda.can_manage" class="firstColumn deleteColumn" <th ng-show="isDeleteMode" os-perms-lite="agenda.can_manage" class="minimum deleteColumn"
ng-click="$event.stopPropagation();"> ng-click="$event.stopPropagation();">
<input type="checkbox" ng-model="selectedAll" ng-change="checkAll()"> <input type="checkbox" ng-model="selectedAll" ng-change="checkAll()">
<!-- agenda item column --> <!-- agenda item column -->
@ -192,4 +206,5 @@
<a href="" ng-click="edit(item)" class="pull-right"><translate>Edit</translate>...</a> <a href="" ng-click="edit(item)" class="pull-right"><translate>Edit</translate>...</a>
</div> </div>
</form> </form>
</table> </table>
</div>

View File

@ -1,18 +1,23 @@
<h1 translate>Sort agenda</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="agenda.item.list" class="btn btn-sm btn-default"> <a ui-sref="agenda.item.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1 translate>Sort agenda</h1>
</div>
</div> </div>
<p translate>Drag and drop items to change the order of the agenda. Your modification will be saved directly.</p> <div class="details">
<p class="lead" translate>Drag and drop items to change the order of the agenda. Your modification will be saved directly.</p>
<div ui-tree callbacks="treeOptions"> <div ui-tree callbacks="treeOptions">
<ol ui-tree-nodes="" ng-model="items" id="tree-root"> <ol ui-tree-nodes="" ng-model="items" id="tree-root">
<li ng-repeat="item in items" ui-tree-node ng-include="'nodes_renderer.html'"> <li ng-repeat="item in items" ui-tree-node ng-include="'nodes_renderer.html'">
</ol> </ol>
</div>
</div> </div>

View File

@ -319,14 +319,17 @@ angular.module('OpenSlidesApp.assignments.site', ['OpenSlidesApp.assignments'])
poll.DSDestroy(); poll.DSDestroy();
} }
// edit poll dialog // edit poll dialog
$scope.editPollDialog = function (poll) { $scope.editPollDialog = function (poll, ballot) {
ngDialog.open({ ngDialog.open({
template: 'static/templates/assignments/assignmentpoll-form.html', template: 'static/templates/assignments/assignmentpoll-form.html',
controller: 'AssignmentPollUpdateCtrl', controller: 'AssignmentPollUpdateCtrl',
className: 'ngdialog-theme-default', className: 'ngdialog-theme-default',
resolve: { resolve: {
assignmentpoll: function(AssignmentPoll) { assignmentpoll: function (AssignmentPoll) {
return AssignmentPoll.find(poll.id); return AssignmentPoll.find(poll.id);
},
ballot: function () {
return ballot;
} }
} }
}); });
@ -394,9 +397,11 @@ angular.module('OpenSlidesApp.assignments.site', ['OpenSlidesApp.assignments'])
'gettext', 'gettext',
'AssignmentPoll', 'AssignmentPoll',
'assignmentpoll', 'assignmentpoll',
function($scope, $state, gettext, AssignmentPoll, assignmentpoll) { 'ballot',
function($scope, $state, gettext, AssignmentPoll, assignmentpoll, ballot) {
// set initial values for form model // set initial values for form model
$scope.model = assignmentpoll; $scope.model = assignmentpoll;
$scope.ballot = ballot;
$scope.formFields = []; $scope.formFields = [];
// add dynamic form fields // add dynamic form fields
assignmentpoll.options.forEach(function(option) { assignmentpoll.options.forEach(function(option) {

View File

@ -1,6 +1,6 @@
<h1>{{ assignment.title }}</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="assignments.assignment.list" class="btn btn-sm btn-default"> <a ui-sref="assignments.assignment.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
@ -27,23 +27,27 @@
title="{{ 'Edit' | translate}}"> title="{{ 'Edit' | translate}}">
<i class="fa fa-pencil"></i> <i class="fa fa-pencil"></i>
</a> </a>
</div>
<h1>{{ assignment.title }}</h1>
<h2 translate>Election</h2>
</div>
</div> </div>
<div class="details">
<h3 translate>Description</h3>
<div class="white-space-pre-line">{{ assignment.description }}</div>
<h3 translate>Description</h3> <h3 translate>Candidates</h3>
<div class="white-space-pre-line">{{ assignment.description }}</div> <ol>
<h3 translate>Candidates</h3>
<ol>
<li ng-repeat="related_user in assignment.assignment_related_users" ng-if="related_user.status == 1"> <li ng-repeat="related_user in assignment.assignment_related_users" ng-if="related_user.status == 1">
<a ui-sref="users.user.detail({id: related_user.user_id})">{{ related_user.user.get_full_name() }}</a> <a ui-sref="users.user.detail({id: related_user.user_id})">{{ related_user.user.get_full_name() }}</a>
<button os-perms="assignments.can_manage" ng-click="removeCandidate(related_user.user_id)" <button os-perms="assignments.can_manage" ng-click="removeCandidate(related_user.user_id)"
class="btn btn-default btn-xs"> class="btn btn-default btn-xs">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</button> </button>
</ol> </ol>
<div class="form-group"> <div class="form-group">
<alert ng-show="alert.show" type="{{ alert.type }}" ng-click="alert={}" close="alert={}"> <alert ng-show="alert.show" type="{{ alert.type }}" ng-click="alert={}" close="alert={}">
{{alert.msg}} {{alert.msg}}
</alert> </alert>
@ -71,18 +75,18 @@
<i class="fa fa-minus"></i> <i class="fa fa-minus"></i>
<translate>Remove me</translate> <translate>Remove me</translate>
</button> </button>
</div> </div>
<h3 translate>Election result</h3> <h3 translate>Election result</h3>
<button os-perms="assignments.can_manage" ng-click="createBallot()" class="btn btn-default btn-sm"> <button os-perms="assignments.can_manage" ng-click="createBallot()" class="btn btn-default btn-sm">
<i class="fa fa-bar-chart fa-lg"></i> <i class="fa fa-bar-chart fa-lg"></i>
<translate>New ballot</translate> <translate>New ballot</translate>
</button> </button>
<uib-tabset class="spacer"> <uib-tabset class="spacer">
<uib-tab ng-repeat="poll in assignment.polls" heading="Ballot {{$index+1}}"> <uib-tab ng-repeat="poll in assignment.polls" heading="Ballot {{$index+1}}">
<div os-perms="assignments.can_manage" class="spacer"> <div os-perms="assignments.can_manage" class="spacer">
<button ng-click="editPollDialog(poll)" <button ng-click="editPollDialog(poll, $index+1)"
class="btn btn-default btn-sm"> class="btn btn-default btn-sm">
<i class="fa fa-pencil"></i> <i class="fa fa-pencil"></i>
<translate>Edit</translate> <translate>Edit</translate>
@ -123,4 +127,5 @@
Votes cast: {{ poll.votescast }} Votes cast: {{ poll.votescast }}
</div> </div>
</uib-tab> </uib-tab>
</uib-tabset> </uib-tabset>
</div>

View File

@ -1,6 +1,6 @@
<h1 translate>Elections</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ng-click="newDialog()" os-perms="assignments.can_manage" class="btn btn-primary btn-sm"> <a ng-click="newDialog()" os-perms="assignments.can_manage" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i> <i class="fa fa-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
@ -13,50 +13,72 @@
<i class="fa fa-file-pdf-o fa-lg"></i> <i class="fa fa-file-pdf-o fa-lg"></i>
<translate>PDF</translate> <translate>PDF</translate>
</a> </a>
</div>
<h1 translate>Elections</h1>
</div>
</div> </div>
<div class="row form-group"> <div class="details">
<div class="col-sm-8"> <div class="row form-group">
<div class="col-sm-6">
<form class="form-inline"> <form class="form-inline">
<!-- delete mode --> <!-- delete mode -->
<div os-perms-lite="assignments.can_manage" class="form-group"> <button os-perms-lite="assignments.can_manage" class="btn btn-default"
<label for="deleteSwitcher" translate>Delete mode</label> ng-click="isDeleteMode = !isDeleteMode; uncheckAll()">
<switch id="deleteSwitcher" ng-model="isDeleteMode" ng-change="uncheckAll()" <i class="fa fa-check-square-o"></i>
on="{{'On'|translate}}" off="{{'Off'|translate}}" <translate>Select</translate>...
class="green wide form-control"> </button>
</switch> </form>
</div> </div>
<!-- delete button --> <div class="col-sm-6">
<a ng-show="isDeleteMode && (assignments|filter:{selected:true}).length > 0" <div class="form-inline text-right">
os-perms="assignments.can_manage" ng-click="deleteMultiple()" <div class="form-group">
class="btn btn-primary btn-sm form-control"> <div class="input-group">
<i class="fa fa-trash fa-lg"></i> <div class="input-group-addon"><i class="fa fa-search"></i></div>
<translate>Delete selected elections</translate> <input type="text" os-focus-me ng-model="filter.search" class="form-control"
</a> placeholder="{{ 'Search' | translate}}">
</div>
</div>
<button class="btn btn-default" ng-click="isFilter = !isFilter">
<i class="fa fa-filter"></i>
<translate>Filter</translate>...
</button>
</div>
</div>
</div>
<div uib-collapse="!isFilter" class="row">
<div class="col-sm-6 text-right"></div>
<div class="col-sm-6 text-right">
<!-- phase filter --> <!-- phase filter -->
&nbsp;
<select ng-model="phaseFilter" class="form-control" id="phaseFilter"> <select ng-model="phaseFilter" class="form-control" id="phaseFilter">
<option value="" translate>--- Select phase ---</option> <option value="" translate>--- Select phase ---</option>
<option ng-repeat="phase in phases" value="{{ phase.value }}">{{ phase.display_name }}</option> <option ng-repeat="phase in phases" value="{{ phase.value }}">{{ phase.display_name }}</option>
</select> </select>
</form>
</div>
<div class="col-sm-4">
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-filter"></i></div>
<input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate}}">
</div> </div>
</div> </div>
</div> <div uib-collapse="!isDeleteMode" class="row spacer">
<div class="col-sm-12 text-left">
<!-- delete button -->
<a ng-show="isDeleteMode"
os-perms="assignments.can_manage" ng-click="deleteMultiple()"
class="btn btn-primary">
<i class="fa fa-trash fa-lg"></i>
<translate>Delete selected elections</translate>
</a>
</div>
</div>
<table class="table table-striped table-bordered table-hover"> <i class="spacer">
{{ assignments.length }} {{ "elections" | translate }}<span ng-if="(assignments|filter:{selected:true}).length > 0">,
{{(assignments|filter:{selected:true}).length}} {{ "selected" | translate }}</span>
</i>
<table class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<!-- projector column --> <!-- projector column -->
<th ng-show="!isDeleteMode" os-perms="core.can_manage_projector" class="firstColumn"> <th ng-show="!isDeleteMode" os-perms="core.can_manage_projector" class="minimum">
<!-- delete selection column --> <!-- delete selection column -->
<th ng-show="isDeleteMode" os-perms-lite="assignments.can_manage" class="firstColumn deleteColumn"> <th ng-show="isDeleteMode" os-perms-lite="assignments.can_manage" class="minimum deleteColumn">
<input type="checkbox" ng-model="selectedAll" ng-change="checkAll()"> <input type="checkbox" ng-model="selectedAll" ng-change="checkAll()">
<th ng-click="toggleSort('title')" class="sortable"> <th ng-click="toggleSort('title')" class="sortable">
<translate>Title</translate> <translate>Title</translate>
@ -142,4 +164,5 @@
<a href="" ng-click="editDialog(assignment)" <a href="" ng-click="editDialog(assignment)"
class="pull-right" translate>Edit election...</a> class="pull-right" translate>Edit election...</a>
</div> </div>
</table> </table>
</div>

View File

@ -1,4 +1,4 @@
<h1 translate>Update ballot</h1> <h1 translate>Ballot {{ ballot }}</h1>
<form name="assignmentpollForm" ng-submit="save(model)"> <form name="assignmentpollForm" ng-submit="save(model)">
<formly-form model="model" fields="formFields"> <formly-form model="model" fields="formFields">

View File

@ -84,7 +84,7 @@ def setup_general_config(sender, **kwargs):
label=ugettext_lazy('Show logo on projector'), label=ugettext_lazy('Show logo on projector'),
help_text=ugettext_lazy( help_text=ugettext_lazy(
'You can replace the logo. Just copy a file to ' 'You can replace the logo. Just copy a file to '
'"static/img/logo.png" in your OpenSlides data path.'), '"static/img/logo-projector.png" in your OpenSlides data path.'),
weight=150, weight=150,
group=ugettext_lazy('Projector')) group=ugettext_lazy('Projector'))

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -4,14 +4,12 @@
// The core module used for the OpenSlides site and the projector // The core module used for the OpenSlides site and the projector
angular.module('OpenSlidesApp.core', [ angular.module('OpenSlidesApp.core', [
'angular-loading-bar',
'js-data', 'js-data',
'gettext', 'gettext',
'ngAnimate', 'ngAnimate',
'ngSanitize', // TODO: only use this in functions that need it. 'ngSanitize', // TODO: only use this in functions that need it.
'ui.bootstrap', 'ui.bootstrap',
'ui.tree', 'ui.tree',
'uiSwitch',
]) ])
.config(['DSProvider', 'DSHttpAdapterProvider', function(DSProvider, DSHttpAdapterProvider) { .config(['DSProvider', 'DSHttpAdapterProvider', function(DSProvider, DSHttpAdapterProvider) {

View File

@ -6,6 +6,7 @@
angular.module('OpenSlidesApp.core.site', [ angular.module('OpenSlidesApp.core.site', [
'OpenSlidesApp.core', 'OpenSlidesApp.core',
'ui.router', 'ui.router',
'angular-loading-bar',
'formly', 'formly',
'formlyBootstrap', 'formlyBootstrap',
'ngBootbox', 'ngBootbox',
@ -14,7 +15,6 @@ angular.module('OpenSlidesApp.core.site', [
'ngCsvImport', 'ngCsvImport',
'ui.select', 'ui.select',
'luegg.directives', 'luegg.directives',
'xeditable',
'ckeditor', 'ckeditor',
]) ])
@ -73,14 +73,6 @@ angular.module('OpenSlidesApp.core.site', [
'weight': 100, 'weight': 100,
}); });
mainMenuProvider.register({
'ui_sref': 'core.customslide.list',
'img_class': 'video-camera',
'title': 'Projector',
'weight': 110,
'perm': 'core.can_see_projector',
});
mainMenuProvider.register({ mainMenuProvider.register({
'ui_sref': 'config', 'ui_sref': 'config',
'img_class': 'cog', 'img_class': 'cog',
@ -288,11 +280,6 @@ angular.module('OpenSlidesApp.core.site', [
}); });
}) })
// options for angular-xeditable
.run(function(editableOptions) {
editableOptions.theme = 'bs3';
})
// angular formly config options // angular formly config options
.run([ .run([
'formlyConfig', 'formlyConfig',
@ -367,6 +354,17 @@ angular.module('OpenSlidesApp.core.site', [
}; };
}) })
// Projector Sidebar Controller
.controller('ProjectorSidebarCtrl', [
'$scope',
function ($scope) {
$scope.isProjectorSidebar = false;
$scope.showProjectorSidebar = function (show) {
$scope.isProjectorSidebar = show;
};
}
])
// Version Controller // Version Controller
.controller('VersionCtrl', [ .controller('VersionCtrl', [
'$scope', '$scope',

View File

@ -1,6 +1,11 @@
<h1 translate>Settings</h1> <div class="header">
<div class="title">
<h1 translate>Settings</h1>
</div>
</div>
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> <div class="details">
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<!-- generate config groups --> <!-- generate config groups -->
<div ng-repeat="group in configGroups"> <div ng-repeat="group in configGroups">
<div class="panel panel-default"> <div class="panel panel-default">
@ -24,5 +29,6 @@
</div> <!-- group.name --> </div> <!-- group.name -->
</div> </div>
</div> </div>
</div>
</div> </div>

View File

@ -1,6 +1,6 @@
<h1>{{ customslide.title }}</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="agenda.item.list" class="btn btn-sm btn-default"> <a ui-sref="agenda.item.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
@ -17,7 +17,12 @@
title="{{ 'Project agenda item' | translate }}"> title="{{ 'Project agenda item' | translate }}">
<i class="fa fa-video-camera"></i> <i class="fa fa-video-camera"></i>
</a> </a>
</div>
<h1>{{ customslide.title }}</h1>
<h2 translate>Agenda item</h2>
</div>
</div> </div>
<div ng-bind-html="customslide.text"></div> <div class="details">
<div ng-bind-html="customslide.text"></div>
</div>

View File

@ -1,5 +1,5 @@
<h1 ng-if="model.id" translate>Edit agenda item</h1> <h1 ng-if="model.id" translate>Edit agenda item</h1>
<h2 ng-if="!model.id" translate>New agenda item</h2> <h1 ng-if="!model.id" translate>New agenda item</h1>
<form name="customslideForm" ng-submit="save(model)"> <form name="customslideForm" ng-submit="save(model)">
<formly-form model="model" fields="formFields"> <formly-form model="model" fields="formFields">

View File

@ -1,55 +0,0 @@
<h1 translate>Custom slides</h1>
<div id="submenu">
<a ui-sref="core.customslide.create" os-perms="core.can_manage_projector" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i>
<translate>New</translate>
</a>
</div>
<div class="row form-group">
<div class="col-sm-8" os-perms="core.can_manage_projector">
<p><input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate}}">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th ng-click="toggleSort('title')" class="sortable">
<translate>Title</translate>
<i class="pull-right fa" ng-show="sortColumn === 'title' && header.sortable != false"
ng-class="reverse ? 'fa-sort-desc' : 'fa-sort-asc'">
</i>
<th os-perms="core.can_manage_projector" class="minimum">
<translate>Actions</translate>
<tbody>
<tr ng-repeat="customslide in customslides | filter: filter.search |
orderBy: sortColumn:reverse" ng-class="{ 'activeline': customslide.isProjected() }">
<td><a ui-sref="core.customslide.detail({id: customslide.id})">{{ customslide.title }}</a>
<td os-perms="core.can_manage_projector" class="nobr">
<!-- project -->
<a os-perms="core.can_manage_projector" class="btn btn-default btn-sm" ng-class="{ 'btn-primary': customslide.isProjected() }"
ng-click="customslide.project()"
title="{{ 'Project user' | translate }}">
<i class="fa fa-video-camera"></i>
</a>
<!-- edit -->
<a ui-sref="core.customslide.detail.update({id: customslide.id })"
class="btn btn-default btn-sm"
title="{{ 'Edit' | translate}}">
<i class="fa fa-pencil"></i>
</a>
<!-- delete -->
<a ng-click="delete(customslide)" class="btn btn-danger btn-sm"
title="{{ 'Delete' | translate }}">
<i class="fa fa-trash-o"></i>
</a>
</table>
</div>
<div class="col-sm-4">
<div class="well">
<div ng-include src="'static/templates/core/projector-controls.html'"></div>
</div>
</div>
</div>

View File

@ -1,6 +1,6 @@
<form ng-submit="login(username, password)"> <form ng-submit="login(username, password)">
<div class="modal-header"> <div class="modal-header">
<img src="/static/img/logo-login.png" alt="OpenSlides" class="center-block"> <img src="/static/img/openslides-logo.png" alt="OpenSlides" class="login-logo center-block">
</div> </div>
<div class="modal-body"> <div class="modal-body">
<uib-alert ng-repeat="alert in alerts" type="{{ alert.type }}" close="closeAlert($index)"> <uib-alert ng-repeat="alert in alerts" type="{{ alert.type }}" close="closeAlert($index)">

View File

@ -1,13 +1,20 @@
<!-- projector live view -->
<h3 translate>Projector</h3> <div class="details">
<a ui-sref="projector" target="_blank">
<div ng-controller="ProjectorControlCtrl">
<!-- live view -->
<div class="section" os-perms-lite="core.can_see_projector">
<a href="#" ng-click="isLiveView = !isLiveView">
<i class="fa toggle-icon" ng-class="isLiveView ? 'fa-angle-up' : 'fa-angle-down'"></i>
<h4 translate>Live view</h4>
</a>
<div uib-collapse="!isLiveView">
<a ui-sref="projector" target="_blank">
<div id="iframewrapper"> <div id="iframewrapper">
<iframe id="iframe" src="/projector" frameborder="0"></iframe> <iframe id="iframe" src="/projector" frameborder="0"></iframe>
<div id="iframeoverlay"></div> <div id="iframeoverlay"></div>
</div> </div>
</a> </a>
<div ng-controller="ProjectorControlCtrl">
<!-- projector control buttons --> <!-- projector control buttons -->
<p os-perms="core.can_manage_projector"> <p os-perms="core.can_manage_projector">
<a ng-click="editCurrentSlide()" <a ng-click="editCurrentSlide()"
@ -45,10 +52,18 @@
</a> </a>
<span ng-class="{ 'notNull': scrollLevel != 0 }">{{ scrollLevel }}</span> <span ng-class="{ 'notNull': scrollLevel != 0 }">{{ scrollLevel }}</span>
</p> </p>
</div>
</div>
<!-- countdowns --> <!-- countdowns -->
<div os-perms-lite="core.can_manage_projector"> <div class="section" os-perms-lite="core.can_manage_projector">
<div ng-repeat="countdown in countdowns | orderBy: 'index'" id="{{countdown.uuid}}" class="countdown panel panel-default"> <a href="#" ng-click="isCountdowns = !isCountdowns">
<i class="fa toggle-icon" ng-class="isCountdowns ? 'fa-angle-up' : 'fa-angle-down'"></i>
<h4 translate>Countdowns</h4>
</a>
<div uib-collapse="!isCountdowns">
<div ng-repeat="countdown in countdowns | orderBy: 'index'" id="{{countdown.uuid}}"
class="countdown panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<span ng-if="countdown.description">{{ countdown.description }}</span> <span ng-if="countdown.description">{{ countdown.description }}</span>
<span ng-if="!countdown.description">Countdown {{ countdown.index +1 }}</span> <span ng-if="!countdown.description">Countdown {{ countdown.index +1 }}</span>
@ -129,10 +144,16 @@
<i class="fa fa-plus"></i> <translate>Add new countdown</translate> <i class="fa fa-plus"></i> <translate>Add new countdown</translate>
</a> </a>
</div> </div>
</div>
<!-- messages --> <!-- messages -->
<div os-perms-lite="core.can_manage_projector"> <div class="section" os-perms="core.can_manage_projector">
<h3 translate>Messages</h3> <a href="#" ng-click="isMessages = !isMessages">
<i class="fa toggle-icon" ng-class="isMessages ? 'fa-angle-up' : 'fa-angle-down'"></i>
<h4 translate>Messages</h4>
</a>
<div uib-collapse="!isMessages">
<div ng-repeat="message in messages | orderBy: 'index'" id="{{message.uuid}}" class="message panel panel-default"> <div ng-repeat="message in messages | orderBy: 'index'" id="{{message.uuid}}" class="message panel panel-default">
<div class="panel-body" <div class="panel-body"
ng-class="{ 'projected': message.visible }"> ng-class="{ 'projected': message.visible }">
@ -174,4 +195,7 @@
<i class="fa fa-plus"></i> <translate>Add new message</translate> <i class="fa fa-plus"></i> <translate>Add new message</translate>
</a> </a>
</div> </div>
</div>
</div><!-- end div ProjectorControlCtrl -->
</div> </div>

View File

@ -1,13 +1,17 @@
<h1 ng-if="tag.id" translate>Edit tag</h1> <div class="header">
<h1 ng-if="!tag.id" translate>New tag</h1> <div class="title">
<div class="submenu">
<div id="submenu">
<a ui-sref="core.tag.list" class="btn btn-sm btn-default"> <a ui-sref="core.tag.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1 ng-if="tag.id" translate>Edit tag</h1>
<h1 ng-if="!tag.id" translate>New tag</h1>
</div>
</div> </div>
<div class="details">
<form name="tagForm"> <form name="tagForm">
<div class="form-group"> <div class="form-group">
<label for="inputName" translate>Name</label> <label for="inputName" translate>Name</label>
@ -21,3 +25,4 @@
Cancel Cancel
</button> </button>
</form> </form>
</div>

View File

@ -1,21 +1,25 @@
<h1 translate>Tags</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="core.tag.create" os-perms="core.can_manage_tags" class="btn btn-primary btn-sm"> <a ui-sref="core.tag.create" os-perms="core.can_manage_tags" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i> <i class="fa fa-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
</a> </a>
</div>
<h1 translate>Tags</h1>
</div>
</div> </div>
<div class="row form-group"> <div class="details">
<div class="row form-group">
<div class="col-sm-8"></div> <div class="col-sm-8"></div>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" os-focus-me ng-model="filter.search" class="form-control" <input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate}}"> placeholder="{{ 'Filter' | translate}}">
</div> </div>
</div> </div>
<table class="table table-striped table-bordered table-hover"> <table os-perms="core.can_manage_tags" class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th ng-click="toggleSort('name')" class="sortable"> <th ng-click="toggleSort('name')" class="sortable">
@ -23,22 +27,17 @@
<i class="pull-right fa" ng-show="sortColumn === 'name' && header.sortable != false" <i class="pull-right fa" ng-show="sortColumn === 'name' && header.sortable != false"
ng-class="reverse ? 'fa-sort-desc' : 'fa-sort-asc'"> ng-class="reverse ? 'fa-sort-desc' : 'fa-sort-asc'">
</i> </i>
<th os-perms="core.can_manage_tags" class="minimum">
<translate>Actions</translate>
<tbody> <tbody>
<tr ng-repeat="tag in tags | filter: filter.search | <tr ng-repeat="tag in tags | filter: filter.search |
orderBy: sortColumn:reverse"> orderBy: sortColumn:reverse">
<td>{{ tag.name }} <td ng-mouseover="tag.hover=true" ng-mouseleave="tag.hover=false">
<td os-perms="core.can_manage_tags" class="nobr"> <strong>{{ tag.name }}</strong>
<!-- edit --> <div class="hoverActions" ng-class="{'hiddenDiv': !tag.hover}">
<a ui-sref="core.tag.detail.update({id: tag.id })" <a ui-sref="core.tag.detail.update({id: tag.id })" translate>Edit</a> |
class="btn btn-default btn-sm" <!-- TODO: translate confirm message -->
title="{{ 'Edit' | translate}}"> <a href="" class="text-danger"
<i class="fa fa-pencil"></i> ng-bootbox-confirm="Are you sure you want to delete <b>{{ tag.name }}</b>?"
</a> ng-bootbox-confirm-action="delete(tag)" translate>Delete</a>
<!-- delete --> </div>
<a ng-click="delete(tag)"class="btn btn-danger btn-sm" </table>
title="{{ 'Delete' | translate }}"> </div>
<i class="fa fa-trash-o"></i>
</a>
</table>

View File

@ -1,3 +1,9 @@
<h1>{{ config('projector_welcome_title') }}</h1> <div class="header">
<div class="title">
<h1>{{ config('projector_welcome_title') }}</h1>
</div>
</div>
{{ config('projector_welcome_text') }} <div class="details">
{{ config('projector_welcome_text') }}
</div>

View File

@ -5,29 +5,33 @@
<base href="/"> <base href="/">
<title>OpenSlides</title> <title>OpenSlides</title>
<meta name="description" content=""> <meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;">
<link rel="stylesheet" href="static/css/openslides-libs.css"> <link rel="stylesheet" href="static/css/openslides-libs.css">
<link rel="stylesheet" href="static/css/app.css"> <link rel="stylesheet" href="static/css/app.css">
<link rel="icon" href="/static/img/favicon.png">
<script src="static/js/openslides-libs.js"></script> <script src="static/js/openslides-libs.js"></script>
<script src="static/ckeditor/ckeditor.js"></script> <script src="static/ckeditor/ckeditor.js"></script>
<div id="wrapper">
<!-- Navbar --> <!-- Header -->
<nav id="header" class="navbar navbar-inverse"> <div id="header">
<div class="container-fluid"> <div class="containerOS">
<div class="navbar-header"> <!-- Logo -->
<a ui-sref="dashboard" class="navbar-brand"> <div class="title">
<img id="logo" src="/static/img/logo.png" alt="OpenSlides" /> <a ui-sref="dashboard">
<img src="/static/img/openslides-logo-dark.png" alt="Logo" height="35">
</a> </a>
<span class="navbar-text optional">{{ config('general_event_name') }}</span> <!-- TODO: <span class="navbar-text optional">{{ config('general_event_name') }}</span>-->
</div> </div>
<div class="navbar-right" ng-controller="userMenu">
<!-- user specific header (chat, user settings / login, language)-->
<div class="user" ng-controller="userMenu">
<div class="btn-group"> <div class="btn-group">
<!-- Logout / user setttings button -->
<div ng-if="operator.isAuthenticated()"> <div ng-if="operator.isAuthenticated()">
<!-- chatbox --> <!-- chatbox -->
<div ng-controller="ChatMessageCtrl" os-perms="core.can_use_chat" class="inline"> <div ng-controller="ChatMessageCtrl" os-perms="core.can_use_chat" class="inline">
<button ng-click="openChatbox()" class="btn btn-default"> <button ng-click="openChatbox()" class="btn btn-sm btn-default">
<i class="fa fa-comment"></i> <i class="fa fa-comment"></i>
<translate>Chat</translate> <translate>Chat</translate>
<span ng-if="unreadMessages > 0 && chatboxIsCollapsed" class="badge"> <span ng-if="unreadMessages > 0 && chatboxIsCollapsed" class="badge">
@ -60,7 +64,7 @@
<!-- user settings / logout button --> <!-- user settings / logout button -->
<div class="btn-group" uib-dropdown> <div class="btn-group" uib-dropdown>
<button type="button" class="btn btn-default" uib-dropdown-toggle> <button type="button" class="btn btn-sm btn-default" uib-dropdown-toggle>
<i class="fa fa-user"></i> <i class="fa fa-user"></i>
<span class="optional-small">{{ operator.user.get_short_name() }}</span> <span class="optional-small">{{ operator.user.get_short_name() }}</span>
<span class="caret"></span> <span class="caret"></span>
@ -87,7 +91,7 @@
</div> </div>
<!-- Login button --> <!-- Login button -->
<div ng-if="!operator.isAuthenticated()"> <div ng-if="!operator.isAuthenticated()">
<button class="btn btn-default" ng-click="openLoginForm()"> <button class="btn btn-sm btn-default" ng-click="openLoginForm()">
<i class="fa fa-sign-in"></i> <i class="fa fa-sign-in"></i>
<translate>Login</translate> <translate>Login</translate>
</button> </button>
@ -96,11 +100,11 @@
<!-- language switcher --> <!-- language switcher -->
<div class="btn-group" ng-controller="LanguageCtrl" uib-dropdown> <div class="btn-group" ng-controller="LanguageCtrl" uib-dropdown>
<button class="btn btn-default" uib-dropdown-toggle> <button class="btn btn-sm btn-default" uib-dropdown-toggle>
<i class="fa fa-flag"></i> <i class="fa fa-flag"></i>
<span class="caret"></span> <span class="caret"></span>
</button> </button>
<ul class="uib-dropdown-menu uib-dropdown-menu-right" role="menu" aria-labelledby="single-button"> <ul class="uib-dropdown-menu pull-right" role="menu" aria-labelledby="single-button">
<li> <li>
<a href="" ng-click="switchLanguage('en')"> <a href="" ng-click="switchLanguage('en')">
<i class="fa fa-flag"></i> <i class="fa fa-flag"></i>
@ -118,45 +122,70 @@
</a> </a>
</ul> </ul>
</div> </div>
</div>
</div>
</nav>
<!-- Container --> </div>
<div id="container" class="container-fluid"> </div>
<div class="row"> </div><!--end header-->
<!-- Navbar -->
<div id="nav">
<div class="containerOS">
<div class="navbar">
<div class="button"><a href="#"><i class="fa fa-bars"></i></a></div>
<!-- Main menu --> <!-- Main menu -->
<div id="main-menu" class="col-md-2 leftmenu lefticon">
<ul ng-controller="MainMenuCtrl"> <ul ng-controller="MainMenuCtrl">
<li ng-repeat="element in elements"> <li ng-repeat="element in elements" ui-sref-active="active">
<a ui-sref="{{ element.ui_sref }}"> <a ui-sref="{{ element.ui_sref }}">
<span class="ico"><i class="fa fa-{{ element.img_class }} fa-lg"></i></span> <i class="fa fa-{{ element.img_class }}"></i>
<span class="text" translate>{{ element.title }}</span> <translate>{{ element.title }}</translate>
</a> </a>
</ul> </ul>
</div><!--/#main-menu-->
<!-- Content -->
<div id="content" class="col-md-7">
<div class="row">
<div class="col-md-12">
<div ui-view></div>
</div> </div>
</div> </div>
</div><!--/#content--> </div><!--end nav-->
<div class="col-sm-3" os-perms="core.can_see_projector">
<div class="well">
<div ng-include src="'static/templates/core/projector-controls.html'"></div>
</div>
</div>
</div><!--/.row-->
<hr>
<footer> <!-- Content -->
<small> <div id="content" ng-controller="ProjectorSidebarCtrl">
<div class="containerOS">
<div class="col1" ng-class="isProjectorSidebar ? 'min' : 'max'">
<!-- dynamic views -->
<div ui-view></div>
<!-- footer -->
<div id="footer">
&copy; Copyright by <a href="http://www.openslides.org" target="_blank">OpenSlides</a> | &copy; Copyright by <a href="http://www.openslides.org" target="_blank">OpenSlides</a> |
<a ui-sref="version">Version</a> <a ui-sref="version">Version</a>
</small> </div><!--end footer-->
</footer> </div>
</div><!--/#container--> <div class="col2" os-perms="core.can_see_projector"
ng-class="isProjectorSidebar ? 'max' : 'min'">
<!-- sidebar maximized -->
<div class="projector_full" ng-if="isProjectorSidebar">
<div class="title" ng-click="showProjectorSidebar(false)">
<div class="name">
<i class="fa fa-caret-square-o-right"></i>
<translate>Projector</translate>
</div>
<div class="icon">
<i class="fa fa-video-camera"></i>
</div>
</div>
<div ng-include src="'static/templates/core/projector-controls.html'"></div>
</div>
<!-- sidebar minimized -->
<div class="projector_min" ng-if="!isProjectorSidebar">
<div class="icon">
<a href="" ng-click="showProjectorSidebar(true)">
<i class="fa fa-video-camera"></i>
</a>
</div>
</div>
</div><!--end col2-->
</div><!--end content-container-->
</div><!--end content-->
</div><!--end wrapper-->
<script src="/angular_js/site/"></script> <script src="/angular_js/site/"></script>

View File

@ -31,7 +31,7 @@
<div id="header"> <div id="header">
<img id="logo" src="/static/img/logo.png" alt="OpenSlides" /> <img id="logo" src="/static/img/logo-projector.png" alt="OpenSlides" />
<div id="eventdata"> <div id="eventdata">
<div class="title"> <div class="title">
{{ config('general_event_name') }} {{ config('general_event_name') }}

View File

@ -1,12 +1,17 @@
<h1 translate>Version</h1> <div class="header">
<div class="title">
<h1 translate>Version</h1>
</div>
</div>
<p>OpenSlides Version {{ core_version }} <div class="details">
<p class="lead">OpenSlides {{ core_version }}
<div ng-show="plugins.length"> <div ng-show="plugins.length">
<p translate>Installed plugins:</p> <p translate>Installed plugins:</p>
<ol> <ol>
<li ng-repeat="plugin in plugins"> <li ng-repeat="plugin in plugins">
{{ plugin.verbose_name }}: {{ plugin.version }} {{ plugin.verbose_name }}: {{ plugin.version }}
</ol> </ol>
</div>
</div> </div>

View File

@ -1,14 +1,18 @@
<h1 ng-if="mediafile.id" translate>Edit file</h1> <div class="header">
<h1 ng-if="!mediafile.id" translate>New file</h1> <div class="title">
<div class="submenu">
<div id="submenu">
<a ui-sref="mediafiles.mediafile.list" class="btn btn-sm btn-default"> <a ui-sref="mediafiles.mediafile.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1 ng-if="mediafile.id" translate>Edit file</h1>
<h1 ng-if="!mediafile.id" translate>New file</h1>
</div>
</div> </div>
<form name="mediafileForm"> <div class="details">
<form name="mediafileForm">
<div class="form-group"> <div class="form-group">
<div ng-if="mediafile.id"> <div ng-if="mediafile.id">
@ -35,4 +39,5 @@
<button ui-sref="mediafiles.mediafile.list" class="btn btn-default" translate> <button ui-sref="mediafiles.mediafile.list" class="btn btn-default" translate>
Cancel Cancel
</button> </button>
</form> </form>
</div>

View File

@ -1,21 +1,24 @@
<h1 translate>Files</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="mediafiles.mediafile.create" os-perms="mediafiles.can_upload" class="btn btn-primary btn-sm"> <a ui-sref="mediafiles.mediafile.create" os-perms="mediafiles.can_upload" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i> <i class="fa fa-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
</a> </a>
</div>
<h1 translate>Files</h1>
</div>
</div> </div>
<div class="row form-group"> <div class="details">
<div class="row form-group">
<div class="col-sm-8"></div> <div class="col-sm-8"></div>
<div class="col-sm-4"> <div class="col-sm-4">
<input type="text" os-focus-me ng-model="filter.search" class="form-control" <input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate }}"> placeholder="{{ 'Filter' | translate }}">
</div> </div>
</div> </div>
<table class="table table-striped table-bordered table-hover">
<table class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th ng-click="toggleSort('title_or_filename')" class="sortable"> <th ng-click="toggleSort('title_or_filename')" class="sortable">
@ -43,7 +46,7 @@
<i class="pull-right fa" ng-show="sortColumn === 'uploader' && header.sortable != false" <i class="pull-right fa" ng-show="sortColumn === 'uploader' && header.sortable != false"
ng-class="reverse ? 'fa-sort-desc' : 'fa-sort-asc'"> ng-class="reverse ? 'fa-sort-desc' : 'fa-sort-asc'">
</i> </i>
<th os-perms="mediafiles.can_manage core.can_manage_projector" class="minimum"> <th os-perms="mediafiles.can_manage core.can_manage_projector">
<translate>Actions</translate> <translate>Actions</translate>
</th> </th>
</tr> </tr>
@ -75,4 +78,5 @@
</a> </a>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>

View File

@ -1,12 +1,16 @@
<h1>{{ category.name }}</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="motions.category.list" class="btn btn-sm btn-default"> <a ui-sref="motions.category.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1>{{ category.name }}</h1>
</div>
</div> </div>
<div class="details">
<b translate>Prefix:</b> <strong translate>Prefix:</strong>
{{ category.prefix }} {{ category.prefix }}
</div>

View File

@ -1,14 +1,18 @@
<h1 ng-if="category.id" translate>Edit category</h1> <div class="header">
<h1 ng-if="!category.id" translate>New category</h1> <div class="title">
<div class="submenu">
<div id="submenu">
<a ui-sref="motions.category.list" class="btn btn-sm btn-default"> <a ui-sref="motions.category.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1 ng-if="category.id" translate>Edit category</h1>
<h1 ng-if="!category.id" translate>New category</h1>
</div>
</div> </div>
<form name="groupForm"> <div class="details">
<form name="groupForm">
<div class="form-group"> <div class="form-group">
<label for="inputPrefix" translate>Prefix</label> <label for="inputPrefix" translate>Prefix</label>
<input type="text" ng-model="category.prefix" class="form-control" name="inputPrefix"> <input type="text" ng-model="category.prefix" class="form-control" name="inputPrefix">
@ -24,4 +28,5 @@
<button ui-sref="motions.category.list" class="btn btn-default" translate> <button ui-sref="motions.category.list" class="btn btn-default" translate>
Cancel Cancel
</button> </button>
</form> </form>
</div>

View File

@ -1,6 +1,6 @@
<h1 translate>Categories</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="motions.category.create" os-perms="motions.can_manage" class="btn btn-primary btn-sm"> <a ui-sref="motions.category.create" os-perms="motions.can_manage" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i> <i class="fa fa-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
@ -9,16 +9,20 @@
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div> </div>
<h1 translate>Categories</h1>
<div class="row form-group">
<div class="col-sm-4 right">
<input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate }}">
</div> </div>
</div> </div>
<table class="table table-striped table-bordered table-hover"> <div class="details">
<div class="row form-group">
<div class="col-sm-4 pull-right">
<input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate }}">
</div>
</div>
<table class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th ng-click="sortby='prefix';reverse=!reverse"> <th ng-click="sortby='prefix';reverse=!reverse">
@ -53,4 +57,5 @@
title="{{ 'Delete' | translate }}"> title="{{ 'Delete' | translate }}">
<i class="fa fa-trash-o"></i> <i class="fa fa-trash-o"></i>
</a> </a>
</table> </table>
</div>

View File

@ -1,14 +1,7 @@
<h1> <div class="header">
{{ motion.getTitle() }} <div class="title">
<small> <!-- TODO: show list of speakers controls for { motion.agenda_item } -->
<translate>Motion</translate> {{ motion.identifier }} <div class="submenu">
<span ng-if="motion.versions.length > 1" >| Version {{ motion.active_version }}</span>
</small>
</h1>
<!-- TODO: show list of speakers controls for { motion.agenda_item } -->
<div id="submenu">
<a ui-sref="motions.motion.list" class="btn btn-sm btn-default"> <a ui-sref="motions.motion.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
@ -30,46 +23,25 @@
<i class="fa fa-video-camera"></i> <i class="fa fa-video-camera"></i>
</a> </a>
<!-- edit --> <!-- edit -->
<a ng-if="motion.isAllowed('update')" ng-click="editDialog(motion)" <a ng-if="motion.isAllowed('update')" ui-sref="motions.motion.detail.update({id: motion.id })"
class="btn btn-default btn-sm" class="btn btn-default btn-sm"
title="{{ 'Edit' | translate}}"> title="{{ 'Edit' | translate}}">
<i class="fa fa-pencil"></i> <i class="fa fa-pencil"></i>
</a> </a>
</div>
<h1>{{ motion.getTitle() }}</h1>
<h2>
<translate>Motion</translate> {{ motion.identifier }}
<span ng-if="motion.versions.length > 1" >| Version {{ motion.active_version }}</span>
</h2>
</div>
</div> </div>
<div class="row"> <div class="meta">
<div class="col-sm-8"> <i class="fa toggle-icon pointer" ng-click="isMeta = !isMeta"
<h3 translate>Text</h3> ng-class="isMeta ? 'fa-angle-down' : 'fa-angle-up'"></i>
<div class="white-space-pre-line" ng-bind-html="motion.getText()"></div> <div class="row" uib-collapse="isMeta">
<!-- reason -->
<div ng-if="motion.getReason() != ''">
<h3 translate>Reason</h3>
<div class="white-space-pre-line" ng-bind-html="motion.getReason()"></div>
</div>
<!-- attachments
TODO: make 'motion.attachments' useable and itteratable in template
<div ng-if="motion.attachments">
<h3 translate>Attachments</h3>
</div>
-->
<!-- log -->
<button type="button" class="btn btn-default spacer" ng-click="isCollapsed = !isCollapsed" translate>
Show log
</button>
<div uib-collapse="isCollapsed">
<div class="well well-sm">
<ul class="list-unstyled">
<li ng-repeat="message in motion.log_messages">
<small>{{ message.message }}</small>
</div>
</div>
</div>
<div class="col-sm-4"> <div class="col-sm-4">
<div class="well">
<!-- submitters --> <!-- submitters -->
<h3 translate>Submitters</h3> <h3 translate>Submitters</h3>
<div ng-repeat="submitter in motion.submitters"> <div ng-repeat="submitter in motion.submitters">
@ -94,7 +66,19 @@
<translate>Unsupport motion</translate> <translate>Unsupport motion</translate>
</button> </button>
</div> </div>
</div>
<div class="col-sm-4">
<!-- Category -->
<h3 translate>Category</h3>
{{ motion.category.name }}</a>
<!-- Tags -->
<h3 translate>Tags</h3>
<span ng-repeat="tag in motion.tags">
{{ tag.name }}{{$last ? '' : ', '}}
</span>
<!-- State -->
<h3 translate>State</h3> <h3 translate>State</h3>
<span class="label" ng-class="'label-'+motion.state.css_class"> <span class="label" ng-class="'label-'+motion.state.css_class">
{{ motion.state.name | translate }} {{ motion.state.name | translate }}
@ -112,7 +96,8 @@
</button> </button>
</div> </div>
</div> </div>
</div>
<div class="col-sm-3">
<h3 translate>Voting result</h3> <h3 translate>Voting result</h3>
<ol class="slimlist"> <ol class="slimlist">
<li ng-repeat="poll in motion.polls" class="spacer"> <li ng-repeat="poll in motion.polls" class="spacer">
@ -236,16 +221,42 @@
<i class="fa fa-bar-chart fa-lg"></i> <i class="fa fa-bar-chart fa-lg"></i>
<translate>New poll</translate> <translate>New poll</translate>
</button> </button>
<h3 translate>Category</h3>
{{ motion.category.name }}</a>
<h3 translate>Tags</h3>
<p ng-repeat="tag in motion.tags">
<span class="label label-default spacer-top">
{{ tag.name }}
</span>
</p>
</div> </div>
<div class="col-sm-1"></div>
</div>
</div>
<div class="details">
<div class="row">
<div class="col-sm-8">
<h3 translate>Text</h3>
<div class="white-space-pre-line" ng-bind-html="motion.getText()"></div>
<!-- reason -->
<div ng-if="motion.getReason() != ''">
<h3 translate>Reason</h3>
<div class="white-space-pre-line" ng-bind-html="motion.getReason()"></div>
</div>
<!-- attachments
TODO: make 'motion.attachments' useable and itteratable in template
<div ng-if="motion.attachments">
<h3 translate>Attachments</h3>
</div>
-->
<!-- log -->
<button type="button" class="btn btn-default spacer" ng-click="isCollapsed = !isCollapsed" translate>
Show log
</button>
<div uib-collapse="isCollapsed">
<div class="well well-sm">
<ul class="list-unstyled">
<li ng-repeat="message in motion.log_messages">
<small>{{ message.message }}</small>
</div>
</div>
</div>
</div> </div>
</div> </div>

View File

@ -1,6 +1,6 @@
<h1 translate>Motions</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ng-click="newDialog()" os-perms="motions.can_create" class="btn btn-primary btn-sm"> <a ng-click="newDialog()" os-perms="motions.can_create" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i> <i class="fa fa-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
@ -17,44 +17,64 @@
<i class="fa fa-file-pdf-o fa-lg"></i> <i class="fa fa-file-pdf-o fa-lg"></i>
<translate>PDF</translate> <translate>PDF</translate>
</a> </a>
</div>
<h1 translate>Motions</h1>
</div>
</div> </div>
<div class="row form-group"> <div class="details">
<div class="col-sm-8"> <div class="row">
<form class="form-inline"> <div class="col-sm-6">
<!-- delete mode --> <!-- delete mode -->
<div os-perms-lite="motions.can_manage" class="form-group"> <button os-perms-lite="motions.can_manage" class="btn btn-default"
<label for="deleteSwitcher" translate>Delete mode</label> ng-click="isDeleteMode = !isDeleteMode; uncheckAll()">
<switch id="deleteSwitcher" ng-model="isDeleteMode" ng-change="uncheckAll()" <i class="fa fa-check-square-o"></i>
on="{{'On'|translate}}" off="{{'Off'|translate}}" <translate>Select</translate>...
class="green wide form-control"> </button>
</switch>
</div> </div>
<!-- delete button --> <div class="col-sm-6">
<a ng-show="isDeleteMode && (motions|filter:{selected:true}).length > 0" <div class="form-inline text-right">
os-perms="motions.can_manage" ng-click="deleteMultiple()" <div class="form-group">
class="btn btn-primary btn-sm form-control"> <div class="input-group">
<i class="fa fa-trash fa-lg"></i> <div class="input-group-addon"><i class="fa fa-search"></i></div>
<translate>Delete selected motions</translate> <input type="text" os-focus-me ng-model="filter.search" class="form-control"
</a> placeholder="{{ 'Search' | translate}}">
</div>
</div>
<button class="btn btn-default" ng-click="isFilter = !isFilter">
<i class="fa fa-filter"></i>
<translate>Filter</translate>...
</button>
</div>
</div>
</div>
<div uib-collapse="!isFilter" class="row">
<div class="col-sm-6 text-right"></div>
<div class="col-sm-6 text-right">
<!-- state filter --> <!-- state filter -->
&nbsp;
<select ng-model="stateFilter" class="form-control" id="stateFilter"> <select ng-model="stateFilter" class="form-control" id="stateFilter">
<option value="" translate>--- Select state ---</option> <option value="" translate>--- Select state ---</option>
<option ng-repeat="state in states" value="{{ state.id }}">{{ state.name }}</option> <option ng-repeat="state in states" value="{{ state.id }}">{{ state.name }}</option>
</select> </select>
</form>
</div>
<div class="col-sm-4">
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-filter"></i></div>
<input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate}}">
</div> </div>
</div> </div>
</div> <div uib-collapse="!isDeleteMode" class="row spacer">
<div class="col-sm-12 text-left">
<!-- delete button -->
<a ng-show="isDeleteMode"
os-perms="motions.can_manage" ng-click="delete()"
class="btn btn-primary">
<i class="fa fa-trash fa-lg"></i>
<translate>Delete selected items</translate>
</a>
</div>
</div>
<table class="table table-striped table-bordered table-hover"> <i class="spacer">
{{ motions.length }} {{ "motion" | translate }}<span ng-if="(motions|filter:{selected:true}).length > 0">,
{{(motions|filter:{selected:true}).length}} {{ "selected" | translate }}</span>
</i>
<table class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<!-- projector column --> <!-- projector column -->
@ -199,4 +219,5 @@
<a ng-if="motion.isAllowed('update')" ui-sref="motions.motion.detail.update({id: motion.id })" <a ng-if="motion.isAllowed('update')" ui-sref="motions.motion.detail.update({id: motion.id })"
class="pull-right" translate>Edit motion...</a> class="pull-right" translate>Edit motion...</a>
</div> </div>
</table> </table>
</div>

View File

@ -718,7 +718,7 @@ angular.module('OpenSlidesApp.users.site', ['OpenSlidesApp.users'])
$scope.alerts.push({ $scope.alerts.push({
type: 'success', type: 'success',
msg: gettext("Installation was successfully.") + "<br>" + msg: gettext("Installation was successfully.") + "<br>" +
gettext("Use <strong>admin</strong> and <strong>admin</strong> for first login.") + "<p>" + gettext("Use <strong>admin</strong> and <strong>admin</strong> for first login.") + "<br>" +
gettext("Important: Please change your password!") gettext("Important: Please change your password!")
}); });
// close alert function // close alert function

View File

@ -1,14 +1,19 @@
<h1>{{ group.name }}</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="users.group.list" class="btn btn-sm btn-default"> <a ui-sref="users.group.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1>{{ group.name }}</h1>
<h2 translate>Group</h2>
</div>
</div> </div>
<div class="details">
<b translate>Permissions:</b> <p class="lead" translate>Permissions:</p>
<ul ng-repeat="perm in group.permissions"> <ul ng-repeat="perm in group.permissions">
<li>{{ perm }} <li>{{ perm }}
</ul> </ul>
</div>

View File

@ -1,14 +1,18 @@
<h1 ng-if="group.id" translate>Edit group</h1> <div class="header">
<h1 ng-if="!group.id" translate>New group</h1> <div class="title">
<div class="submenu">
<div id="submenu">
<a ui-sref="users.group.list" class="btn btn-sm btn-default"> <a ui-sref="users.group.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div>
<h1 ng-if="group.id" translate>Edit group</h1>
<h1 ng-if="!group.id" translate>New group</h1>
</div>
</div> </div>
<form name="groupForm"> <div class="details">
<form name="groupForm">
<div class="form-group"> <div class="form-group">
<label for="inputName" translate>Name</label> <label for="inputName" translate>Name</label>
<input type="text" ng-model="group.name" class="form-control" name="inputName" required> <input type="text" ng-model="group.name" class="form-control" name="inputName" required>
@ -26,4 +30,5 @@
<button ui-sref="users.group.list" class="btn btn-default" translate> <button ui-sref="users.group.list" class="btn btn-default" translate>
Cancel Cancel
</button> </button>
</form> </form>
</div>

View File

@ -1,6 +1,6 @@
<h1 translate>Groups</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="users.group.create" os-perms="users.can_manage" class="btn btn-primary btn-sm"> <a ui-sref="users.group.create" os-perms="users.can_manage" class="btn btn-primary btn-sm">
<i class="fa fa-plus fa-lg"></i> <i class="fa fa-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
@ -9,16 +9,25 @@
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div> </div>
<h1 translate>Groups</h1>
<div class="row form-group">
<div class="col-sm-4 right">
<input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate }}">
</div> </div>
</div> </div>
<table class="table table-striped table-bordered table-hover"> <div class="details">
<div class="row form-group">
<div class="col-sm-4 pull-right">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-search"></i></div>
<input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Search' | translate}}">
</div>
</div>
</div>
</div>
<table class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th ng-click="sortby='id';reverse=!reverse"> <th ng-click="sortby='id';reverse=!reverse">
@ -48,4 +57,5 @@
title="{{ 'Delete' | translate }}"> title="{{ 'Delete' | translate }}">
<i class="fa fa-trash-o"></i> <i class="fa fa-trash-o"></i>
</a> </a>
</table> </table>
</div>

View File

@ -1,9 +1,14 @@
<h1>Change password</h1> <div class="header">
<div class="title">
<h1>Change password</h1>
</div>
</div>
<p ng-if='formError' class="text-danger"> <div class="details">
<p ng-if='formError' class="text-danger">
<strong>{{ formError }}</strong> <strong>{{ formError }}</strong>
</p> </p>
<form name="userForm" > <form name="userForm" >
<div class="form-group"> <div class="form-group">
<label for="inputOldPassword" translate>Old password</label> <label for="inputOldPassword" translate>Old password</label>
<input type="password" <input type="password"
@ -34,4 +39,5 @@
<button ui-sref="users.user.list" class="btn btn-default" translate> <button ui-sref="users.user.list" class="btn btn-default" translate>
Cancel Cancel
</button> </button>
</form> </form>
</div>

View File

@ -1,9 +1,14 @@
<h1>Edit profil</h1> <div class="header">
<div class="title">
<h1 translate>Edit profil</h1>
</div>
</div>
<p ng-if='formError' class="text-danger"> <div class="details">
<p ng-if='formError' class="text-danger">
<strong>{{ formError }}</strong> <strong>{{ formError }}</strong>
</p> </p>
<form name="userForm" > <form name="userForm" >
<div class="form-group"> <div class="form-group">
<label for="inputUsername" translate>Username</label> <label for="inputUsername" translate>Username</label>
<input type="text" <input type="text"
@ -41,4 +46,5 @@
<button ui-sref="users.user.list" class="btn btn-default" translate> <button ui-sref="users.user.list" class="btn btn-default" translate>
Cancel Cancel
</button> </button>
</form> </form>
</div>

View File

@ -1,6 +1,6 @@
<h1>{{ user.get_short_name() }}</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="users.user.list" class="btn btn-sm btn-default"> <a ui-sref="users.user.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
@ -18,9 +18,14 @@
title="{{ 'Edit' | translate}}"> title="{{ 'Edit' | translate}}">
<i class="fa fa-pencil"></i> <i class="fa fa-pencil"></i>
</a> </a>
</div>
<h1>{{ user.get_short_name() }}</h1>
<h2 translate>Participant</h2>
</div>
</div> </div>
<div class="user_details form-group"> <div class="details">
<div class="user_details form-group">
<fieldset> <fieldset>
<legend translate>Personal data</legend> <legend translate>Personal data</legend>
<label translate>Structure level</label> <label translate>Structure level</label>
@ -40,4 +45,5 @@
<label translate>Comment</label> <label translate>Comment</label>
<div class="white-space-pre-line">{{ user.comment }}</div> <div class="white-space-pre-line">{{ user.comment }}</div>
</fieldset> </fieldset>
</div>
</div> </div>

View File

@ -1,38 +1,42 @@
<h1 translate>Import participants</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ui-sref="users.user.list" class="btn btn-sm btn-default"> <a ui-sref="users.user.list" class="btn btn-sm btn-default">
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to overview</translate> <translate>Back to overview</translate>
</a> </a>
</div> </div>
<h1 translate>Import participants</h1>
<h2 translate>Import by copy/paste</h2>
<p translate>Copy and paste your participant names in this textbox.
Keep each person in a single line.</p>
<div class="row">
<div class="form-group col-sm-6">
<textarea ng-model="userlist" rows="5" class="form-control" ng-list="/\n/"></textarea>
</div> </div>
</div> </div>
<div class="clearfix"> <div class="details">
<h3 translate>Import by copy/paste</h3>
<p translate>Copy and paste your participant names in this textbox.
Keep each person in a single line.</p>
<div class="row">
<div class="form-group col-sm-6">
<textarea ng-model="userlist" rows="5" class="form-control" ng-list="/\n/"></textarea>
</div>
</div>
<div class="clearfix">
<button ng-click="importByLine()" class="btn btn-primary pull-left" translate>Import</button> <button ng-click="importByLine()" class="btn btn-primary pull-left" translate>Import</button>
<div class="col-xs-5" ng-if="users"> <div class="col-xs-5" ng-if="users">
<progressbar animate="false" type="success" max="users.length" value="importcounter"> <progressbar animate="false" type="success" max="users.length" value="importcounter">
<i>{{ importcounter }} / {{ users.length }} {{ "imported" | translate }}</i> <i>{{ importcounter }} / {{ users.length }} {{ "imported" | translate }}</i>
</progressbar> </progressbar>
</div> </div>
</div> </div>
<hr> <hr>
<h2 translate>Import by CSV file</h2> <h3 translate>Import by CSV file</h3>
<p translate>Select a CSV file to import users! <p translate>Select a CSV file to import users!
<p translate>Please note:</p> <p translate>Please note:</p>
<ul> <ul>
<li><translate>Required comma separated values</translate>:<br> <li><translate>Required comma separated values</translate>:<br>
<code translate>'title, first_name, last_name, structure level, groups, comment, is active'</code> <code translate>'title, first_name, last_name, structure level, groups, comment, is active'</code>
<li><translate>Default groups</translate>: <li><translate>Default groups</translate>:
@ -45,16 +49,16 @@ Keep each person in a single line.</p>
<li><a href="https://github.com/OpenSlides/OpenSlides/wiki/CSV-Import" translate> <li><a href="https://github.com/OpenSlides/OpenSlides/wiki/CSV-Import" translate>
Use the CSV example file from OpenSlides Wiki. Use the CSV example file from OpenSlides Wiki.
</a> </a>
</ul> </ul>
<ng-csv-import <ng-csv-import
content="csv.content" content="csv.content"
class="import" class="import"
header="csv.header" header="csv.header"
separator="csv.separator" separator="csv.separator"
result="csv.result"></ng-csv-import> result="csv.result"></ng-csv-import>
<div ng-if="csv.result" class="col-sm-10 well"> <div ng-if="csv.result" class="col-sm-10 well">
<h3 translate>Preview</h3> <h3 translate>Preview</h3>
<table class="table table-striped table-bordered table-condensed"> <table class="table table-striped table-bordered table-condensed">
<thead> <thead>
@ -77,7 +81,7 @@ Keep each person in a single line.</p>
<td>{{ user.comment }} <td>{{ user.comment }}
</table> </table>
<div class="clearfix"> <div class="clearfix">
<button ng-if="!csvimporting" ng-click="importByCSV(csv.result)" class="btn btn-primary pull-left" translate>Import</button> <button ng-if="!csvimporting" ng-click="importByCSV(csv.result)" class="btn btn-primary pull-left" translate>Import</button>
<div ng-if="csvimporting"> <div ng-if="csvimporting">
<progressbar animate="false" type="success" max="csvlines" value="csvimportcounter"> <progressbar animate="false" type="success" max="csvlines" value="csvimportcounter">
@ -88,11 +92,12 @@ Keep each person in a single line.</p>
<i class="fa fa-angle-double-left fa-lg"></i> <i class="fa fa-angle-double-left fa-lg"></i>
<translate>Back to users overview</translate> <translate>Back to users overview</translate>
</a> </a>
</div> </div>
<p> <p>
<div class="form-group"> <div class="form-group">
<button ng-if="!csvimporting" ng-click="clear()" class="btn btn-default" translate> <button ng-if="!csvimporting" ng-click="clear()" class="btn btn-default" translate>
Clear Clear
</button> </button>
</div> </div>
</div>
</div> </div>

View File

@ -1,6 +1,6 @@
<h1 translate>Participants</h1> <div class="header">
<div class="title">
<div id="submenu"> <div class="submenu">
<a ng-click="newDialog()" os-perms="users.can_manage" class="btn btn-primary btn-sm"> <a ng-click="newDialog()" os-perms="users.can_manage" class="btn btn-primary btn-sm">
<i class="fa fa-user-plus fa-lg"></i> <i class="fa fa-user-plus fa-lg"></i>
<translate>New</translate> <translate>New</translate>
@ -31,41 +31,62 @@
</a> </a>
</ul> </ul>
</div> </div>
</div>
<h1 translate>Participants</h1>
</div>
</div> </div>
<div class="row form-group"> <div class="details">
<div class="col-sm-8"> <div class="row">
<form class="form-inline"> <div class="col-sm-6">
<!-- delete mode --> <!-- delete mode -->
<div os-perms-lite="users.can_manage" class="form-group"> <button os-perms-lite="users.can_manage" class="btn btn-default"
<label for="deleteSwitcher" translate>Delete mode</label> ng-click="isDeleteMode = !isDeleteMode; uncheckAll()">
<switch id="deleteSwitcher" ng-model="isDeleteMode" ng-change="uncheckAll()" <i class="fa fa-check-square-o"></i>
on="{{'On'|translate}}" off="{{'Off'|translate}}" <translate>Select</translate>...
class="green wide form-control"> </button>
</switch>
</div> </div>
<!-- delete button --> <div class="col-sm-6">
<a ng-show="isDeleteMode && (users|filter:{selected:true}).length > 0" <div class="form-inline text-right">
os-perms="users.can_manage" ng-click="deleteMultiple()" <div class="form-group">
class="btn btn-primary btn-sm form-control"> <div class="input-group">
<i class="fa fa-trash fa-lg"></i> <div class="input-group-addon"><i class="fa fa-search"></i></div>
<translate>Delete selected users</translate> <input type="text" os-focus-me ng-model="filter.search" class="form-control"
</a> placeholder="{{ 'Search' | translate}}">
</div>
</div>
<button class="btn btn-default" ng-click="isFilter = !isFilter">
<i class="fa fa-filter"></i>
<translate>Filter</translate>...
</button>
</div>
</div>
</div>
<div uib-collapse="!isFilter" class="row">
<div class="col-sm-6 text-right"></div>
<div class="col-sm-6 text-right">
<!-- isPresent filter --> <!-- isPresent filter -->
<input type="checkbox" ng-model="filterPresent" ng-false-value="''"> <input type="checkbox" ng-model="filterPresent" ng-false-value="''">
<translate>Is present</translate> <translate>Is present</translate>
</form>
</div>
<div class="col-sm-4">
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-filter"></i></div>
<input type="text" os-focus-me ng-model="filter.search" class="form-control"
placeholder="{{ 'Filter' | translate}}">
</div> </div>
</div> </div>
</div> <div uib-collapse="!isDeleteMode" class="row spacer">
<div class="col-sm-12 text-left">
<!-- delete button -->
<a ng-show="isDeleteMode"
os-perms="users.can_manage" ng-click="delete()"
class="btn btn-primary">
<i class="fa fa-trash fa-lg"></i>
<translate>Delete selected items</translate>
</a>
</div>
</div>
<table class="table table-striped table-bordered table-hover"> <i class="spacer">
{{ users.length }} {{ "participants" | translate }}<span ng-if="(users|filter:{selected:true}).length > 0">,
{{(users|filter:{selected:true}).length}} {{ "selected" | translate }}</span>
</i>
<table class="table table-striped table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<!-- projector column --> <!-- projector column -->
@ -97,7 +118,7 @@
<tbody> <tbody>
<tr ng-repeat="user in users | filter: filter.search | filter: {is_present: filterPresent} | <tr ng-repeat="user in users | filter: filter.search | filter: {is_present: filterPresent} |
orderBy: sortColumn:reverse" orderBy: sortColumn:reverse"
ng-class="{ 'activeline': user.isProjected(), 'selected': assignment.selected }"> ng-class="{ 'activeline': user.isProjected(), 'selected': user.selected }">
<!-- projector column --> <!-- projector column -->
<td ng-show="!isDeleteMode" os-perms="core.can_manage_projector"> <td ng-show="!isDeleteMode" os-perms="core.can_manage_projector">
<a class="btn btn-default btn-sm" <a class="btn btn-default btn-sm"
@ -128,4 +149,5 @@
{{ (groups | filter: {id: group})[0].name }} {{ (groups | filter: {id: group})[0].name }}
</div> </div>
<td><input type="checkbox" ng-model="user.is_present" ng-click="save(user)"> <td><input type="checkbox" ng-model="user.is_present" ng-click="save(user)">
</table> </table>
</div>