Revision 288111da
Von Moritz Bunkus vor mehr als 11 Jahren hinzugefügt
SL/Controller/Admin.pm | ||
---|---|---|
10 | 10 |
use SL::DB::AuthGroup; |
11 | 11 |
use SL::Helper::Flash; |
12 | 12 |
use SL::Locale::String qw(t8); |
13 |
use SL::User; |
|
13 | 14 |
|
14 | 15 |
use Rose::Object::MakeMethods::Generic |
15 | 16 |
( |
16 |
'scalar --get_set_init' => [ qw(client user nologin_file_name db_cfg) ], |
|
17 |
'scalar --get_set_init' => [ qw(client user nologin_file_name db_cfg all_dateformats all_numberformats all_countrycodes all_stylesheets all_menustyles all_clients all_groups) ],
|
|
17 | 18 |
); |
18 | 19 |
|
19 | 20 |
__PACKAGE__->run_before(\&setup_layout); |
... | ... | |
25 | 26 |
} |
26 | 27 |
|
27 | 28 |
# |
28 |
# actions |
|
29 |
# actions: login, logout
|
|
29 | 30 |
# |
30 | 31 |
|
31 | 32 |
sub action_login { |
... | ... | |
35 | 36 |
return if !$self->authenticate_root; |
36 | 37 |
return if !$self->check_auth_db_and_tables; |
37 | 38 |
return if $self->apply_dbupgrade_scripts; |
38 |
$self->redirect_to(action => 'list_clients_and_users');
|
|
39 |
$self->redirect_to(action => 'show');
|
|
39 | 40 |
} |
40 | 41 |
|
41 | 42 |
sub action_logout { |
... | ... | |
44 | 45 |
$self->redirect_to(action => 'login'); |
45 | 46 |
} |
46 | 47 |
|
48 |
# |
|
49 |
# actions: creating the authentication database & tables, applying database ugprades |
|
50 |
# |
|
51 |
|
|
47 | 52 |
sub action_apply_dbupgrade_scripts { |
48 | 53 |
my ($self) = @_; |
49 | 54 |
|
50 | 55 |
return if $self->apply_dbupgrade_scripts; |
51 |
$self->action_list_clients_and_users;
|
|
56 |
$self->action_show;
|
|
52 | 57 |
} |
53 | 58 |
|
54 | 59 |
sub action_create_auth_db { |
... | ... | |
81 | 86 |
} |
82 | 87 |
} |
83 | 88 |
|
84 |
sub action_list_clients_and_users { |
|
89 |
# |
|
90 |
# actions: users |
|
91 |
# |
|
92 |
|
|
93 |
sub action_show { |
|
85 | 94 |
my ($self) = @_; |
86 | 95 |
|
87 | 96 |
$self->render( |
88 |
"admin/list_users",
|
|
97 |
"admin/show",
|
|
89 | 98 |
CLIENTS => SL::DB::Manager::AuthClient->get_all_sorted, |
90 | 99 |
USERS => SL::DB::Manager::AuthUser->get_all_sorted, |
91 | 100 |
LOCKED => (-e $self->nologin_file_name), |
92 |
title => "kivitendo " . $::locale->text('Administration'),
|
|
101 |
title => "kivitendo " . t8('Administration'),
|
|
93 | 102 |
); |
94 | 103 |
} |
95 | 104 |
|
105 |
sub action_new_user { |
|
106 |
my ($self) = @_; |
|
107 |
|
|
108 |
$self->user(SL::DB::AuthUser->new( |
|
109 |
config_values => { |
|
110 |
vclimit => 200, |
|
111 |
countrycode => "de", |
|
112 |
numberformat => "1.000,00", |
|
113 |
dateformat => "dd.mm.yy", |
|
114 |
stylesheet => "kivitendo.css", |
|
115 |
menustyle => "neu", |
|
116 |
}, |
|
117 |
)); |
|
118 |
|
|
119 |
$self->edit_user_form(title => t8('Create a new user')); |
|
120 |
} |
|
121 |
|
|
122 |
sub action_edit_user { |
|
123 |
my ($self) = @_; |
|
124 |
$self->edit_user_form(title => t8('Edit User')); |
|
125 |
} |
|
126 |
|
|
127 |
sub action_save_user { |
|
128 |
my ($self) = @_; |
|
129 |
my $params = delete($::form->{user}) || { }; |
|
130 |
my $props = delete($params->{config_values}) || { }; |
|
131 |
my $is_new = !$params->{id}; |
|
132 |
|
|
133 |
$self->user($is_new ? SL::DB::AuthUser->new : SL::DB::AuthUser->new(id => $params->{id})->load) |
|
134 |
->assign_attributes(%{ $params }) |
|
135 |
->config_values({ %{ $self->user->config_values }, %{ $props } }); |
|
136 |
|
|
137 |
my @errors = $self->user->validate; |
|
138 |
|
|
139 |
if (@errors) { |
|
140 |
flash('error', @errors); |
|
141 |
$self->edit_user_form(title => $is_new ? t8('Create a new user') : t8('Edit User')); |
|
142 |
return; |
|
143 |
} |
|
144 |
|
|
145 |
$self->user->save; |
|
146 |
|
|
147 |
if ($::auth->can_change_password && $::form->{new_password}) { |
|
148 |
$::auth->change_password($self->user->login, $::form->{new_password}); |
|
149 |
} |
|
150 |
|
|
151 |
flash_later('info', $is_new ? t8('The user has been created.') : t8('The user has been saved.')); |
|
152 |
$self->redirect_to(action => 'show'); |
|
153 |
} |
|
154 |
|
|
155 |
sub action_delete_user { |
|
156 |
my ($self) = @_; |
|
157 |
|
|
158 |
if (!$self->user->delete) { |
|
159 |
flash('error', t8('The user could not be deleted.')); |
|
160 |
$self->edit_user_form(title => t8('Edit User')); |
|
161 |
return; |
|
162 |
} |
|
163 |
|
|
164 |
flash_later('info', t8('The user has been deleted.')); |
|
165 |
$self->redirect_to(action => 'show'); |
|
166 |
} |
|
167 |
|
|
168 |
# |
|
169 |
# actions: locking, unlocking |
|
170 |
# |
|
171 |
|
|
96 | 172 |
sub action_unlock_system { |
97 | 173 |
my ($self) = @_; |
98 | 174 |
unlink $self->nologin_file_name; |
99 | 175 |
flash_later('info', t8('Lockfile removed!')); |
100 |
$self->redirect_to(action => 'list_clients_and_users');
|
|
176 |
$self->redirect_to(action => 'show');
|
|
101 | 177 |
} |
102 | 178 |
|
103 | 179 |
sub action_lock_system { |
... | ... | |
110 | 186 |
} else { |
111 | 187 |
$fh->close; |
112 | 188 |
flash_later('info', t8('Lockfile created!')); |
113 |
$self->redirect_to(action => 'list_clients_and_users');
|
|
189 |
$self->redirect_to(action => 'show');
|
|
114 | 190 |
} |
115 | 191 |
} |
116 | 192 |
|
... | ... | |
118 | 194 |
# initializers |
119 | 195 |
# |
120 | 196 |
|
121 |
sub init_db_cfg { $::lx_office_conf{'authentication/database'} } |
|
122 |
sub init_nologin_file_name { $::lx_office_conf{paths}->{userspath} . '/nologin'; } |
|
123 |
sub init_client { SL::DB::AuthClient->new(id => $::form->{client_id})->load; } |
|
124 |
sub init_user { SL::DB::AuthUser ->new(id => $::form->{user_id} )->load; } |
|
197 |
sub init_db_cfg { $::lx_office_conf{'authentication/database'} } |
|
198 |
sub init_nologin_file_name { $::lx_office_conf{paths}->{userspath} . '/nologin'; } |
|
199 |
sub init_client { SL::DB::AuthClient->new(id => ($::form->{id} || ($::form->{client} || {})->{id}))->load } |
|
200 |
sub init_user { SL::DB::AuthUser ->new(id => ($::form->{id} || ($::form->{user} || {})->{id}))->load } |
|
201 |
sub init_all_clients { SL::DB::Manager::AuthClient->get_all_sorted } |
|
202 |
sub init_all_groups { SL::DB::Manager::AuthGroup->get_all_sorted } |
|
203 |
sub init_all_dateformats { [ qw(mm/dd/yy dd/mm/yy dd.mm.yy yyyy-mm-dd) ] } |
|
204 |
sub init_all_numberformats { [ qw(1,000.00 1000.00 1.000,00 1000,00) ] } |
|
205 |
sub init_all_stylesheets { [ qw(lx-office-erp.css Mobile.css kivitendo.css) ] } |
|
206 |
sub init_all_menustyles { |
|
207 |
return [ |
|
208 |
{ id => 'old', title => $::locale->text('Old (on the side)') }, |
|
209 |
{ id => 'v3', title => $::locale->text('Top (CSS)') }, |
|
210 |
{ id => 'neu', title => $::locale->text('Top (Javascript)') }, |
|
211 |
]; |
|
212 |
} |
|
213 |
|
|
214 |
sub init_all_countrycodes { |
|
215 |
my %cc = User->country_codes; |
|
216 |
return [ map { id => $_, title => $cc{$_} }, sort { $cc{$a} cmp $cc{$b} } keys %cc ]; |
|
217 |
} |
|
125 | 218 |
|
126 | 219 |
# |
127 | 220 |
# filters |
... | ... | |
136 | 229 |
} |
137 | 230 |
|
138 | 231 |
# |
139 |
# helpers
|
|
232 |
# displaying forms
|
|
140 | 233 |
# |
141 | 234 |
|
142 | 235 |
sub login_form { |
... | ... | |
145 | 238 |
$self->render('admin/adminlogin', title => t8('kivitendo v#1 administration', $::form->{version}), %params); |
146 | 239 |
} |
147 | 240 |
|
241 |
sub edit_user_form { |
|
242 |
my ($self, %params) = @_; |
|
243 |
|
|
244 |
$::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side); |
|
245 |
$self->render('admin/edit_user', %params); |
|
246 |
} |
|
247 |
|
|
248 |
# |
|
249 |
# helpers |
|
250 |
# |
|
251 |
|
|
148 | 252 |
sub check_auth_db_and_tables { |
149 | 253 |
my ($self) = @_; |
150 | 254 |
|
SL/DB/AuthUser.pm | ||
---|---|---|
36 | 36 |
my ($self) = @_; |
37 | 37 |
|
38 | 38 |
my @errors; |
39 |
push @errors, $::locale->text('The login is missing.') if !$self->login; |
|
40 |
push @errors, $::locale->text('The login is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'login'); |
|
41 |
push @errors, "chunky bacon"; |
|
39 |
push @errors, $::locale->text('The login is missing.') if !$self->login; |
|
40 |
push @errors, $::locale->text('The login is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'login'); |
|
42 | 41 |
|
43 | 42 |
return @errors; |
44 | 43 |
} |
... | ... | |
46 | 45 |
sub get_config_value { |
47 | 46 |
my ($self, $key) = @_; |
48 | 47 |
|
49 |
my $cfg = first { $_->cfg_key eq $key } @{ $self->configs }; |
|
48 |
my $cfg = first { $_->cfg_key eq $key } @{ $self->configs || [] };
|
|
50 | 49 |
return $cfg ? $cfg->cfg_value : undef; |
51 | 50 |
} |
52 | 51 |
|
... | ... | |
58 | 57 |
$self->configs([ map { SL::DB::AuthUserConfig->new(cfg_key => $_, cfg_value => $settings{$_}) } keys %settings ]); |
59 | 58 |
} |
60 | 59 |
|
61 |
return { map { ($_->cfg_key => $_->cfg_value) } @{ $self->configs } }; |
|
60 |
return { map { ($_->cfg_key => $_->cfg_value) } @{ $self->configs || [] } };
|
|
62 | 61 |
} |
63 | 62 |
|
64 | 63 |
1; |
bin/mozilla/admin.pl | ||
---|---|---|
77 | 77 |
our $locale; |
78 | 78 |
our $auth; |
79 | 79 |
|
80 |
my @valid_dateformats = qw(mm/dd/yy dd/mm/yy dd.mm.yy yyyy-mm-dd); |
|
81 |
my @valid_numberformats = ('1,000.00', '1000.00', '1.000,00', '1000,00'); |
|
82 |
my @all_stylesheets = qw(lx-office-erp.css Mobile.css kivitendo.css); |
|
83 |
my @all_menustyles = ( |
|
84 |
{ id => 'old', title => $::locale->text('Old (on the side)') }, |
|
85 |
{ id => 'v3', title => $::locale->text('Top (CSS)') }, |
|
86 |
{ id => 'neu', title => $::locale->text('Top (Javascript)') }, |
|
87 |
); |
|
88 |
|
|
89 | 80 |
sub run { |
90 | 81 |
$::lxdebug->enter_sub; |
91 | 82 |
my $session_result = shift; |
... | ... | |
131 | 122 |
print $form->parse_html_template('admin/adminlogin'); |
132 | 123 |
} |
133 | 124 |
|
134 |
sub add_user { |
|
135 |
$::form->{title} = "kivitendo " . $::locale->text('Administration') . " / " . $::locale->text('Add User'); |
|
136 |
|
|
137 |
# User does not have a well behaved new constructor, so we'll just have to build one ourself |
|
138 |
my $user = bless { |
|
139 |
"vclimit" => 200, |
|
140 |
"countrycode" => "de", |
|
141 |
"numberformat" => "1.000,00", |
|
142 |
"dateformat" => "dd.mm.yy", |
|
143 |
"stylesheet" => "kivitendo.css", |
|
144 |
"menustyle" => "neu", |
|
145 |
dbport => $::auth->{DB_config}->{port} || 5432, |
|
146 |
dbuser => $::auth->{DB_config}->{user} || 'lxoffice', |
|
147 |
dbhost => $::auth->{DB_config}->{host} || 'localhost', |
|
148 |
}, 'User'; |
|
149 |
|
|
150 |
edit_user_form($user); |
|
151 |
} |
|
152 |
|
|
153 |
sub edit_user { |
|
154 |
$::form->{title} = "kivitendo " . $::locale->text('Administration') . " / " . $::locale->text('Edit User'); |
|
155 |
$::form->{edit} = 1; |
|
156 |
|
|
157 |
# get user |
|
158 |
my $user = User->new(id => $::form->{user}{id}); |
|
159 |
|
|
160 |
edit_user_form($user); |
|
161 |
} |
|
162 |
|
|
163 |
sub edit_user_form { |
|
164 |
my ($user) = @_; |
|
165 |
|
|
166 |
my %cc = $user->country_codes; |
|
167 |
my @all_countrycodes = map { id => $_, title => $cc{$_} }, sort { $cc{$a} cmp $cc{$b} } keys %cc; |
|
168 |
my ($all_dir, $all_master) = _search_templates(); |
|
169 |
my $groups = []; |
|
170 |
|
|
171 |
if ($::form->{edit}) { |
|
172 |
my $user_id = $::auth->get_user_id($user->{login}); |
|
173 |
my $all_groups = $::auth->read_groups(); |
|
174 |
|
|
175 |
for my $group (values %{ $all_groups }) { |
|
176 |
push @{ $groups }, $group if (grep { $user_id == $_ } @{ $group->{members} }); |
|
177 |
} |
|
178 |
|
|
179 |
$groups = [ sort { lc $a->{name} cmp lc $b->{name} } @{ $groups } ]; |
|
180 |
} |
|
181 |
|
|
182 |
$::form->header; |
|
183 |
print $::form->parse_html_template("admin/edit_user", { |
|
184 |
GROUPS => $groups, |
|
185 |
CAN_CHANGE_PASSWORD => $::auth->can_change_password, |
|
186 |
user => $user->data, |
|
187 |
all_stylesheets => \@all_stylesheets, |
|
188 |
all_numberformats => \@valid_numberformats, |
|
189 |
all_dateformats => \@valid_dateformats, |
|
190 |
all_countrycodes => \@all_countrycodes, |
|
191 |
all_menustyles => \@all_menustyles, |
|
192 |
all_templates => $all_dir, |
|
193 |
all_master_templates => $all_master, |
|
194 |
}); |
|
195 |
} |
|
196 |
|
|
197 |
sub save_user { |
|
198 |
my $form = $main::form; |
|
199 |
my $locale = $main::locale; |
|
200 |
|
|
201 |
my $user = $form->{user}; |
|
202 |
|
|
203 |
$user->{dbdriver} = 'Pg'; |
|
204 |
|
|
205 |
if (!$::form->{edit}) { |
|
206 |
# no spaces allowed in login name |
|
207 |
$user->{login} =~ s/\s//g; |
|
208 |
$::form->show_generic_error($::locale->text('Login name missing!')) unless $user->{login}; |
|
209 |
|
|
210 |
# check for duplicates |
|
211 |
my %members = $::auth->read_all_users; |
|
212 |
if ($members{$user->{login}}) { |
|
213 |
$::form->show_generic_error($locale->text('Another user with the login #1 does already exist.', $user->{login}), 'back_button' => 1); |
|
214 |
} |
|
215 |
} |
|
216 |
|
|
217 |
# no spaces allowed in directories |
|
218 |
($::form->{newtemplates}) = split / /, $::form->{newtemplates}; |
|
219 |
$user->{templates} = $::form->{newtemplates} || $::form->{usetemplates} || $user->{login}; |
|
220 |
|
|
221 |
# is there a basedir |
|
222 |
if (!-d $::lx_office_conf{paths}->{templates}) { |
|
223 |
$::form->error(sprintf($::locale->text("The directory %s does not exist."), $::lx_office_conf{paths}->{templates})); |
|
224 |
} |
|
225 |
|
|
226 |
# add base directory to $form->{templates} |
|
227 |
$user->{templates} =~ s|.*/||; |
|
228 |
$user->{templates} = $::lx_office_conf{paths}->{templates} . "/$user->{templates}"; |
|
229 |
|
|
230 |
my $myconfig = new User(id => $user->{id}); |
|
231 |
|
|
232 |
$::form->show_generic_error($::locale->text('Dataset missing!')) unless $user->{dbname}; |
|
233 |
$::form->show_generic_error($::locale->text('Database User missing!')) unless $user->{dbuser}; |
|
234 |
|
|
235 |
foreach my $item (keys %{$user}) { |
|
236 |
$myconfig->{$item} = $user->{$item}; |
|
237 |
} |
|
238 |
|
|
239 |
$myconfig->save_member; |
|
240 |
|
|
241 |
$user->{templates} =~ s|.*/||; |
|
242 |
$user->{templates} = $::lx_office_conf{paths}->{templates} . "/$user->{templates}"; |
|
243 |
$::form->{mastertemplates} =~ s|.*/||; |
|
244 |
|
|
245 |
# create user template directory and copy master files |
|
246 |
if (!-d "$user->{templates}") { |
|
247 |
umask(002); |
|
248 |
|
|
249 |
if (mkdir "$user->{templates}", oct("771")) { |
|
250 |
|
|
251 |
umask(007); |
|
252 |
|
|
253 |
# copy templates to the directory |
|
254 |
|
|
255 |
my $oldcurrdir = getcwd(); |
|
256 |
if (!chdir("$::lx_office_conf{paths}->{templates}/print/$::form->{mastertemplates}")) { |
|
257 |
$form->error("$ERRNO: chdir $::lx_office_conf{paths}->{templates}/print/$::form->{mastertemplates}"); |
|
258 |
} |
|
259 |
|
|
260 |
my $newdir = File::Spec->catdir($oldcurrdir, $user->{templates}); |
|
261 |
|
|
262 |
find( |
|
263 |
sub |
|
264 |
{ |
|
265 |
next if ($_ eq "."); |
|
266 |
|
|
267 |
if (-d $_) { |
|
268 |
if (!mkdir (File::Spec->catdir($newdir, $File::Find::name))) { |
|
269 |
chdir($oldcurrdir); |
|
270 |
$form->error("$ERRNO: mkdir $File::Find::name"); |
|
271 |
} |
|
272 |
} elsif (-l $_) { |
|
273 |
if (!symlink (readlink($_), |
|
274 |
File::Spec->catfile($newdir, $File::Find::name))) { |
|
275 |
chdir($oldcurrdir); |
|
276 |
$form->error("$ERRNO: symlink $File::Find::name"); |
|
277 |
} |
|
278 |
} elsif (-f $_) { |
|
279 |
if (!copy($_, File::Spec->catfile($newdir, $File::Find::name))) { |
|
280 |
chdir($oldcurrdir); |
|
281 |
$form->error("$ERRNO: cp $File::Find::name"); |
|
282 |
} |
|
283 |
} |
|
284 |
}, "./"); |
|
285 |
|
|
286 |
chdir($oldcurrdir); |
|
287 |
|
|
288 |
} else { |
|
289 |
$form->error("$ERRNO: $user->{templates}"); |
|
290 |
} |
|
291 |
} |
|
292 |
|
|
293 |
# Add new user to his groups. |
|
294 |
if (ref $form->{new_user_group_ids} eq 'ARRAY') { |
|
295 |
my $all_groups = $main::auth->read_groups(); |
|
296 |
my %user = $main::auth->read_user(login => $myconfig->{login}); |
|
297 |
|
|
298 |
foreach my $group_id (@{ $form->{new_user_group_ids} }) { |
|
299 |
my $group = $all_groups->{$group_id}; |
|
300 |
|
|
301 |
next if !$group; |
|
302 |
|
|
303 |
push @{ $group->{members} }, $user{id}; |
|
304 |
$main::auth->save_group($group); |
|
305 |
} |
|
306 |
} |
|
307 |
|
|
308 |
if ($main::auth->can_change_password() |
|
309 |
&& defined $::form->{new_password} |
|
310 |
&& ($::form->{new_password} ne '********')) { |
|
311 |
my $verifier = SL::Auth::PasswordPolicy->new; |
|
312 |
my $result = $verifier->verify($::form->{new_password}, 1); |
|
313 |
|
|
314 |
if ($result != SL::Auth::PasswordPolicy->OK()) { |
|
315 |
$form->error($::locale->text('The settings were saved, but the password was not changed.') . ' ' . join(' ', $verifier->errors($result))); |
|
316 |
} |
|
317 |
|
|
318 |
$main::auth->change_password($myconfig->{login}, $::form->{new_password}); |
|
319 |
} |
|
320 |
|
|
321 |
$::form->redirect($::locale->text('User saved!')); |
|
322 |
} |
|
323 |
|
|
324 |
sub save_user_as_new { |
|
325 |
my $form = $main::form; |
|
326 |
|
|
327 |
$form->{user}{login} = $::form->{new_user_login}; |
|
328 |
delete $form->{user}{id}; |
|
329 |
delete @{$form}{qw(id edit new_user_login)}; |
|
330 |
|
|
331 |
save_user(); |
|
332 |
} |
|
333 |
|
|
334 |
sub delete_user { |
|
335 |
my $form = $main::form; |
|
336 |
my $locale = $main::locale; |
|
337 |
|
|
338 |
my $user = $::form->{user} || {}; |
|
339 |
|
|
340 |
$::form->show_generic_error($::locale->text('Missing user id!')) unless $user->{id}; |
|
341 |
|
|
342 |
my $loaded_user = User->new(id => $user->{id}); |
|
343 |
|
|
344 |
my %members = $main::auth->read_all_users(); |
|
345 |
my $templates = $members{$loaded_user->{login}}->{templates}; |
|
346 |
|
|
347 |
$main::auth->delete_user($loaded_user->{login}); |
|
348 |
|
|
349 |
if ($templates) { |
|
350 |
my $templates_in_use = 0; |
|
351 |
|
|
352 |
foreach my $login (keys %members) { |
|
353 |
next if $loaded_user->{login} eq $login; |
|
354 |
next if $members{$login}->{templates} ne $templates; |
|
355 |
$templates_in_use = 1; |
|
356 |
last; |
|
357 |
} |
|
358 |
|
|
359 |
if (!$templates_in_use && -d $templates) { |
|
360 |
unlink <$templates/*>; |
|
361 |
rmdir $templates; |
|
362 |
} |
|
363 |
} |
|
364 |
|
|
365 |
$form->redirect($locale->text('User deleted!')); |
|
366 |
|
|
367 |
} |
|
368 |
|
|
369 | 125 |
sub login_name { |
370 | 126 |
my $login = shift; |
371 | 127 |
|
locale/de/all | ||
---|---|---|
75 | 75 |
'Abort' => 'Abbrechen', |
76 | 76 |
'Abrechnungsnummer' => 'Abrechnungsnummer', |
77 | 77 |
'Abteilung' => 'Abteilung', |
78 |
'Access to clients' => 'Zugriff auf Mandanten', |
|
78 | 79 |
'Account' => 'Konto', |
79 | 80 |
'Account Category A' => 'Aktiva/Mittelverwendung', |
80 | 81 |
'Account Category C' => 'Kosten', |
... | ... | |
116 | 117 |
'Accounting Group saved!' => 'Buchungsgruppe gespeichert!', |
117 | 118 |
'Accounting method' => 'Versteuerungsart', |
118 | 119 |
'Accrual' => 'Soll-Versteuerung', |
120 |
'Actions' => 'Aktionen', |
|
119 | 121 |
'Active' => 'Aktiv', |
120 | 122 |
'Active?' => 'Aktiviert?', |
121 | 123 |
'Add' => 'Erfassen', |
... | ... | |
178 | 180 |
'All Accounts' => 'Alle Konten', |
179 | 181 |
'All Datasets up to date!' => 'Alle Datenbanken sind auf aktuellem Stand.', |
180 | 182 |
'All changes in that file have been reverted.' => 'Alle Änderungen in dieser Datei wurden rückgängig gemacht.', |
183 |
'All clients' => 'Alle Mandanten', |
|
181 | 184 |
'All database upgrades have been applied.' => 'Alle Datenbankupdates wurden eingespielt.', |
182 | 185 |
'All general ledger entries' => 'Alle Hauptbucheinträge', |
183 | 186 |
'All groups' => 'Alle Gruppen', |
... | ... | |
200 | 203 |
'An invalid character was used (valid characters: #1).' => 'Ein ungültiges Zeichen wurde benutzt (gültige Zeichen: #1).', |
201 | 204 |
'An upper-case character is required.' => 'Ein Großbuchstabe ist vorgeschrieben.', |
202 | 205 |
'Annotations' => 'Anmerkungen', |
203 |
'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.', |
|
204 | 206 |
'Any stock contents containing a best before date will be impossible to stock out otherwise.' => 'Sonst können Artikel, bei denen ein Mindesthaltbarkeitsdatum gesetzt ist, nicht mehr ausgelagert werden.', |
205 | 207 |
'Ap aging on %s' => 'Offene Verbindlichkeiten zum %s', |
206 | 208 |
'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.', |
... | ... | |
436 | 438 |
'City' => 'Stadt', |
437 | 439 |
'Cleared Balance' => 'abgeschlossen', |
438 | 440 |
'Clearing Tax Received (No 71)' => 'Verrechnung des Erstattungsbetrages erwünscht (Zeile 71)', |
439 |
'Click on login name to edit!' => 'Zum Bearbeiten den Benutzernamen anklicken!', |
|
440 | 441 |
'Client #1' => 'Mandant #1', |
441 | 442 |
'Client Configuration' => 'Mandantenkonfiguration', |
442 | 443 |
'Client Configuration saved!' => 'Mandantenkonfiguration gespeichert!', |
443 | 444 |
'Client list' => 'Mandantenliste', |
444 | 445 |
'Client name' => 'Mandantenname', |
446 |
'Clients this user has access to' => 'Mandaten, auf die Benutzer Zugriff hat', |
|
445 | 447 |
'Close' => 'Übernehmen', |
446 | 448 |
'Close Books up to' => 'Die Bücher abschließen bis zum', |
447 | 449 |
'Close Flash' => 'Schließen', |
... | ... | |
497 | 499 |
'Create a new department' => 'Eine neue Abteilung erfassen', |
498 | 500 |
'Create a new payment term' => 'Neue Zahlungsbedingungen anlegen', |
499 | 501 |
'Create a new project' => 'Neues Projekt anlegen', |
502 |
'Create a new user' => 'Einen neuen Benutzer anlegen', |
|
500 | 503 |
'Create and edit RFQs' => 'Lieferantenanfragen erfassen und bearbeiten', |
501 | 504 |
'Create and edit dunnings' => 'Mahnungen erfassen und bearbeiten', |
502 | 505 |
'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten', |
... | ... | |
585 | 588 |
'DUNNING STARTED' => 'Mahnprozess gestartet', |
586 | 589 |
'DUNS-Nr' => 'DUNS-Nr.', |
587 | 590 |
'Data' => 'Daten', |
588 |
'Database' => 'Datenbank', |
|
589 | 591 |
'Database Administration' => 'Datenbankadministration', |
590 | 592 |
'Database Connection Test' => 'Test der Datenbankverbindung', |
591 | 593 |
'Database Host' => 'Datenbankcomputer', |
592 | 594 |
'Database ID' => 'Datenbank-ID', |
593 | 595 |
'Database User' => 'Datenbankbenutzer', |
594 |
'Database User missing!' => 'Datenbankbenutzer fehlt!', |
|
595 | 596 |
'Database backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.', |
596 | 597 |
'Database name' => 'Datenbankname', |
597 | 598 |
'Database settings' => 'Datenbankeinstellungen', |
... | ... | |
995 | 996 |
'Group saved!' => 'Warengruppe gespeichert!', |
996 | 997 |
'Groups' => 'Warengruppen', |
997 | 998 |
'Groups that are valid for this client for access rights' => 'Gruppen, die für diesen Mandanten gültig sind', |
999 |
'Groups this user is a member in' => 'Gruppen, in denen Benutzer Mitglied ist', |
|
998 | 1000 |
'Groups valid for this client' => 'Für Mandanten gültige Gruppen', |
999 | 1001 |
'HTML' => 'HTML', |
1000 | 1002 |
'HTML Templates' => 'HTML-Vorlagen', |
... | ... | |
1208 | 1210 |
'Lockfile removed!' => 'System entsperrt!', |
1209 | 1211 |
'Login' => 'Anmelden', |
1210 | 1212 |
'Login Name' => 'Benutzer', |
1211 |
'Login name missing!' => 'Benutzer - Feld darf nicht leer sein!', |
|
1212 | 1213 |
'Login of User' => 'Login', |
1213 | 1214 |
'Logout' => 'Abmelden', |
1214 | 1215 |
'Logout now' => 'kivitendo jetzt verlassen', |
... | ... | |
1261 | 1262 |
'Missing parameter #1 in call to sub #2.' => 'Fehlender Parameter \'#1\' in Funktionsaufruf \'#2\'.', |
1262 | 1263 |
'Missing parameter (at least one of #1) in call to sub #2.' => 'Fehlernder Parameter (mindestens einer aus \'#1\') in Funktionsaufruf \'#2\'.', |
1263 | 1264 |
'Missing taxkeys in invoices with taxes.' => 'Fehlende Steuerschlüssel in Rechnungen mit Steuern', |
1264 |
'Missing user id!' => 'Benutzer ID fehlt!', |
|
1265 | 1265 |
'Mitarbeiter' => 'Mitarbeiter', |
1266 | 1266 |
'Mixed (requires column "type")' => 'Gemischt (erfordert Spalte "type")', |
1267 | 1267 |
'Mobile' => 'Mobiltelefon', |
... | ... | |
1289 | 1289 |
'Net amount' => 'Nettobetrag', |
1290 | 1290 |
'Netto Terms' => 'Zahlungsziel netto', |
1291 | 1291 |
'New Buchungsgruppe #1' => 'Neue Buchungsgruppe #1', |
1292 |
'New Templates' => 'Erzeuge Vorlagen, Name',
|
|
1292 |
'New Password' => 'Neues Passwort',
|
|
1293 | 1293 |
'New assembly' => 'Neues Erzeugnis', |
1294 | 1294 |
'New bank account' => 'Neues Bankkonto', |
1295 | 1295 |
'New client #1: The database configuration fields "host", "port", "name" and "user" must not be empty.' => 'Neuer Mandant #1: Die Datenbankkonfigurationsfelder "Host", "Port" und "Name" dürfen nicht leer sein.', |
... | ... | |
1335 | 1335 |
'No file has been uploaded yet.' => 'Es wurde noch keine Datei hochgeladen.', |
1336 | 1336 |
'No group has been selected, or the group does not exist anymore.' => 'Es wurde keine Gruppe ausgewählt, oder die Gruppe wurde in der Zwischenzeit gelöscht.', |
1337 | 1337 |
'No groups have been added yet.' => 'Es wurden noch keine Gruppen angelegt.', |
1338 |
'No groups have been created yet.' => 'Es wurden noch keine Gruppen angelegt.', |
|
1338 | 1339 |
'No or an unknown authenticantion module specified in "config/kivitendo.conf".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/kivitendo.conf" angegeben.', |
1339 | 1340 |
'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.', |
1340 | 1341 |
'No payment term has been created yet.' => 'Es wurden noch keine Zahlungsbedingungen angelegt.', |
... | ... | |
1806 | 1807 |
'Set eMail text' => 'eMail Text eingeben', |
1807 | 1808 |
'Settings' => 'Einstellungen', |
1808 | 1809 |
'Setup Menu' => 'Menü-Variante', |
1809 |
'Setup Templates' => 'Vorlagen auswählen', |
|
1810 | 1810 |
'Ship to' => 'Lieferadresse', |
1811 | 1811 |
'Ship via' => 'Transportmittel', |
1812 | 1812 |
'Shipping Address' => 'Lieferadresse', |
... | ... | |
1975 | 1975 |
'Templates' => 'Vorlagen', |
1976 | 1976 |
'Terms missing in row ' => '+Tage fehlen in Zeile ', |
1977 | 1977 |
'Test and preview' => 'Test und Vorschau', |
1978 |
'Test connection' => 'Verbindung testen', |
|
1979 | 1978 |
'Text field' => 'Textfeld', |
1980 | 1979 |
'Text field variables: \'WIDTH=w HEIGHT=h\' sets the width and height of the text field. They default to 30 and 5 respectively.' => 'Textfelder: \'WIDTH=w HEIGHT=h\' setzen die Breite und die Höhe des Textfeldes. Wenn nicht anders angegeben, so werden sie 30 Zeichen breit und fünf Zeichen hoch dargestellt.', |
1981 | 1980 |
'Text variables: \'MAXLENGTH=n\' sets the maximum entry length to \'n\'.' => 'Textzeilen: \'MAXLENGTH=n\' setzt eine Maximallänge von n Zeichen.', |
... | ... | |
2085 | 2084 |
'The items are imported accoring do their number "X" regardless of the column order inside the file.' => 'Die Einträge werden in der Reihenfolge ihrer Indizes "X" unabhängig von der Spaltenreihenfolge in der Datei importiert.', |
2086 | 2085 |
'The link target to add has been created from the existing record.' => 'Das auszuwählende Verknüpfungsziel wurde aus dem bestehenden Beleg erstellt.', |
2087 | 2086 |
'The list has been printed.' => 'Die Liste wurde ausgedruckt.', |
2087 |
'The login is missing.' => 'Der Loginname fehlt.', |
|
2088 |
'The login is not unique.' => 'Der Loginname ist nicht eindeutig.', |
|
2088 | 2089 |
'The long description is missing.' => 'Der Langtext fehlt.', |
2089 | 2090 |
'The name in row %d has already been used before.' => 'Der Name in Zeile %d wurde vorher bereits benutzt.', |
2090 | 2091 |
'The name is missing in row %d.' => 'Der Name fehlt in Zeile %d.', |
... | ... | |
2150 | 2151 |
'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr geändert werden.', |
2151 | 2152 |
'The units have been saved.' => 'Die Einheiten wurden gespeichert.', |
2152 | 2153 |
'The user can chose which client to connect to during login.' => 'Bei der Anmeldung kann der Benutzer auswählen, welchen Mandanten er benutzen möchte.', |
2153 |
'The user is a member in the following group(s):' => 'Der Benutzer ist Mitglied in den folgenden Gruppen:', |
|
2154 |
'The user could not be deleted.' => '', |
|
2155 |
'The user has been created.' => 'Der Benutzer wurde angelegt.', |
|
2156 |
'The user has been deleted.' => '', |
|
2157 |
'The user has been saved.' => 'Der Benutzer wurde gespeichert.', |
|
2154 | 2158 |
'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => 'Der Variablenname darf nur aus Zeichen (keine Umlaute), Ziffern und Unterstrichen bestehen. Er muss mit einem Buchstaben beginnen. Beispiel: weihnachtsgruss_verschicken', |
2155 | 2159 |
'The warehouse could not be deleted because it has already been used.' => 'Das Lager konnte nicht gelöscht werden, da es bereits in Benutzung war.', |
2156 | 2160 |
'The warehouse does not contain any bins.' => 'Das Lager enthält keine Lagerplätze.', |
... | ... | |
2215 | 2219 |
'This update will change the nature the onhand of goods is tracked.' => 'Dieses update ändert die Art und Weise wie Lagermengen gezält werden.', |
2216 | 2220 |
'This upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => 'Dieses Upgradescript versucht, bei allen bestehenden Artikeln neu erstellte Buchungsgruppen zuzuordnen.', |
2217 | 2221 |
'This upgrade script tries to map all existing units in the database to the newly created units.' => 'Dieses Update-Script versucht, alle bestehenden Einheiten automatisch in die neuen Einheiten umzuwandeln.', |
2222 |
'This user is a member in the following groups' => 'Dieser Benutzer ist Mitglied in den folgenden Gruppen', |
|
2223 |
'This user will have access to the following clients' => 'Dieser Benutzer wird Zugriff auf die folgenden Mandanten haben', |
|
2218 | 2224 |
'This vendor number is already in use.' => 'Diese Lieferantennummer wird bereits verwendet.', |
2219 | 2225 |
'Three Options:' => 'Drei Optionen:', |
2220 | 2226 |
'Time period for the analysis:' => 'Analysezeitraum:', |
... | ... | |
2224 | 2230 |
'To (email)' => 'An', |
2225 | 2231 |
'To (time)' => 'Bis', |
2226 | 2232 |
'To Date' => 'Bis', |
2227 |
'To add a user to a group edit a name, change the login name and save. A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzufügen, ändern und speichern Sie am einfachsten einen bestehenden Benutzernamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.', |
|
2228 | 2233 |
'To continue please change the taxkey 0 to another value.' => 'Um fortzufahren, ändern Sie bitte den Steuerschlüssel 0 auf einen anderen Wert.', |
2234 |
'To user login' => 'Zum Benutzerlogin', |
|
2229 | 2235 |
'Top' => 'Oben', |
2230 | 2236 |
'Top (CSS)' => 'Oben (mit CSS)', |
2231 | 2237 |
'Top (Javascript)' => 'Oben (mit Javascript)', |
... | ... | |
2318 | 2324 |
'Updating the client fields in the database "#1" on host "#2:#3" failed.' => 'Die Aktualisierung der Mandantenfelder in der Datenbank "#1" auf Host "#2:#3" schlug fehl.', |
2319 | 2325 |
'Uploaded on #1, size #2 kB' => 'Am #1 hochgeladen, Größe #2 kB', |
2320 | 2326 |
'Use As New' => 'Als neu verwenden', |
2321 |
'Use Templates' => 'Benutze Vorlagen', |
|
2322 | 2327 |
'Use master default bin for Default Transfer, if no default bin for the part is configured' => 'Standardlagerplatz für Ein- / Auslagern über Standard-Lagerplatz, falls für die Ware kein expliziter Lagerplatz konfiguriert ist', |
2323 | 2328 |
'User' => 'Benutzer', |
2324 | 2329 |
'User Config' => 'Einstellungen', |
2325 |
'User Login' => 'Als Benutzer anmelden', |
|
2326 | 2330 |
'User access' => 'Benutzerzugriff', |
2327 |
'User deleted!' => 'Benutzer gelöscht!', |
|
2328 | 2331 |
'User list' => 'Benutzerliste', |
2329 | 2332 |
'User login' => 'Benutzeranmeldung', |
2330 | 2333 |
'User name' => 'Benutzername', |
2331 |
'User saved!' => 'Benutzer gespeichert!', |
|
2332 | 2334 |
'Username' => 'Benutzername', |
2333 | 2335 |
'Users in this group' => 'BenutzerInnen in dieser Gruppe', |
2334 | 2336 |
'Users with access' => 'Benutzer mit Zugriff', |
2335 | 2337 |
'Users with access to this client' => 'Benutzer mit Zugriff auf diesen Mandanten', |
2336 |
'Ust-IDNr' => 'USt-IdNr.', |
|
2337 | 2338 |
'VAT ID' => 'UStdID-Nr', |
2338 | 2339 |
'Valid' => 'Gültig', |
2339 | 2340 |
'Valid from' => 'Gültig ab', |
sql/Pg-upgrade2-auth/foreign_key_constraints_on_delete.sql | ||
---|---|---|
1 |
-- @tag: foreign_key_constraints_on_delete |
|
2 |
-- @description: Ändert "FOREIGN KEY" constraints auf "ON DELETE CASCADE" |
|
3 |
-- @depends: clients |
|
4 |
-- @charset: utf-8 |
|
5 |
|
|
6 |
-- auth.clients_groups |
|
7 |
ALTER TABLE auth.clients_groups DROP CONSTRAINT clients_groups_client_id_fkey; |
|
8 |
ALTER TABLE auth.clients_groups DROP CONSTRAINT clients_groups_group_id_fkey; |
|
9 |
|
|
10 |
ALTER TABLE auth.clients_groups ADD FOREIGN KEY (client_id) REFERENCES auth.clients (id) ON DELETE CASCADE; |
|
11 |
ALTER TABLE auth.clients_groups ADD FOREIGN KEY (group_id) REFERENCES auth."group" (id) ON DELETE CASCADE; |
|
12 |
|
|
13 |
-- auth.clients_users |
|
14 |
ALTER TABLE auth.clients_users DROP CONSTRAINT clients_users_client_id_fkey; |
|
15 |
ALTER TABLE auth.clients_users DROP CONSTRAINT clients_users_user_id_fkey; |
|
16 |
|
|
17 |
ALTER TABLE auth.clients_users ADD FOREIGN KEY (client_id) REFERENCES auth.clients (id) ON DELETE CASCADE; |
|
18 |
ALTER TABLE auth.clients_users ADD FOREIGN KEY (user_id) REFERENCES auth."user" (id) ON DELETE CASCADE; |
|
19 |
|
|
20 |
-- auth.group_rights |
|
21 |
ALTER TABLE auth.group_rights DROP CONSTRAINT group_rights_group_id_fkey; |
|
22 |
|
|
23 |
ALTER TABLE auth.group_rights ADD FOREIGN KEY (group_id) REFERENCES auth."group" (id) ON DELETE CASCADE; |
|
24 |
|
|
25 |
-- auth.session_content |
|
26 |
ALTER TABLE auth.session_content DROP CONSTRAINT session_content_session_id_fkey; |
|
27 |
|
|
28 |
ALTER TABLE auth.session_content ADD FOREIGN KEY (session_id) REFERENCES auth.session (id) ON DELETE CASCADE; |
|
29 |
|
|
30 |
-- auth.user_config |
|
31 |
ALTER TABLE auth.user_config DROP CONSTRAINT user_config_user_id_fkey; |
|
32 |
|
|
33 |
ALTER TABLE auth.user_config ADD FOREIGN KEY (user_id) REFERENCES auth."user" (id) ON DELETE CASCADE; |
|
34 |
|
|
35 |
-- auth.user_group |
|
36 |
ALTER TABLE auth.user_group DROP CONSTRAINT user_group_user_id_fkey; |
|
37 |
ALTER TABLE auth.user_group DROP CONSTRAINT user_group_group_id_fkey; |
|
38 |
|
|
39 |
ALTER TABLE auth.user_group ADD FOREIGN KEY (user_id) REFERENCES auth."user" (id) ON DELETE CASCADE; |
|
40 |
ALTER TABLE auth.user_group ADD FOREIGN KEY (group_id) REFERENCES auth."group" (id) ON DELETE CASCADE; |
templates/webpages/admin/backup_dataset.html | ||
---|---|---|
82 | 82 |
|
83 | 83 |
</table> |
84 | 84 |
|
85 |
<input name="callback" type="hidden" value="controller.pl?action=Admin/list_clients_and_users">
|
|
85 |
<input name="callback" type="hidden" value="controller.pl?action=Admin/show">
|
|
86 | 86 |
<input type="hidden" name="nextsub" value="backup_dataset_start"> |
87 | 87 |
|
88 | 88 |
<hr size="3" noshade> |
... | ... | |
90 | 90 |
<br> |
91 | 91 |
|
92 | 92 |
<input type="submit" class="submit" name="action" value="[% 'Continue' | $T8 %]"> |
93 |
<a href="controller.pl?action=Admin/list_clients_and_users">[% 'Back' | $T8 %]</a>
|
|
93 |
<a href="controller.pl?action=Admin/show">[% 'Back' | $T8 %]</a>
|
|
94 | 94 |
|
95 | 95 |
</form> |
96 | 96 |
|
templates/webpages/admin/backup_dataset_email_done.html | ||
---|---|---|
5 | 5 |
|
6 | 6 |
<p>[% LxERP.t8('The dataset backup has been sent via email to #1.', to) | html %]</p> |
7 | 7 |
|
8 |
<p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %] |
|
8 |
<p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %] |
templates/webpages/admin/dbadmin.html | ||
---|---|---|
3 | 3 |
<h1>[% title %]</h1> |
4 | 4 |
|
5 | 5 |
<form method="post" action="admin.pl"> |
6 |
<a href="controller.pl?action=Admin/list_clients_and_users">[% 'Back' | $T8 %]</a>
|
|
6 |
<a href="controller.pl?action=Admin/show">[% 'Back' | $T8 %]</a>
|
|
7 | 7 |
|
8 | 8 |
<table> |
9 | 9 |
<tr> |
... | ... | |
48 | 48 |
</tr> |
49 | 49 |
</table> |
50 | 50 |
|
51 |
<input name="callback" type="hidden" value="controller.pl?action=Admin/list_clients_and_users">
|
|
51 |
<input name="callback" type="hidden" value="controller.pl?action=Admin/show">
|
|
52 | 52 |
|
53 | 53 |
<br> |
54 | 54 |
<input type="submit" class="submit" name="action" value="[% 'Create Dataset' | $T8 %]"> |
templates/webpages/admin/dbcreate.html | ||
---|---|---|
5 | 5 |
|
6 | 6 |
<p>[% LxERP.t8('The dataset #1 has been successfully created.', db) | html %]</p> |
7 | 7 |
|
8 |
<p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]</p> |
|
8 |
<p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]</p> |
templates/webpages/admin/dbdelete.html | ||
---|---|---|
5 | 5 |
|
6 | 6 |
<p>[% LxERP.t8('The database #1 has been successfully deleted.', db) | html %]</p> |
7 | 7 |
|
8 |
<p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]</p> |
|
8 |
<p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]</p> |
templates/webpages/admin/dbupgrade_all_done.html | ||
---|---|---|
10 | 10 |
<p>[% 'All database upgrades have been applied.' | $T8 %]</p> |
11 | 11 |
[% END %] |
12 | 12 |
|
13 |
<p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]</p> |
|
13 |
<p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]</p> |
templates/webpages/admin/delete_dataset.html | ||
---|---|---|
18 | 18 |
<input type="hidden" name="dbpasswd" value="[% HTML.escape(dbpasswd) %]"> |
19 | 19 |
<input type="hidden" name="dbdefault" value="[% HTML.escape(dbdefault) %]"> |
20 | 20 |
|
21 |
<input name="callback" type="hidden" value="controller.pl?action=Admin/list_clients_and_users">
|
|
21 |
<input name="callback" type="hidden" value="controller.pl?action=Admin/show">
|
|
22 | 22 |
|
23 | 23 |
|
24 | 24 |
<input type="hidden" name="nextsub" value="dbdelete"> |
templates/webpages/admin/edit_user.html | ||
---|---|---|
1 |
[%- USE T8 %] |
|
2 | 1 |
[%- USE HTML %] |
3 | 2 |
[%- USE L %][%- USE LxERP -%] |
4 |
<script type="text/javascript"> |
|
5 |
<!-- |
|
6 |
function open_connection_test_window() { |
|
7 |
// host name port user passwd |
|
8 |
var url = "admin.pl?INPUT_ENCODING=UTF-8&action=test_db_connection&" + |
|
9 |
"dbhost=" + encodeURIComponent(get_input_value("user.dbhost")) + "&" + |
|
10 |
"dbport=" + encodeURIComponent(get_input_value("user.dbport")) + "&" + |
|
11 |
"dbname=" + encodeURIComponent(get_input_value("user.dbname")) + "&" + |
|
12 |
"dbuser=" + encodeURIComponent(get_input_value("user.dbuser")) + "&" + |
|
13 |
"dbpasswd=" + encodeURIComponent(get_input_value("user.dbpasswd")) + "&"; |
|
14 |
|
|
15 |
var parm = centerParms(400,300) + ",width=400,height=300,status=yes,scrollbars=yes"; |
|
16 |
|
|
17 |
window.open(url, "_new_generic", parm); |
|
18 |
} |
|
19 |
--> |
|
20 |
</script> |
|
21 |
|
|
22 |
<h1>[% title %]</h1> |
|
23 |
|
|
24 |
<form name="Form" id="Form" method="post" action="admin.pl"> |
|
25 |
<p><a href="admin.pl?action=list_users">[% 'Back' | $T8 %]</a></p> |
|
26 |
|
|
27 |
<table width="100%"> |
|
28 |
<tr valign="top"> |
|
29 |
<td> |
|
30 |
<table> |
|
31 |
<tr> |
|
32 |
<th align="right">[% 'Login Name' | $T8 %]</th> |
|
33 |
<td> |
|
34 |
[%- IF edit %] |
|
35 |
<input type="hidden" id='user.id' name="user.id" value="[% HTML.escape(user.id) %]">[% HTML.escape(user.login) %] |
|
36 |
[%- ELSE %] |
|
37 |
<input name="user.login" value="[% HTML.escape(user.login) %]"> |
|
38 |
[%- END %] |
|
39 |
</td> |
|
40 |
</tr> |
|
41 |
|
|
42 |
<tr> |
|
43 |
<th align="right">[% 'Password' | $T8 %]</th> |
|
44 |
<td>[% IF CAN_CHANGE_PASSWORD %]<input type="password" name="new_password" size="8" value="********">[% ELSE %]********[% END %]</td> |
|
45 |
</tr> |
|
46 |
|
|
47 |
<tr> |
|
48 |
<th align="right">[% 'Name' | $T8 %]</th> |
|
49 |
<td><input name="user.name" size="15" value="[% HTML.escape(user.name) %]"></td> |
|
50 |
</tr> |
|
51 |
|
|
52 |
<tr> |
|
53 |
<th align="right">[% 'E-mail' | $T8 %]</th> |
|
54 |
<td><input name="user.email" size="30" value="[% HTML.escape(user.email) %]"></td> |
|
55 |
</tr> |
|
56 |
|
|
57 |
<tr valign="top"> |
|
58 |
<th align="right">[% 'Signature' | $T8 %]</th> |
|
59 |
<td><textarea name="user.signature" rows="3" cols="35">[% HTML.escape(user.signature) %]</textarea></td> |
|
60 |
</tr> |
|
61 |
|
|
62 |
<tr> |
|
63 |
<th align="right">[% 'Phone' | $T8 %]</th> |
|
64 |
<td><input name="user.tel" size="14" value="[% HTML.escape(user.tel) %]"></td> |
|
65 |
</tr> |
|
66 |
|
|
67 |
<tr> |
|
68 |
<th align="right">[% 'Fax' | $T8 %]</th> |
|
69 |
<td><input name="user.fax" size="14" value="[% HTML.escape(user.fax) %]"></td> |
|
70 |
</tr> |
|
71 |
|
|
72 |
<tr> |
|
73 |
<th align="right">[% 'Company' | $T8 %]</th> |
|
74 |
<td><input name="user.company" size="35" value="[% HTML.escape(user.company) %]"></td> |
|
75 |
</tr> |
|
76 |
|
|
77 |
<tr valign="top"> |
|
78 |
<th align="right">[% 'Address' | $T8 %]</th> |
|
79 |
<td><textarea name="user.address" rows="4" cols="35">[% HTML.escape(user.address) %]</textarea></td> |
|
80 |
</tr> |
|
81 |
|
|
82 |
<tr valign="top"> |
|
83 |
<th align="right">[% 'Tax number' | $T8 %]</th> |
|
84 |
<td><input name="user.taxnumber" size="14" value="[% HTML.escape(user.taxnumber) %]"></td> |
|
85 |
</tr> |
|
86 |
|
|
87 |
<tr valign="top"> |
|
88 |
<th align="right">[% 'Ust-IDNr' | $T8 %]</th> |
|
89 |
<td><input name="user.co_ustid" size="14" value="[% HTML.escape(user.co_ustid) %]"></td> |
|
90 |
</tr> |
|
91 |
|
|
92 |
<tr valign="top"> |
|
93 |
<th align="right">[% 'DUNS-Nr' | $T8 %]</th> |
|
94 |
<td><input name="user.duns" size="14" value="[% HTML.escape(user.duns) %]"></td> |
|
95 |
</tr> |
|
96 |
|
|
97 |
<tr> |
|
98 |
<th align="right">[% 'SEPA creditor ID' | $T8 %]</th> |
|
99 |
<td><input name="user.sepa_creditor_id" size="35" maxlength="35" value="[% HTML.escape(user.sepa_creditor_id) %]"></td> |
|
100 |
</tr> |
|
101 |
</table> |
|
102 |
</td> |
|
103 |
|
|
104 |
<td> |
|
105 |
<table> |
|
106 |
<tr> |
|
107 |
<th align="right">[% 'Date Format' | $T8 %]</th> |
|
108 |
<td>[% L.select_tag('user.dateformat', all_dateformats, default = user.dateformat) %]</td> |
|
109 |
</tr> |
|
110 |
|
|
111 |
<tr> |
|
112 |
<th align="right">[% 'Number Format' | $T8 %]</th> |
|
113 |
<td>[% L.select_tag('user.numberformat', all_numberformats, default = user.numberformat) %]</td> |
|
114 |
</tr> |
|
115 |
|
|
116 |
<tr> |
|
117 |
<th align="right">[% 'Dropdown Limit' | $T8 %]</th> |
|
118 |
<td><input name="user.vclimit" value="[% HTML.escape(user.vclimit) %]"></td> |
|
119 |
</tr> |
|
120 |
|
|
121 |
<tr> |
|
122 |
<th align="right">[% 'Language' | $T8 %]</th> |
|
123 |
<td>[% L.select_tag('user.countrycode', all_countrycodes, title_key = 'title', default = user.countrycode) %]</td> |
|
124 |
</tr> |
|
125 |
|
|
126 |
<tr> |
|
127 |
<th align="right">[% 'Stylesheet' | $T8 %]</th> |
|
128 |
<td>[% L.select_tag('user.stylesheet', all_stylesheets, default = user.stylesheet) %]</td> |
|
129 |
</tr> |
|
130 |
|
|
131 |
<tr> |
|
132 |
<th align="right">[% 'Printer' | $T8 %]</th> |
|
133 |
<td><input name="user.printer" size="20" value="[% HTML.escape(user.printer) %]"></td> |
|
134 |
</tr> |
|
135 |
<tr> |
|
136 |
<th align="right">[% 'Use Templates' | $T8 %]</th> |
|
137 |
<td>[% L.select_tag('usetemplates', all_templates, default = user.templates) %]</td> |
|
138 |
</tr> |
|
139 |
<tr> |
|
140 |
<th align="right">[% 'New Templates' | $T8 %]</th> |
|
141 |
<td><input name="newtemplates"></td> |
|
142 |
</tr> |
|
143 |
<tr> |
|
144 |
<th align="right">[% 'Setup Templates' | $T8 %]</th> |
|
145 |
<td>[% L.select_tag('mastertemplates', all_master_templates, default = 'Standard') %]</td> |
|
146 |
</tr> |
|
147 |
<tr> |
|
148 |
<th align="right">[% 'Setup Menu' | $T8 %]</th> |
|
149 |
<td>[% L.select_tag('user.menustyle', all_menustyles, title_key = 'title', default = user.menustyle) %]</td> |
|
150 |
</tr> |
|
151 |
<tr> |
|
152 |
<th align='right'>[% 'Mandatory Departments' | $T8 %]</th> |
|
153 |
<td> |
|
154 |
<input type='radio' name='user.mandatory_departments' value='0' [% IF !user.mandatory_departments %] checked[% END %]> [% 'No' | $T8 %] |
|
155 |
<input type='radio' name='user.mandatory_departments' value='1' [% IF user.mandatory_departments %] checked[% END %]> [% 'Yes' | $T8 %] |
|
156 |
</td> |
|
157 |
</tr> |
|
158 |
|
|
159 |
<input type="hidden" name="user.templates" value="[% HTML.escape(user.templates) %]"> |
|
160 |
</table> |
|
161 |
</td> |
|
162 |
</tr> |
|
163 |
|
|
164 |
<tr class="listheading"> |
|
165 |
<th colspan="2">[% 'Database' | $T8 %]</th> |
|
166 |
</tr> |
|
167 |
|
|
168 |
<tr> |
|
169 |
<td colspan="2"> |
|
170 |
<table> |
|
171 |
<tr> |
|
172 |
<th align="right">[% 'Driver' | $T8 %]</th> |
|
173 |
<td>PostgreSQL</td> |
|
174 |
<th align="right">[% 'Host' | $T8 %]</th> |
|
175 |
<td><input name="user.dbhost" size="30" value="[% HTML.escape(user.dbhost) %]"></td> |
|
176 |
</tr> |
|
177 |
|
|
178 |
<tr> |
|
179 |
<th align="right">[% 'Dataset' | $T8 %]</th> |
|
180 |
<td><input name="user.dbname" size="15" value="[% HTML.escape(user.dbname) %]"></td> |
|
181 |
<th align="right">[% 'Port' | $T8 %]</th> |
|
182 |
<td><input name="user.dbport" size="4" value="[% HTML.escape(user.dbport) %]"></td> |
|
183 |
</tr> |
|
184 |
|
|
185 |
<tr> |
|
186 |
<th align="right">[% 'Database User' | $T8 %]</th> |
|
187 |
<td><input name="user.dbuser" size="15" value="[% HTML.escape(user.dbuser) %]"></td> |
|
188 |
<th align="right">[% 'Password' | $T8 %]</th> |
|
189 |
<td><input name="user.dbpasswd" type="password" size="10" value="[% HTML.escape(user.dbpasswd) %]"></td> |
|
190 |
</tr> |
|
191 |
|
|
192 |
<tr> |
|
193 |
<td colspan="2"><input type="button" class="submit" onclick="open_connection_test_window();" value="[% 'Test connection' | $T8 %]"></td> |
|
194 |
</tr> |
|
195 |
</table> |
|
196 |
</td> |
|
197 |
</tr> |
|
198 |
|
|
199 |
[% IF edit %] |
|
200 |
<tr><td colspan="2"><hr size="3" noshade></td></tr> |
|
201 |
|
|
202 |
<tr class="listheading"> |
|
203 |
<th colspan="2">[% 'Group membership' | $T8 %]</th> |
|
204 |
</tr> |
|
205 |
|
|
206 |
<tr> |
|
207 |
<td colspan="2">[% 'The user is a member in the following group(s):' | $T8 %]</td> |
|
208 |
</tr> |
|
209 |
|
|
210 |
<tr> |
|
211 |
<td colspan="2">[% FOREACH row = GROUPS %]<a href="admin.pl?action=edit_group&group_id=[% HTML.url(row.id) %]">[% HTML.escape(row.name) %]</a> |
|
212 |
[% UNLESS loop.last %] | [% END %][% END %]</td> |
|
213 |
</tr> |
|
214 |
[% END %] |
|
215 |
|
|
216 |
<tr><td colspan="2"><hr size="3" noshade></td></tr> |
|
217 |
|
|
218 |
</table> |
|
219 |
|
|
220 |
<input name="callback" type="hidden" value="admin.pl?action=list_users"> |
|
221 |
|
|
222 |
<a href="admin.pl?action=list_users">[% 'Back' | $T8 %]</a> |
|
223 |
<input type="hidden" name="action" value="dispatcher"> |
|
224 |
<input type="submit" class="submit" name="action_save_user" value="[% 'Save' | $T8 %]"> |
|
225 |
|
|
226 |
[% IF edit %] |
|
227 |
[% FOREACH row = GROUPS %] |
|
228 |
<input type="hidden" name="new_user_group_ids[]" value="[% HTML.escape(row.id) %]"> |
|
229 |
[% END %] |
|
230 |
<input type="hidden" name="new_user_login" id="new_user_login" value=""> |
|
231 |
<input type="hidden" name="action_save_user_as_new" id="action_save_user_as_new" value=""> |
|
232 |
<input type="button" class="submit" id="save_as_new_button" value="[% 'Save as new' | $T8 %]"> |
|
233 |
[% L.submit_tag("action_delete_user", LxERP.t8('Delete'), confirm=LxERP.t8('Are you sure?')) %] |
|
234 |
<input type="hidden" name="edit" value="1"> |
|
235 |
[% END %] |
|
236 |
|
|
237 |
</form> |
|
238 |
|
|
239 |
<script type="text/javascript"> |
|
240 |
<!-- |
|
241 |
$(document).ready(function() { |
|
242 |
$("#save_as_new_button").click(function() { |
|
243 |
var new_user_login = prompt('[% 'Please enter the login for the new user.' | $T8 %]', ''); |
|
244 |
if (!new_user_login || (new_user_login == '')) |
|
245 |
return; |
|
246 |
|
|
247 |
$("#action_save_user_as_new").val('1'); |
|
248 |
$("#new_user_login").val(new_user_login); |
|
249 |
$("#user_id").val(''); |
|
250 |
$("#Form").submit(); |
|
251 |
}); |
|
252 |
}); |
|
253 |
--> |
|
254 |
</script> |
|
3 |
|
|
4 |
[%- INCLUDE 'common/flash.html' %] |
|
5 |
|
|
6 |
<h1>[% title %]</h1> |
|
7 |
|
|
8 |
<p>[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]</p> |
|
9 |
|
|
10 |
<form method="post" action="controller.pl" id="form"> |
|
11 |
[% L.hidden_tag("user.id", SELF.user.id) %] |
|
12 |
[% L.hidden_tag("action", "") %] |
|
13 |
[%- SET props=SELF.user.config_values %] |
|
14 |
|
|
15 |
<h2>[%- LxERP.t8("Settings") %]</h2> |
|
16 |
|
|
17 |
<table> |
|
18 |
<tr valign="top"> |
|
19 |
<td> |
|
20 |
<table> |
|
21 |
<tr> |
|
22 |
<th align="right">[% LxERP.t8('Login Name') %]</th> |
|
23 |
<td>[% L.input_tag("user.login", SELF.user.login) %]</td> |
|
24 |
</tr> |
|
25 |
|
|
26 |
[%- IF AUTH.can_change_password %] |
|
27 |
<tr> |
|
28 |
<th align="right">[% LxERP.t8("New Password") %]</th> |
|
29 |
<td>[% L.input_tag("new_password", "", type="password") %]</td> |
|
30 |
</tr> |
|
31 |
[%- END %] |
|
32 |
|
|
33 |
<tr> |
|
34 |
<th align="right">[% LxERP.t8("Name") %]</th> |
|
35 |
<td>[% L.input_tag("user.config_values.name", props.name) %]</td> |
|
36 |
</tr> |
|
37 |
|
|
38 |
<tr> |
|
39 |
<th align="right">[% LxERP.t8('E-mail') %]</th> |
|
40 |
<td>[% L.input_tag("user.config_values.email", props.email) %]</td> |
|
41 |
</tr> |
|
42 |
|
|
43 |
<tr valign="top"> |
|
44 |
<th align="right">[% LxERP.t8('Signature') %]</th> |
|
45 |
<td>[% L.textarea_tag("user.config_values.signature", props.signature, rows=3, cols=35) %]</td> |
|
46 |
</tr> |
|
47 |
|
|
48 |
<tr> |
|
49 |
<th align="right">[% LxERP.t8('Phone') %]</th> |
|
50 |
<td>[% L.input_tag("user.config_values.tel", props.tel) %]</td> |
|
51 |
</tr> |
|
52 |
|
|
53 |
<tr> |
|
54 |
<th align="right">[% LxERP.t8('Fax') %]</th> |
|
55 |
<td>[% L.input_tag("user.config_values.fax", props.fax) %]</td> |
|
56 |
</tr> |
|
57 |
</table> |
|
58 |
</td> |
|
59 |
|
|
60 |
<td> |
|
61 |
<table> |
|
62 |
<tr> |
|
63 |
<th align="right">[% LxERP.t8("Date Format") %]</th> |
|
64 |
<td>[% L.select_tag("user.config_values.dateformat", SELF.all_dateformats, default=props.dateformat) %]</td> |
|
65 |
</tr> |
|
66 |
|
|
67 |
<tr> |
|
68 |
<th align="right">[% LxERP.t8("Number Format") %]</th> |
|
69 |
<td>[% L.select_tag("user.config_values.numberformat", SELF.all_numberformats, default=props.numberformat) %]</td> |
|
70 |
</tr> |
|
71 |
|
|
72 |
<tr> |
|
73 |
<th align="right">[% LxERP.t8("Dropdown Limit") %]</th> |
|
74 |
<td>[% L.input_tag("user.config_values.vclimit", props.vclimit) %]</td> |
|
75 |
</tr> |
|
76 |
|
|
77 |
<tr> |
|
78 |
<th align="right">[% LxERP.t8("Language") %]</th> |
|
79 |
<td>[% L.select_tag("user.config_values.countrycode", SELF.all_countrycodes, title_key="title", default=props.countrycode) %]</td> |
|
80 |
</tr> |
|
81 |
|
|
82 |
<tr> |
|
83 |
<th align="right">[% LxERP.t8("Stylesheet") %]</th> |
|
84 |
<td>[% L.select_tag("user.config_values.stylesheet", SELF.all_stylesheets, default=props.stylesheet) %]</td> |
|
85 |
</tr> |
|
86 |
|
|
87 |
<tr> |
|
88 |
<th align="right">[% LxERP.t8("Setup Menu") %]</th> |
|
89 |
<td>[% L.select_tag("user.config_values.menustyle", SELF.all_menustyles, title_key="title", default=props.menustyle) %]</td> |
|
90 |
</tr> |
|
91 |
|
|
92 |
<tr> |
|
93 |
<th align="right">[% LxERP.t8("Mandatory Departments") %]</th> |
|
94 |
<td> |
|
95 |
[% L.radio_button_tag('user.config_values.mandatory_departments', value='0', id='user.config_values.mandatory_departments_0', label=LxERP.t8('No'), checked=!props.mandatory_departments) %] |
|
96 |
[% L.radio_button_tag('user.config_values.mandatory_departments', value='1', id='user.config_values.mandatory_departments_1', label=LxERP.t8('Yes'), checked= props.mandatory_departments) %] |
|
97 |
</td> |
|
98 |
</tr> |
|
99 |
</table> |
|
100 |
</td> |
|
101 |
</tr> |
|
102 |
</table> |
|
103 |
|
|
104 |
<h2>[%- LxERP.t8("Access to clients") %]</h2> |
|
105 |
|
|
106 |
[% IF SELF.all_clients.size %] |
|
107 |
<p> |
|
108 |
[%- LxERP.t8("This user will have access to the following clients") %]: |
|
109 |
</p> |
|
110 |
|
|
111 |
<div class="clearfix"> |
|
112 |
[% L.select_tag("user.clients[]", SELF.all_clients, id="user_clients", title_key="name", default=SELF.user.clients, default_key='id', multiple=1) %] |
|
113 |
[% L.multiselect2side("user_clients", labelsx => LxERP.t8("All clients"), labeldx => LxERP.t8("Clients this user has access to")) %] |
|
114 |
</div> |
|
115 |
|
|
116 |
[%- ELSE %] |
|
117 |
<p> |
|
118 |
[% LxERP.t8("No clients have been created yet.") %] |
|
119 |
</p> |
|
120 |
[%- END %] |
|
121 |
|
|
122 |
<h2>[%- LxERP.t8("Group membership") %]</h2> |
|
123 |
|
|
124 |
[% IF SELF.all_groups.size %] |
|
125 |
<p> |
|
126 |
[%- LxERP.t8("This user is a member in the following groups") %]: |
|
127 |
</p> |
|
128 |
|
|
129 |
<div class="clearfix"> |
|
130 |
[% L.select_tag("user.groups[]", SELF.all_groups, id="user_groups", title_key="name", default=SELF.user.groups, default_key='id', multiple=1) %] |
|
131 |
[% L.multiselect2side("user_groups", labelsx => LxERP.t8("All groups"), labeldx => LxERP.t8("Groups this user is a member in")) %] |
|
132 |
</div> |
|
133 |
|
|
134 |
[%- ELSE %] |
|
135 |
<p> |
|
136 |
[% LxERP.t8("No groups have been created yet.") %] |
|
137 |
</p> |
|
138 |
[%- END %] |
|
139 |
|
|
140 |
<hr size="3" noshade> |
|
141 |
|
|
142 |
<p> |
|
143 |
[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %] |
|
144 |
|
|
145 |
[% L.button_tag("submit_with_action('save_user')", LxERP.t8("Save")) %] |
|
146 |
[% IF SELF.user.id %] |
|
147 |
[% L.button_tag("save_as_new()", LxERP.t8("Save as new")) %] |
|
148 |
[% L.button_tag("submit_with_action('delete_user')", LxERP.t8("Delete"), confirm=LxERP.t8("Are you sure?")) %] |
|
149 |
[%- END %] |
|
150 |
</p> |
|
151 |
|
|
152 |
</form> |
|
153 |
|
|
154 |
<script type="text/javascript"> |
|
155 |
<!-- |
|
156 |
function submit_with_action(action) { |
|
157 |
$("#action").val("Admin/" + action); |
|
158 |
$("#form").submit(); |
|
159 |
} |
|
160 |
|
|
161 |
function save_as_new() { |
|
162 |
var new_user_login = prompt("[% LxERP.t8("Please enter the login for the new user.") %]", ""); |
|
163 |
if (!new_user_login) |
|
164 |
return; |
|
165 |
|
|
166 |
$("#user_login").val(new_user_login); |
|
167 |
$("#user_id").val(""); |
|
168 |
submit_with_action("save_user"); |
|
169 |
} |
|
170 |
--> |
|
171 |
</script> |
templates/webpages/admin/list_users.html | ||
---|---|---|
1 |
[%- USE T8 %] |
|
2 |
[%- USE HTML %][%- USE LxERP -%][%- USE L -%] |
|
3 |
<h1>[% title %]</h1> |
|
4 |
|
|
5 |
<form method="post" action="admin.pl"> |
|
6 |
|
|
7 |
<div class="tabwidget"> |
|
8 |
<ul> |
|
9 |
<li><a href="#client_list">[%- LxERP.t8("Client list") %]</a></li> |
|
10 |
<li><a href="#user_list">[%- LxERP.t8("User list") %]</a></li> |
|
11 |
</ul> |
|
12 |
|
|
13 |
<div id="client_list"> |
|
14 |
[%- IF !CLIENTS.size %] |
|
15 |
<p> |
|
16 |
[% LxERP.t8("No clients have been created yet.") %] |
|
17 |
[% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %] |
|
18 |
</p> |
|
19 |
|
|
20 |
[%- ELSE %] |
|
21 |
<table width="100%"> |
|
22 |
<tr> |
|
23 |
<th class="listtop">[% 'Client name' | $T8 %]</th> |
|
24 |
<th class="listtop">[% 'Database ID' | $T8 %]</th> |
|
25 |
<th class="listtop">[% 'Database name' | $T8 %]</th> |
|
26 |
<th class="listtop">[% 'Database Host' | $T8 %]</th> |
|
27 |
<th class="listtop">[% 'Database User' | $T8 %]</th> |
|
28 |
</tr> |
|
29 |
|
|
30 |
[%- FOREACH client = CLIENTS %] |
|
31 |
<tr class="listrow"> |
|
32 |
<td><a href="admin.pl?action=edit_client&client.id=[% HTML.url(client.id) %]">[% HTML.escape(client.name) %]</a></td> |
|
33 |
<td>[% HTML.escape(client.id) %]</td> |
|
34 |
<td>[% HTML.escape(client.dbname) %]</td> |
|
35 |
<td>[% HTML.escape(client.dbhost) %][% IF client.dbport %]:[%- HTML.escape(client.dbport) %][%- END %]</td> |
|
36 |
<td>[% HTML.escape(client.dbuser) %]</td> |
|
37 |
</tr> |
|
38 |
[%- END %] |
|
39 |
</table> |
|
40 |
[%- END %] |
|
41 |
</div> |
|
42 |
|
|
43 |
<div id="user_list"> |
|
44 |
[%- IF !USERS.size %] |
|
45 |
<p> |
|
46 |
[% LxERP.t8("No users have been created yet.") %] |
|
47 |
[% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %] |
|
48 |
</p> |
|
49 |
|
|
50 |
[%- ELSE %] |
|
51 |
<table width="100%"> |
|
52 |
<tr> |
|
53 |
<th class="listtop">[% 'Login Name' | $T8 %]</th> |
|
54 |
<th class="listtop">[% 'Name' | $T8 %]</th> |
|
55 |
<th class="listtop">[% 'Language' | $T8 %]</th> |
|
56 |
</tr> |
|
57 |
|
|
58 |
[% FOREACH user = USERS %] |
|
59 |
[%- SET config = user.config_values %] |
|
60 |
<tr class="listrow"> |
|
61 |
<td><a href="admin.pl?action=edit&user.id=[% HTML.url(user.id) %]">[% HTML.escape(user.login) %]</a></td> |
|
62 |
<td>[% HTML.escape(config.name) %]</td> |
|
63 |
<td>[% HTML.escape(config.countrycode) %]</td> |
|
64 |
</tr> |
|
65 |
[% END %] |
|
66 |
</table> |
|
67 |
[%- END %] |
|
68 |
</div> |
|
69 |
</div> |
|
70 |
|
|
71 |
[% L.link(SELF.url_for(action="add_client"), LxERP.t8("Add Client")) %] |
|
72 |
<span class="link_separator">|</span> |
|
73 |
[% L.link(SELF.url_for(action="add_user"), LxERP.t8("Add User")) %] |
|
74 |
<span class="link_separator">|</span> |
|
75 |
[% L.link(SELF.url_for(action="edit_groups"), LxERP.t8("Edit groups")) %] |
|
76 |
<span class="link_separator">|</span> |
|
77 |
[% L.link(SELF.url_for(action="pg_database_administration", controller="admin.pl"), LxERP.t8("Pg Database Administration")) %] |
|
78 |
<span class="link_separator">|</span> |
|
79 |
[% L.link(SELF.url_for(action="printer_management", controller="admin.pl"), LxERP.t8("Printer Management")) %] |
|
80 |
<span class="link_separator">|</span> |
|
81 |
[% IF LOCKED %] |
|
82 |
[% L.link(SELF.url_for(action="unlock_system"), LxERP.t8("Unlock System")) %] |
|
83 |
[% ELSE %] |
|
84 |
[% L.link(SELF.url_for(action="lock_system"), LxERP.t8("Lock System")) %] |
|
85 |
[% END %] |
|
86 |
<span class="link_separator">|</span> |
|
87 |
[% L.link(SELF.url_for(action="logout"), LxERP.t8("Logout")) %] |
|
88 |
|
|
89 |
<div style="background-color: #FFFFDA; font-size: 12px; padding: 0.5em; max-width: 720px; margin: 1em;"> |
|
90 |
<p>[% 'Click on login name to edit!' | $T8 %]</p> |
|
91 |
<p>[% 'To add a user to a group edit a name, change the login name and save. A new user with the same variables will then be saved under the new login name.' | $T8 %]</p> |
|
92 |
</div> |
|
93 |
</form> |
|
94 |
|
|
95 |
<hr> |
|
96 |
|
|
97 |
<h2>[% 'User Login' | $T8 %]</h2> |
|
98 |
|
|
99 |
<form method="post" action="controller.pl"> |
|
100 |
<input type="hidden" name="action" value="LoginScreen/login"> |
|
101 |
|
|
102 |
<table border="0"> |
|
103 |
<tr> |
|
104 |
<th align="right">[% 'Login Name' | $T8 %]</th> |
|
105 |
<td><input class="login" name="{AUTH}login"></td> |
|
106 |
<td> </td> |
|
107 |
</tr> |
|
108 |
<tr> |
|
109 |
<th align="right">[% 'Password' | $T8 %]</th> |
|
110 |
<td><input class="login" type="password" name="{AUTH}password"></td> |
|
111 |
<td><input type="submit" value="[% 'Login' | $T8 %]"></td> |
|
112 |
</tr> |
|
113 |
</table> |
|
114 |
|
|
115 |
</form> |
templates/webpages/admin/restore_dataset_start_footer.html | ||
---|---|---|
10 | 10 |
</p> |
11 | 11 |
|
12 | 12 |
<p> |
13 |
[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]
|
|
13 |
[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]
|
|
14 | 14 |
</p> |
templates/webpages/admin/show.html | ||
---|---|---|
1 |
[%- USE HTML %][%- USE LxERP -%][%- USE L -%] |
|
2 |
|
|
3 |
[% INCLUDE 'common/flash.html' %] |
|
4 |
|
|
5 |
<h1>[% title %]</h1> |
|
6 |
|
|
7 |
<div> |
|
8 |
[% LxERP.t8("Actions") %]: |
|
9 |
<span class="link_separator"></span> |
|
10 |
[% L.link(SELF.url_for(action="new_client"), LxERP.t8("Add Client")) %] |
|
11 |
<span class="link_separator">|</span> |
|
12 |
[% L.link(SELF.url_for(action="new_user"), LxERP.t8("Add User")) %] |
|
13 |
<span class="link_separator">|</span> |
|
14 |
[% L.link(SELF.url_for(action="edit_groups"), LxERP.t8("Edit groups")) %] |
|
15 |
<span class="link_separator">|</span> |
|
16 |
[% L.link(SELF.url_for(action="pg_database_administration", controller="admin.pl"), LxERP.t8("Pg Database Administration")) %] |
|
17 |
<span class="link_separator">|</span> |
|
18 |
[% L.link(SELF.url_for(action="printer_management", controller="admin.pl"), LxERP.t8("Printer Management")) %] |
|
19 |
<span class="link_separator">|</span> |
|
20 |
[% IF LOCKED %] |
|
21 |
[% L.link(SELF.url_for(action="unlock_system"), LxERP.t8("Unlock System")) %] |
|
22 |
[% ELSE %] |
|
23 |
[% L.link(SELF.url_for(action="lock_system"), LxERP.t8("Lock System")) %] |
|
24 |
[% END %] |
|
25 |
<span class="link_separator">|</span> |
|
26 |
[% L.link(SELF.url_for(action="logout"), LxERP.t8("Logout")) %] |
|
27 |
<span class="link_separator">|</span> |
|
28 |
[% L.link(SELF.url_for(controller="LoginScreen", action="user_login"), LxERP.t8("To user login")) %] |
|
29 |
</div> |
|
30 |
|
|
31 |
<hr> |
|
32 |
|
|
33 |
<div class="tabwidget"> |
|
34 |
<ul> |
|
35 |
<li><a href="#user_list">[%- LxERP.t8("User list") %]</a></li> |
|
36 |
<li><a href="#client_list">[%- LxERP.t8("Client list") %]</a></li> |
|
37 |
</ul> |
|
38 |
|
|
39 |
<div id="user_list"> |
|
40 |
[%- IF !USERS.size %] |
|
41 |
<p> |
|
42 |
[% LxERP.t8("No users have been created yet.") %] |
|
43 |
[% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %] |
|
44 |
</p> |
|
45 |
|
|
46 |
[%- ELSE %] |
|
47 |
<table width="100%"> |
|
48 |
<tr> |
|
49 |
<th class="listtop">[% LxERP.t8('Login Name') %]</th> |
|
50 |
<th class="listtop">[% LxERP.t8('Name') %]</th> |
|
51 |
<th class="listtop">[% LxERP.t8('Language') %]</th> |
|
52 |
</tr> |
|
53 |
|
|
54 |
[% FOREACH user = USERS %] |
|
55 |
[%- SET config = user.config_values %] |
|
56 |
<tr class="listrow"> |
|
57 |
<td>[% L.link(SELF.url_for(action="edit_user", id=user.id), HTML.escape(user.login)) %]</td> |
|
58 |
<td>[% HTML.escape(config.name) %]</td> |
|
59 |
<td>[% HTML.escape(config.countrycode) %]</td> |
|
60 |
</tr> |
|
61 |
[% END %] |
|
62 |
</table> |
|
63 |
[%- END %] |
|
64 |
</div> |
|
65 |
|
|
66 |
<div id="client_list"> |
|
67 |
[%- IF !CLIENTS.size %] |
|
68 |
<p> |
|
69 |
[% LxERP.t8("No clients have been created yet.") %] |
|
70 |
[% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %] |
|
71 |
</p> |
|
72 |
|
|
73 |
[%- ELSE %] |
|
74 |
<table width="100%"> |
|
75 |
<tr> |
Auch abrufbar als: Unified diff
Admin: Anlegen, Bearbeiten und Löschen von Usern im Admin-Controller
Dazu auch "ON DELETE CASCADE" für alle foreign keys in auth.*
Fixt #2279, #2280.