From dbc6dbd7e146649a8ef0d2f0c7132774cb22bac9 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Wed, 9 Jul 2014 19:40:43 +0000
Subject: [PATCH 01/67] Brazilian translations from Guilherme Rocha
guilherme-at-gf7.com.br
---
calendar/lang/egw_pt-br.lang | 93 +++++++++++++++++++++++++++++++++++
etemplate/lang/egw_pt-br.lang | 1 -
2 files changed, 93 insertions(+), 1 deletion(-)
diff --git a/calendar/lang/egw_pt-br.lang b/calendar/lang/egw_pt-br.lang
index ee29e879a5..4f985c2970 100644
--- a/calendar/lang/egw_pt-br.lang
+++ b/calendar/lang/egw_pt-br.lang
@@ -1,23 +1,37 @@
%1 %2 in %3 calendar pt-br %1 %2 em %3
+%1 days calendar pt-br % 1 dias
+%1 event(s) %2 calendar pt-br % 1 evento (s) 2%
+%1 hours calendar pt-br % uma hora
+%1 minutes calendar pt-br % 1 minuto
%1 records imported calendar pt-br %1 registro(s) importado(s)
%1 records read (not yet imported, you may go back and uncheck test import) calendar pt-br %1 registro(s) lido(s) (não importado(s) ainda. Você deve voltar e desmarcar "Testar Importação")
%1 weeks calendar pt-br %1 semanas
+%s the event calendar pt-br % Do evento
+(%1 events in %2 seconds) calendar pt-br (% 1% 2 eventos em segundos)
+(empty = use global limit, no = no export at all) admin pt-br (= Vazias usar limite global, não = nenhuma exportação em tudo)
+, exceptions preserved calendar pt-br , Exceções preservados
+, stati of participants reset calendar pt-br , Estado de participantes redefinir
please note: the calendar use the holidays of your country, which is set to %1. you can change it in your %2. holidays are %3 automatic installed from %4. you can changed it in %5. calendar pt-br Atenção: A Agenda usa os feriados de seu país, que está configurado como %1. Você pode alterá-lo em %2. Feriados são %3 automaticamente instalados de %4. Você pode alterar isso em %5.
a non blocking event will not conflict with other events calendar pt-br Um evento não bloqueador não irá conflitar com outros eventos
accept calendar pt-br aceitar
accept or reject an invitation calendar pt-br Aceitar ou rejeitar um convite
accepted calendar pt-br Aceito
access denied to the calendar of %1 !!! calendar pt-br Acesso negado à agenda de %1
+access to calendar of %1 denied! calendar pt-br Acesso ao calendário de 1% negada!
action that caused the notify: added, canceled, accepted, rejected, ... calendar pt-br Ação que provocou a notificação: (Adicionada, Cancelada, Aceita, Rejeitada, ...)
actions calendar pt-br Ações
actions... calendar pt-br Ações...
add alarm calendar pt-br Adicionar aviso
+add current view as favorite calendar pt-br Adicionar visão atual como favorita
+add new alarm calendar pt-br Adicionar novo alarme
+add new participants or resource calendar pt-br Adicionar novos participantes ou recurso
add timesheet entry calendar pt-br Adicionar registro à planilha de tempo
added calendar pt-br Adicionado
added by synchronisation calendar pt-br Adicionado por sincronização
after calendar pt-br após
after %1 calendar pt-br Após %1
after current date calendar pt-br Após data atual
+age: calendar pt-br Idade:
alarm calendar pt-br Alarme
alarm added calendar pt-br Alarme adicionado
alarm deleted calendar pt-br Alarme removido
@@ -27,26 +41,39 @@ alarms calendar pt-br Alarmes
all categories calendar pt-br Todas as categorias
all day calendar pt-br Todo o dia
all events calendar pt-br Todos os eventos
+all exceptions are converted into single events. calendar pt-br Todas as exceções são convertidos em eventos individuais.
all future calendar pt-br Todos futuros
+all incl. rejected calendar pt-br Todos incl. rejeitado
all participants calendar pt-br Todos os participantes
allows to edit the event again calendar pt-br Permite editar o evento novamente
always calendar pt-br sempre
apply the changes calendar pt-br aplicar as alterações
are you sure you want to delete this country ? calendar pt-br Você tem certeza que deseja remover este país?
are you sure you want to delete this holiday ? calendar pt-br Você tem certeza que deseja remover este feriado ?
+automatically purge old events after admin pt-br Purgar automaticamente eventos antigos depois
back half a month calendar pt-br voltar metade de um mês
back one month calendar pt-br voltar um mês
+back one year calendar pt-br Voltar um ano
+before calendar pt-br Antes
before %1 calendar pt-br Antes %1
before current date calendar pt-br Antes da data atual
before the event calendar pt-br antes do evento
birthday calendar pt-br Aniversário
birthdays admin pt-br Aniversários
+birthdays only calendar pt-br Só Aniversários
+both, holidays and birthdays calendar pt-br Ambos, feriados e aniversários
busy calendar pt-br ocupado
by calendar pt-br por
+calendar - list calendar pt-br Calendário - Lista
+calendar - multi-weekly calendar pt-br Calendário - multi semana
+calendar - planner calendar pt-br Calendário - Planner
calendar csv export calendar pt-br Exportar Agenda em CVS
calendar event calendar pt-br Evento da Agenda
calendar fields: calendar pt-br Campos da Agenda:
calendar holiday management admin pt-br Gerenciamento de feriados da Agenda
+calendar ical export calendar pt-br Calendário exportação iCal
+calendar ical import calendar pt-br Importação calendário iCal
+calendar id calendar pt-br Calendário ID
calendar menu calendar pt-br Menu da Agenda
calendar preferences calendar pt-br Preferências da Agenda
calendar settings admin pt-br Configurações da Agenda
@@ -54,37 +81,57 @@ calendar-fieldname calendar pt-br Agenda-Nome do Campo
can't add alarms in the past !!! calendar pt-br Não é possível incluir alarmes no passado !!
can't aquire lock! calendar pt-br Não foi possível acesso exclusivo ao registro!
canceled calendar pt-br Cancelado
+category %1 removed because of missing rights calendar pt-br Categoria% 1 removido por causa de direitos perdidos
+category acl common pt-br Categoria ACL
+chair calendar pt-br Cadeira
+change history calendar pt-br Mudar a história
+change your status calendar pt-br Alterar seu status
charset of file calendar pt-br Charset do arquivo
check all calendar pt-br Verificar todos
choose a category calendar pt-br Escolha uma categoria
close the window calendar pt-br Fechar a janela
compose a mail to all participants after the event is saved calendar pt-br compor um e-mail para todos os participantes após o evento ser salvo
+conflict calendar pt-br Conflito
copy of: calendar pt-br Copiar para:
copy this event calendar pt-br Copiar este evento
copy your changes to the clipboard, %1reload the entry%2 and merge them. calendar pt-br Copiar suas alterações para a área de transferência, %1recarregar o registro%2 e mesclá-los.
countries calendar pt-br Países
country calendar pt-br País
+create a new series calendar pt-br Criar uma nova série
create an exception for the given date calendar pt-br Criar uma exceção para a data informada
+create an infolog from this event calendar pt-br Criar um Infolog deste evento
create exception calendar pt-br Criar exceção
+create links for participants from addressbook calendar pt-br Criar ligações para participantes de endereços
create new links calendar pt-br Criar novos links
created calendar pt-br Criado
creator calendar pt-br Criador
csv calendar pt-br CSV
csv-fieldname calendar pt-br CVS-Nome do Campo
csv-filename calendar pt-br CVS-Nome do arquivo
+custom calendar pt-br Personalizado
custom fields common pt-br Campos Personalizados
+custom_2 common pt-br Free / Busy
daily calendar pt-br Diária
+daily tables calendar pt-br Tabelas diárias
+data exchange settings calendar pt-br Configurações de troca de dados
day calendar pt-br Dia
+day of week tables calendar pt-br Dia de tabelas semana
days calendar pt-br dias
days of the week for a weekly repeated event calendar pt-br Dias da semana para um evento semanal recorrrente
days repeated calendar pt-br dias repetidos
dayview calendar pt-br Visão diária
+default alarm for regular events calendar pt-br Alarme padrão para eventos regulares
+default alarm for whole-day events calendar pt-br Alarme padrão para eventos de todo o dia
default appointment length (in minutes) calendar pt-br duração padrão do compromisso (em minutos)
default calendar filter calendar pt-br Filtro padrão da agenda
default calendar view calendar pt-br Visualização padrão da agenda
+default document to insert entries calendar pt-br Documento padrão para inserir entradas
default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar pt-br Duração padrão dos novos compromissos. A duração é em minutos, ex. 60 para 1 hora
+default type of resources selection calendar pt-br Tipo padrão de seleção de recursos
default week view calendar pt-br Visualização semanal padrão
delegated calendar pt-br designado
+delete exceptions calendar pt-br Excluir exceções
+delete selected events calendar pt-br Excluir eventos selecionados
delete series calendar pt-br Remover série
delete this alarm calendar pt-br Remover este alarme
delete this event calendar pt-br Remover este evento
@@ -114,23 +161,32 @@ enddate / -time of the meeting, eg. for more then one day calendar pt-br Data Fi
enddate of the export calendar pt-br Data Final da exportação
ends calendar pt-br termina
error adding the alarm calendar pt-br Erro adicionando o alarme
+error saving the event! calendar pt-br Erro salvando o evento!
+error: can't delete original series! calendar pt-br Erro: Não é possível excluir série original!
error: importing the ical calendar pt-br Erro importanto o iCal
error: no participants selected !!! calendar pt-br Erro: nenhum participante selecionado !!
error: saving the event !!! calendar pt-br Erro salvando o evento
error: starttime has to be before the endtime !!! calendar pt-br Erro: horário de início deve ser anterior ao horário de término
error: the entry has been updated since you opened it for editing! calendar pt-br Erro: O registro foi atualizado desde que você o abriu para edição!
+error: you can't shift a series from the past! calendar pt-br Erro: Você não pode mudar uma série do passado!
event copied - the copy can now be edited calendar pt-br Evento copiado - agora a cópia pode ser editada
event deleted calendar pt-br Evento removido
event details follow calendar pt-br Seguem detalhes do evento
event saved calendar pt-br Evento salvo
event will occupy the whole day calendar pt-br Evento irá ocupar todo o dia
+every user can invite other users and groups admin pt-br Cada usuário pode convidar outros usuários e grupos
exception calendar pt-br Exceção
exception created - you can now edit or delete it calendar pt-br Exceção criada - você agora pode editá-la ou removê-la
exceptions calendar pt-br Exceções
execute a further action for this entry calendar pt-br Executar uma outra ação para este registro
existing links calendar pt-br Links existentes
+exists calendar pt-br Existe
+export definition to use for nextmatch export calendar pt-br Definição Exportar para usar para exportação NextMatch
+exports events from your calendar in ical format. calendar pt-br Exportações eventos do Calendário em formato iCal.
+exports events from your calendar into a csv file. calendar pt-br Exportações eventos de seu calendário em um arquivo CSV.
extended calendar pt-br Extendido
extended updates always include the complete event-details. ical's can be imported by certain other calendar-applications. calendar pt-br Atualizações extendidas sempre incluem os detalhes completos do evento. iCals podem ser importados por certos aplicativos de calendários
+favorites calendar pt-br Favoritos
fieldseparator calendar pt-br Separador de campos
filemanager calendar pt-br Gerenciador de Arquivos
filename calendar pt-br Nome do arquivo
@@ -143,22 +199,27 @@ for which views should calendar show distinct lines with a fixed time interval.
format of event updates calendar pt-br Formato de atualizção de eventos
forward half a month calendar pt-br avançar metade de um mês
forward one month calendar pt-br avançar um mês
+forward one year calendar pt-br Encaminhar um ano
four days view calendar pt-br Visão de 4 dias
+freebusy common pt-br Free / Busy
freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar pt-br Disponibilidade: Usuário '%1' desconhecido, senha incorreta ou não disponível para os usuários acessando o sistema.
freetime search calendar pt-br Procurar disponibilidade
fri calendar pt-br Sex
full description calendar pt-br Descrição Completa
fullname of person to notify calendar pt-br Nome completo da pessoa a ser notificada
general fields: calendar pt-br Campos gerais:
+general settings calendar pt-br Definições gerais
global categories calendar pt-br Categorias Globais
global public and group public calendar pt-br Público global e Grupo público
global public only calendar pt-br Público global somente
group invitation calendar pt-br Convite de grupo
group planner calendar pt-br Planejamento do Grupo
group public only calendar pt-br Grupo público somente
+group(s) or user(s) to show calendar pt-br Grupo (s) ou o utilizador (s) para mostrar
groupmember(s) %1 not included, because you have no access. calendar pt-br Membro(s) %1 não incluído(s), pois você não tem acesso.
h calendar pt-br h
here is your requested alarm. calendar pt-br Aqui está o alarme solicitado
+hide private events calendar pt-br Ocultar eventos privados
hide private infos calendar pt-br Ocultar informações privadas
high priority calendar pt-br Alta prioridade
history calendar pt-br Histórico
@@ -166,10 +227,13 @@ history logging admin pt-br Registro de histórico
holiday calendar pt-br Feriado
holiday management calendar pt-br Gerenciamento de Feriados
holidays calendar pt-br Feriados
+holidays only calendar pt-br Feriados só
hours calendar pt-br horas
how far to search (from startdate) calendar pt-br até onde procurar (da data de início)
how many minutes should each interval last? calendar pt-br Quantos minutos cada intervalo deverá durar ?
how many weeks should the multiple week view show? calendar pt-br Quantas semanas a exibição múltipla deve mostrar?
+how much entries to skip calendar pt-br Como entradas muito para pular?
+html link to the current record calendar pt-br Link HTML para o registro atual
ical calendar pt-br iCal
ical / rfc2445 calendar pt-br iCal / rfc2445
ical export calendar pt-br exportação iCal
@@ -177,21 +241,31 @@ ical file calendar pt-br arquivo iCal
ical import calendar pt-br importação iCal
ical successful imported calendar pt-br iCal importado com sucesso
if checked holidays falling on a weekend, are taken on the monday after. calendar pt-br Se os feriados coincidirem com o fim de semana, serão transferidos para a próxima segunda-feira.
+if start day differs calendar pt-br Se data de início difere
if you dont set a password here, the information is available to everyone, who knows the url!!! calendar pt-br Se você não configurar uma senha aqui a informação ficará disponível para qualquer um que souber a URL!
ignore conflict calendar pt-br Ignorar conflito
import calendar pt-br Importar
import csv-file common pt-br Importar arquivo-CSV
imports events into your calendar from a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. calendar pt-br Importa eventos em sua Agenda de um arquivo CSV. CSV significa 'Comma Separated Values' ou 'Valores Separados por Vírgulas'. Entretanto na Aba de opções você pode escolher outros separadores.
+initially year aligned calendar pt-br Inicialmente ano alinhado
+insert calendar pt-br Inserir
insert in document calendar pt-br Inserir em documento
interval calendar pt-br Intervalo
invalid email-address "%1" for user %2 calendar pt-br E-mail %1 inválido para o usuário %2
+invitations calendar pt-br Convites
+invite calendar pt-br Convidar
+it can not read timezones from sqlite database %1! calendar pt-br Ele não pode ler fusos horários a partir de banco de dados SQLite% 1!
+keep exceptions calendar pt-br Mantenha exceções
+keep the series unchanged. calendar pt-br Manter a série inalterada.
last calendar pt-br Último
last changed calendar pt-br Última alteração
lastname of person to notify calendar pt-br Sobrenome da pessoa a ser notificada
length of the time interval calendar pt-br Duração do tempo de intervalo
link to view the event calendar pt-br Link para visualizar o evento
links calendar pt-br Links
+links and attached files calendar pt-br Links e arquivos anexados
links, attachments calendar pt-br Links, Anexos
+list of files linked to the current record calendar pt-br Lista de arquivos vinculados ao registro atual
listview calendar pt-br Visão em lista
location calendar pt-br Localização
location to autoload from admin pt-br Local de onde carregar automaticamente
@@ -199,8 +273,13 @@ location, start- and endtimes, ... calendar pt-br Local, Horários de início e
mail all participants calendar pt-br Enviar e-mail para todos os participantes
make freebusy information available to not loged in persons? calendar pt-br Mostrar informação de disponibilidade para pessoas não logadas?
manage mapping calendar pt-br Gerenciar mapeamento
+maximum available quantity of %1 exceeded! calendar pt-br A quantidade máxima disponível de 1% excedido!
+meeting request calendar pt-br Pedido de reunião
+meetingrequest to all participants calendar pt-br Meetingrequest a todos os participantes
+merge document... calendar pt-br Mesclar documento ...
minutes calendar pt-br minutos
modified calendar pt-br Modificado
+modifier calendar pt-br Modifier
mon calendar pt-br Seg
month calendar pt-br Mês
monthly calendar pt-br Mensalmente
@@ -209,24 +288,38 @@ monthly (by day) calendar pt-br mensalmente (por dia)
monthview calendar pt-br Visão mensal
multiple week view calendar pt-br Exibição semanal múltipla
name of current user, all other contact fields are valid too calendar pt-br Nome do usuário atual, todos outros campos são válidos também
+needs action calendar pt-br Necessidades ação
new calendar pt-br Novo
new search with the above parameters calendar pt-br nova pesquisa com os parâmetros acima
+no automatic purging admin pt-br Sem purga automática
no events found calendar pt-br Nenhum evento encontrado
no filter calendar pt-br Sem filtro
no matches found calendar pt-br Nenhum registro encontrado
+no meeting requests calendar pt-br Não há pedidos de reunião
+no owner selected calendar pt-br Nenhum proprietário selecionado.
+no preview for ical calendar pt-br Pré-visualização para iCal
+no recurrence calendar pt-br Sem retorno
no response calendar pt-br Sem resposta
+no rights to export more than %1 entries! calendar pt-br Nenhum direito a exportar mais de 1% entradas!
non blocking calendar pt-br Posse compartilhada
not calendar pt-br não
+not rejected calendar pt-br Não rejeitado
+nothing to update, version is already %1. calendar pt-br Nada de atualização, versão já é% 1.
notification messages for added events calendar pt-br Mensagem para notificação de eventos adicionados
notification messages for canceled events calendar pt-br Mensagem para notificação de eventos cancelados
notification messages for disinvited participants calendar pt-br Mensagem para notificação de participantes desconvidados
notification messages for modified events calendar pt-br Mensagem para notificação de eventos modificados
notification messages for your alarms calendar pt-br Mensagem para notificação de seus alarmes
notification messages for your responses calendar pt-br Mensagem para notificação de suas respostas
+notification settings calendar pt-br Configurações de notificação
+notify non-egroupware users about event updates calendar pt-br Notifique os usuários não eGroupWare sobre atualizações de eventos
number of records to read (%1) calendar pt-br Número de registros a serem lidos (%1)
+number of weeks to show calendar pt-br Número de semanas para mostrar
observance rule calendar pt-br Regra de observância
occurence calendar pt-br Ocorrência
+old fixed definition calendar pt-br Definição fixa Velho
old startdate calendar pt-br Data de Início anterior
+olddate calendar pt-br Data original
on %1 %2 %3 your meeting request for %4 calendar pt-br Em %1%2%3 sua requisição de compromisso para %4
on all modification, but responses calendar pt-br em todas as modificações, menos respostas
on any time change too calendar pt-br em qualquer alteração de horário também
diff --git a/etemplate/lang/egw_pt-br.lang b/etemplate/lang/egw_pt-br.lang
index 75cf082d19..753fb8c6ab 100644
--- a/etemplate/lang/egw_pt-br.lang
+++ b/etemplate/lang/egw_pt-br.lang
@@ -99,7 +99,6 @@ custom fields etemplate pt-br Campos personalizados
custom javascript for onchange etemplate pt-br Javascript personalizado para OnChange
cut etemplate pt-br Recortar
date+time etemplate pt-br Data+Horário
-datum etemplate pt-br Referência
day etemplate pt-br Dia
days etemplate pt-br Dias
db ensures that every row has a unique value in that column etemplate pt-br O Bando de Dados assegura que cada linha tenha um valor original nessa coluna
From c381aef5e487e97eb62aac46b553f14b2367fc2f Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Thu, 10 Jul 2014 10:30:37 +0000
Subject: [PATCH 02/67] Refresh admin nm after group edit/delete
---
admin/js/app.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/admin/js/app.js b/admin/js/app.js
index e2f5d938f2..7e4aca64c8 100644
--- a/admin/js/app.js
+++ b/admin/js/app.js
@@ -156,14 +156,17 @@ app.classes.admin = AppJS.extend(
if (_id < 0)
{
var tree = this.et2.getWidgetById('tree');
+ var nm = this.et2.getWidgetById('nm');
switch(_type)
{
case 'delete':
tree.deleteItem('/groups/'+_id, false);
+ if (nm) nm.applyFilters();
return false; // --> no regular refresh
default: // add, update, edit, null
tree.refreshItem('/groups');
+ if (nm) nm.applyFilters();
return false; // --> no regular refresh
}
}
From 2871228a0d4b7134d45a35525fac265fde9e9810 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Thu, 10 Jul 2014 16:00:52 +0000
Subject: [PATCH 03/67] Changing group in admin needs to refresh nm group
filter too
---
admin/js/app.js | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/admin/js/app.js b/admin/js/app.js
index 7e4aca64c8..6cd3bf7b9a 100644
--- a/admin/js/app.js
+++ b/admin/js/app.js
@@ -161,14 +161,22 @@ app.classes.admin = AppJS.extend(
{
case 'delete':
tree.deleteItem('/groups/'+_id, false);
- if (nm) nm.applyFilters();
- return false; // --> no regular refresh
+ if (nm) nm.getInstanceManager().submit();
+ break;
default: // add, update, edit, null
- tree.refreshItem('/groups');
- if (nm) nm.applyFilters();
- return false; // --> no regular refresh
+ if (nm)
+ {
+ var activeFilters = nm.activeFilters;
+ nm.getInstanceManager().submit();
+ var nm = this.et2.getWidgetById('nm');
+ nm.applyFilters(activeFilters);
+ }
+
}
+ var refreshTree = this.et2.getWidgetById('tree');
+ if (refreshTree) refreshTree.refreshItem('/groups');
+ return false; // --> no regular refresh
}
// not a user or group, eg. categories
else if (!_id)
From 49789bcf09bd023a4782b5c73a9e714bee3226e4 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Fri, 11 Jul 2014 09:47:43 +0000
Subject: [PATCH 04/67] Fix Gloabl categories owner_popup actions
---
admin/inc/class.admin_categories.inc.php | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/admin/inc/class.admin_categories.inc.php b/admin/inc/class.admin_categories.inc.php
index 1209ceaaeb..1ac2b7daf1 100644
--- a/admin/inc/class.admin_categories.inc.php
+++ b/admin/inc/class.admin_categories.inc.php
@@ -491,6 +491,10 @@ class admin_categories
if(in_array($content['nm']['action'], array('owner')))
{
$action = $content['nm']['action'];
+ if ($content[$action.'_popup'])
+ {
+ $content = array_merge($content,$content[$action.'_popup']);
+ }
$content['nm']['action'] .= '_' . key($content[$action . '_action']);
if(is_array($content[$action]))
From a0bf45da9320bc29bdd27f8f00853398866b7afa Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Fri, 11 Jul 2014 10:38:36 +0000
Subject: [PATCH 05/67] Use getAttribute to get the data-group value to use it
for toolbar sorting.\n\r -Fix group is undefined error opening mail in IE10
---
etemplate/js/et2_widget_toolbar.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/etemplate/js/et2_widget_toolbar.js b/etemplate/js/et2_widget_toolbar.js
index d4c782fc10..41ac30da68 100644
--- a/etemplate/js/et2_widget_toolbar.js
+++ b/etemplate/js/et2_widget_toolbar.js
@@ -266,7 +266,7 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
// ************** Drag and Drop feature for toolbar *****
this.actionlist.find('span').sort( function (lg,g){
- return +lg.dataset.group - +g.dataset.group;
+ return +lg.getAttribute('data-group') - +g.getAttribute('data-group');
}).appendTo(this.actionlist);
this.actionlist.appendTo(this.div);
From 772ebe6a41e408965937bd55208a68a5e8dcd5bb Mon Sep 17 00:00:00 2001
From: Klaus Leithoff
Date: Fri, 11 Jul 2014 11:34:11 +0000
Subject: [PATCH 06/67] improve (failsafe for non matching vartype personal
(array instead of expected string)) imap_rfc822_write_address own fallback
function
---
phpgwapi/inc/common_functions.inc.php | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/phpgwapi/inc/common_functions.inc.php b/phpgwapi/inc/common_functions.inc.php
index f1e9202e08..d703a46316 100755
--- a/phpgwapi/inc/common_functions.inc.php
+++ b/phpgwapi/inc/common_functions.inc.php
@@ -150,6 +150,12 @@ if (!function_exists('imap_rfc822_write_address'))
*/
function imap_rfc822_write_address($mailbox, $host, $personal)
{
+ if (is_array($personal)) {
+ foreach ($personal as $e) {
+ $p .= ($p?' ':'').$e;
+ }
+ $personal = $p;
+ }
//if (!preg_match('/^[!#$%&\'*+/0-9=?A-Z^_`a-z{|}~-]+$/u', $personal)) // that's how I read the rfc(2)822
if ($personal && !preg_match('/^[0-9A-Z -]*$/iu', $personal)) // but quoting is never wrong, so quote more then necessary
{
From a0d6257d1e3706aff51c0ac64caea9e32f45b1fe Mon Sep 17 00:00:00 2001
From: Klaus Leithoff
Date: Fri, 11 Jul 2014 13:49:27 +0000
Subject: [PATCH 07/67] handle message/rfc822 attachments as display when
opened from drafted message; properly restore message/rfc822 attachments
stored with .eml files
---
mail/inc/class.mail_ui.inc.php | 17 +++++++++--------
mail/js/app.js | 1 +
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php
index 6944229939..be17fe8b31 100644
--- a/mail/inc/class.mail_ui.inc.php
+++ b/mail/inc/class.mail_ui.inc.php
@@ -455,10 +455,10 @@ class mail_ui
//$content[self::$nm_index]['path'] = self::get_home_dir();
}
}
- else if ($content['mailPreview']['mailPreviewHeadersAttachments']['previewAttachmentArea'][0]['save_zip'])
- {
- $this->download_zip(current($content[self::$nm_index]['selected']));
- }
+// else if ($content['mailPreview']['mailPreviewHeadersAttachments']['previewAttachmentArea'][0]['save_zip'])
+// {
+// $this->download_zip(current($content[self::$nm_index]['selected']));
+// }
//$content[self::$nm_index]['default_cols'] = 'status,attachments,subject,'.($toSchema?'toaddress':'fromaddress').',date,size'; // I columns to use if there's no user or default pref (! as first char uses all but the named columns), default all columns
$content[self::$nm_index]['default_cols'] = 'status,attachments,subject,address,date,size'; // I columns to use if there's no user or default pref (! as first char uses all but the named columns), default all columns
$content[self::$nm_index]['csv_fields'] = false;
@@ -2100,10 +2100,10 @@ class mail_ui
$rowID = $_requesteddata['id'];
//unset($_REQUEST);
}
- if($_requesteddata['mail_displayattachments'][0]['save_zip'])
- {
- $this->download_zip($_requesteddata['mail_id']);
- }
+// if($_requesteddata['mail_displayattachments'][0]['save_zip'])
+// {
+// $this->download_zip($_requesteddata['mail_id']);
+// }
$preventRedirect=false;
if(isset($_GET['id'])) $rowID = $_GET['id'];
if(isset($_GET['part'])) $partID = $_GET['part'];
@@ -2279,6 +2279,7 @@ class mail_ui
$linkData = array
(
'menuaction' => 'mail.mail_ui.displayMessage',
+ //'mode' => 'display', //message/rfc822 attachments should be opened in display mode
'id' => $rowID,
'part' => $value['partID'],
'is_winmail' => $value['is_winmail']
diff --git a/mail/js/app.js b/mail/js/app.js
index 7c34375633..837047c6fc 100644
--- a/mail/js/app.js
+++ b/mail/js/app.js
@@ -2012,6 +2012,7 @@ app.classes.mail = AppJS.extend(
{
case 'MESSAGE/RFC822':
url += 'menuaction=mail.mail_ui.displayMessage'; // todo compose for Draft folder
+ url += '&mode=display';//message/rfc822 attachments should be opened in display mode
url += '&id='+mailid;
url += '&part='+attgrid.partID;
url += '&is_winmail='+attgrid.winmailFlag;
From 3e56f38995c6695c083f423f631e10259e2c4155 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Fri, 11 Jul 2014 15:52:43 +0000
Subject: [PATCH 08/67] Try to get attribute with getAttribute method, IE does
not support element dataset
---
etemplate/js/et2_extension_customfields.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/etemplate/js/et2_extension_customfields.js b/etemplate/js/et2_extension_customfields.js
index 84638af2b2..bf05e29cc1 100644
--- a/etemplate/js/et2_extension_customfields.js
+++ b/etemplate/js/et2_extension_customfields.js
@@ -583,7 +583,7 @@ var et2_customfields_list = et2_valueWidget.extend([et2_IDetachedDOM, et2_IInput
for(var i = 0; i < _nodes.length; i++)
{
// toggle() needs a boolean to do what we want
- var key = _nodes[i].dataset.field;
+ var key = _nodes[i].getAttribute('data-field');
$j(_nodes[i]).toggle(_values.fields[key] && _values.value[this.prefix + key]?true:false);
}
}
From 8f0dba15fe4d89daef2802a4b7d7b33c9c44b0f1 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Fri, 11 Jul 2014 16:07:02 +0000
Subject: [PATCH 09/67] No need to use Microsoft.XMLDOM for IE anymore, since
IE 7+ supports XMLHttpRequest object
---
etemplate/js/et2_core_xml.js | 31 +------------------------------
1 file changed, 1 insertion(+), 30 deletions(-)
diff --git a/etemplate/js/et2_core_xml.js b/etemplate/js/et2_core_xml.js
index bf6459eaca..5995a34857 100644
--- a/etemplate/js/et2_core_xml.js
+++ b/etemplate/js/et2_core_xml.js
@@ -24,36 +24,7 @@ function et2_loadXMLFromURL(_url, _callback, _context)
_context = null;
}
- // Use the XMLDOM object on IE
- if (window.ActiveXObject)
- {
- var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
-
- // Set the callback function
- xmldoc.onreadystatechange = function() {
- if (xmldoc && xmldoc.readyState == 4)
- {
- // Find the root node - the root node is the node which is not
- // the "xml", not a text node and not a comment node - those nodes
- // are marked with an "#"
- for (var i = 0; i < xmldoc.childNodes.length; i++)
- {
- var nodeName = xmldoc.childNodes[i].nodeName;
- if (nodeName != "xml" && nodeName.charAt(0) != "#")
- {
- // Call the callback function and pass the current node
- _callback.call(_context, xmldoc.childNodes[i]);
- return;
- }
- }
-
- throw("Could not find XML root node.");
- }
- }
-
- xmldoc.load(_url);
- }
- else if (window.XMLHttpRequest)
+ if (window.XMLHttpRequest)
{
// Otherwise make an XMLHttpRequest. Tested with Firefox 3.6, Chrome, Opera
var xmlhttp = new XMLHttpRequest();
From ef9409294c4cb72c96b2168e1ad5c157d77743eb Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Fri, 11 Jul 2014 16:49:45 +0000
Subject: [PATCH 10/67] Try to use xmlDoc.responseText as xmlDoc.response might
not be available in IE
---
etemplate/js/et2_widget_tree.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/etemplate/js/et2_widget_tree.js b/etemplate/js/et2_widget_tree.js
index f48cea78d0..ff039356c9 100644
--- a/etemplate/js/et2_widget_tree.js
+++ b/etemplate/js/et2_widget_tree.js
@@ -193,7 +193,9 @@ var et2_tree = et2_inputWidget.extend(
widget.setImages.apply(widget, widget.options.std_images.split(','));
}
// Add in the callback so we can keep the two in sync
- widget.input.AJAX_callback = function() { widget._dhtmlxtree_json_callback(JSON.parse(this.response), widget.input.lastLoadedXMLId);};
+ widget.input.AJAX_callback = function(dxmlObject) {
+ widget._dhtmlxtree_json_callback(JSON.parse(dxmlObject.xmlDoc.responseText), widget.input.lastLoadedXMLId);
+ };
if (widget.options.autoloading)
{
@@ -538,7 +540,7 @@ var et2_tree = et2_inputWidget.extend(
else
{
this.input.loadJSON(this.egw().link(this.autoloading_url, {id: _id}),
- function() { self._dhtmlxtree_json_callback(JSON.parse(this.response), _id);}
+ function(dxmlObject) {self._dhtmlxtree_json_callback(JSON.parse(dxmlObject.xmlDoc.responseText), _id);}
);
}
},
From 2dd0625ebe064388e62f6100db6327409f7ea194 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Fri, 11 Jul 2014 17:35:46 +0000
Subject: [PATCH 11/67] * Backup: backup could contain rows multiple times
(which caused restore to fail)
---
phpgwapi/inc/class.db_backup.inc.php | 38 ++++++++++++++++++++--------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/phpgwapi/inc/class.db_backup.inc.php b/phpgwapi/inc/class.db_backup.inc.php
index 900bc0ffb3..c33fded96d 100644
--- a/phpgwapi/inc/class.db_backup.inc.php
+++ b/phpgwapi/inc/class.db_backup.inc.php
@@ -7,7 +7,7 @@
* @package api
* @subpackage db
* @author Ralf Becker
- * @copyright (c) 2003-12 by Ralf Becker
+ * @copyright (c) 2003-14 by Ralf Becker
* @version $Id$
*/
@@ -79,6 +79,12 @@ class db_backup
* @var boolean
*/
var $backup_files = false ;
+ /**
+ * Reference to schema_proc's egw_db object
+ *
+ * @var egw_db
+ */
+ var $db;
/**
* Constructor
@@ -278,7 +284,7 @@ class db_backup
/* Sort the files by ctime. */
krsort($files);
$count = 0;
- foreach($files as $ctime => $file)
+ foreach($files as $file)
{
if ($count >= $this->backup_mincount)//
{
@@ -411,6 +417,7 @@ class db_backup
}
$table = False;
$n = 0;
+ $rows = array();
while(!feof($f))
{
$line = trim(fgets($f)); ++$n;
@@ -620,7 +627,6 @@ class db_backup
if($type == 'zip')
{
fclose($f);
- $f = $save_f;
unlink($name);
rmdir($dir.'/database_backup');
}
@@ -723,7 +729,7 @@ class db_backup
$str_pending = False;
$n = 0;
- foreach($fields as $i => $field)
+ foreach($fields as $field)
{
if ($str_pending !== False)
{
@@ -839,12 +845,24 @@ class db_backup
{
if (in_array($table,$this->exclude_tables)) continue; // dont backup
- $total = 0;
+ // do we have a primary key?
+ // --> use it to order and limit rows, to kope with rows being added during backup
+ // otherwise new rows can cause rows being backed up twice and
+ // backups don't restore because of doublicate keys
+ $pk = $schema['pk'] && count($schema['pk']) == 1 ? $schema['pk'][0] : null;
+
+ $total = $max = 0;
do {
$num_rows = 0;
- // querying only chunks for 100 rows, to not run into memory limit on huge tables
- foreach($this->db->select($table, '*', false, __LINE__, __FILE__, $total, '', false, self::ROW_CHUNK) as $row)
+ // querying only chunks for 10000 rows, to not run into memory limit on huge tables
+ foreach($this->db->select($table, '*',
+ empty($pk) ? false : $pk.' > '.$max, // limit by maximum primary key already received
+ __LINE__, __FILE__,
+ empty($pk) ? $total : 0, // if no primary limit by number of received rows
+ empty($pk) ? '' : 'ORDER BY '.$pk.' ASC', // order by primary key
+ false, self::ROW_CHUNK) as $row)
{
+ if (!empty($pk)) $max = $row[$pk];
if ($total === 0) fwrite($f,"\ntable: $table\n".implode(',',array_keys($row))."\n");
array_walk($row,array('db_backup','escape_data'),$schema['fd']);
@@ -870,14 +888,14 @@ class db_backup
//echo $name.' ';
$zip->addFile($name, 'database_backup/'.basename($name));
$count = 1;
- foreach($file_list as $num => $file)
+ foreach($file_list as $file)
{
//echo substr($file,strlen($dir)+1).' ';
//echo $file.' ';
$zip->addFile($file,substr($file,strlen($dir)+1));//,substr($file);
if(($count++) == 100) { // the file descriptor limit
$zip->close();
- if($zip = new ZipArchive()) {
+ if(($zip = new ZipArchive())) {
$zip->open($filename);
$count =0;
}
@@ -1009,7 +1027,7 @@ class db_backup
}
else
{
- if (!$only_vals && $key === 'nullable')
+ if ($key === 'nullable')
{
$def .= $val ? 'True' : 'False';
}
From 6b0ed9111f1235dee6aed7f950eecb60c4f8a50c Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Sat, 12 Jul 2014 08:51:31 +0000
Subject: [PATCH 12/67] * API: fixed broken configuration, causing eg.
ActiveDirectory or LDAP authentication to fail (you need to run Setup >>
Clear cache!) all config vars with names starting with an "a" were returning
false instead there correct value
---
phpgwapi/inc/class.config.inc.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/phpgwapi/inc/class.config.inc.php b/phpgwapi/inc/class.config.inc.php
index a838a8db55..b90ca0efde 100755
--- a/phpgwapi/inc/class.config.inc.php
+++ b/phpgwapi/inc/class.config.inc.php
@@ -309,7 +309,7 @@ class config
return json_decode($str, true);
}
// handling of not serialized strings
- if ($str[0] != 'a' && $str[1] != ':')
+ if ($str[0] != 'a' || $str[1] != ':')
{
return $str;
}
From 930b880347644f0398b1b7cdbdf81554aa760027 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Sat, 12 Jul 2014 10:11:53 +0000
Subject: [PATCH 13/67] fixed fatal error "class errorlog not found"
---
logout.php | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/logout.php b/logout.php
index f0fdedc79d..6c45d62d12 100755
--- a/logout.php
+++ b/logout.php
@@ -36,17 +36,7 @@ if($verified)
$GLOBALS['egw']->hooks->process('logout');
$GLOBALS['egw']->session->destroy($GLOBALS['sessionid'],$GLOBALS['kp3']);
}
-else
-{
- if(is_object($GLOBALS['egw']->log))
- {
- $GLOBALS['egw']->log->write(array(
- 'text' => 'W-VerifySession, could not verify session during logout',
- 'line' => __LINE__,
- 'file' => __FILE__
- ));
- }
-}
+
$GLOBALS['egw']->session->egw_setcookie('eGW_remember','',0,'/');
$GLOBALS['egw']->session->egw_setcookie('sessionid');
$GLOBALS['egw']->session->egw_setcookie('kp3');
From ff1934a51ff5c820a4e2cfbc32943f1729923e65 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Sun, 13 Jul 2014 08:55:48 +0000
Subject: [PATCH 14/67] fixed typo
---
phpgwapi/lang/egw_de.lang | 2 +-
phpgwapi/lang/egw_en.lang | 2 +-
phpgwapi/lang/egw_fi.lang | 2 +-
phpgwapi/lang/egw_fr.lang | 2 +-
phpgwapi/lang/egw_it.lang | 2 +-
phpgwapi/lang/egw_ru.lang | 2 +-
phpgwapi/lang/egw_sk.lang | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/phpgwapi/lang/egw_de.lang b/phpgwapi/lang/egw_de.lang
index f623a9c4bf..5c20ff89bb 100644
--- a/phpgwapi/lang/egw_de.lang
+++ b/phpgwapi/lang/egw_de.lang
@@ -560,7 +560,7 @@ oman common de OMAN
on *nix systems please type: %1 common de Auf *nix Systemen bitte %1 eingeben
on mouse over common de On Maus Over
only private common de nur private
-only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likly not be suppored! groupdav de Wird nur von einigen vollständigen Clients (z.B. von Apple) unterstützt. Wenn Sie eine URL eingeben müssen, wird es vermutlich nicht unterstützt!
+only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likely not be supported! groupdav de Wird nur von einigen vollständigen Clients (z.B. von Apple) unterstützt. Wenn Sie eine URL eingeben müssen, wird es vermutlich nicht unterstützt!
only yours common de nur eigene
oops! you caught us in the middle of system maintainance. common de Hoppla! Sie haben uns in der Mitte einer Systemwartung erwischt.
open common de Öffnen
diff --git a/phpgwapi/lang/egw_en.lang b/phpgwapi/lang/egw_en.lang
index 31cd9debaf..5f7b91d2d7 100644
--- a/phpgwapi/lang/egw_en.lang
+++ b/phpgwapi/lang/egw_en.lang
@@ -560,7 +560,7 @@ oman common en OMAN
on *nix systems please type: %1 common en On *nix systems please type: %1
on mouse over common en On mouse over
only private common en Only private
-only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likly not be suppored! groupdav en Only supported by a few fully conformant clients (eg. from Apple). If you have to enter a URL, it will most likly not be suppored!
+only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likely not be supported! groupdav en Only supported by a few fully conformant clients (eg. from Apple). If you have to enter a URL, it will most likely not be supported!
only yours common en Only yours
oops! you caught us in the middle of system maintainance. common en Oops! You caught us in the middle of system maintenance.
open common en Open
diff --git a/phpgwapi/lang/egw_fi.lang b/phpgwapi/lang/egw_fi.lang
index 955a63e18f..bf34e656df 100644
--- a/phpgwapi/lang/egw_fi.lang
+++ b/phpgwapi/lang/egw_fi.lang
@@ -519,7 +519,7 @@ oman common fi OMAN
on *nix systems please type: %1 common fi *nix-järjestelmissä voit kirjoittaa: %1
on mouse over common fi Hiirellä osoittamalla
only private common fi Vain yksityiset
-only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likly not be suppored! groupdav fi Toiminto tuettu vain muutamissa laitteissa. Jos URL täytyy syöttää, toiminto todennäköisesti ei ole tuettu.
+only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likely not be supported! groupdav fi Toiminto tuettu vain muutamissa laitteissa. Jos URL täytyy syöttää, toiminto todennäköisesti ei ole tuettu.
only yours common fi Vain omat
oops! you caught us in the middle of system maintainance. common fi Hups... Huoltokatko meneillään!
open common fi Avaa
diff --git a/phpgwapi/lang/egw_fr.lang b/phpgwapi/lang/egw_fr.lang
index dd8cefa426..66397b3df3 100644
--- a/phpgwapi/lang/egw_fr.lang
+++ b/phpgwapi/lang/egw_fr.lang
@@ -538,7 +538,7 @@ oman common fr OMAN
on *nix systems please type: %1 common fr Sur les systèmes *nix SVP tapez: %1
on mouse over common fr Sur le relâchement du clic de la souris
only private common fr seulement privés
-only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likly not be suppored! groupdav fr Seulement supporté par les clients pleinement respectueux de la norme (ie. d'Apple). Si vous devez entrer une URL, cela ne sera probablement pas supporté.
+only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likely not be supported! groupdav fr Seulement supporté par les clients pleinement respectueux de la norme (ie. d'Apple). Si vous devez entrer une URL, cela ne sera probablement pas supporté.
only yours common fr Seulement les vôtres
oops! you caught us in the middle of system maintainance. common fr Oups ! Vous êtes arrivé en pleine maintenance système.
open common fr Ouvrir
diff --git a/phpgwapi/lang/egw_it.lang b/phpgwapi/lang/egw_it.lang
index 6ed3a4928f..975fe697f0 100644
--- a/phpgwapi/lang/egw_it.lang
+++ b/phpgwapi/lang/egw_it.lang
@@ -511,7 +511,7 @@ oman common it OMAN
on *nix systems please type: %1 common it Sui sistemi *nix prego digita: %1
on mouse over common it Al passaggio del mouse
only private common it solo privati
-only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likly not be suppored! groupdav it Supportato solo da alcuni client conformi (p.es. Apple). Se devi inserire un URL, con ogni probabilità non sarà supportato!
+only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likely not be supported! groupdav it Supportato solo da alcuni client conformi (p.es. Apple). Se devi inserire un URL, con ogni probabilità non sarà supportato!
only yours common it solo personali
oops! you caught us in the middle of system maintainance. common it Ops! Ci avete presi mentre stiamo facendo lavori di manutenzione!
open common it Apri
diff --git a/phpgwapi/lang/egw_ru.lang b/phpgwapi/lang/egw_ru.lang
index 72c9d14791..17016248c7 100644
--- a/phpgwapi/lang/egw_ru.lang
+++ b/phpgwapi/lang/egw_ru.lang
@@ -536,7 +536,7 @@ oman common ru Оман
on *nix systems please type: %1 common ru В *NIX-системах пожалуйста наберите: %1
on mouse over common ru При наведенном курсоре
only private common ru только личные
-only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likly not be suppored! groupdav ru полностью поддерживается только несколько совместимых клиентов(например от Apple).если вы введёте адрес,то скорей всего не поддерживается!
+only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likely not be supported! groupdav ru полностью поддерживается только несколько совместимых клиентов(например от Apple).если вы введёте адрес,то скорей всего не поддерживается!
only yours common ru только Ваши
oops! you caught us in the middle of system maintainance. common ru Опс! Вы застукали нас прямо во время обслуживания системы.
open common ru Открыть
diff --git a/phpgwapi/lang/egw_sk.lang b/phpgwapi/lang/egw_sk.lang
index f281b8a419..a8f47abdb1 100644
--- a/phpgwapi/lang/egw_sk.lang
+++ b/phpgwapi/lang/egw_sk.lang
@@ -514,7 +514,7 @@ oman common sk OMÁN
on *nix systems please type: %1 common sk Na *NIX systémoch prosím napíšte: %1
on mouse over common sk Pri namierení myši
only private common sk iba súkromné
-only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likly not be suppored! groupdav sk Podporované iba niektorými plne kompatibilnými klientmi (napr. od Apple). Ak musíte zadať URL, pravdepodobne to nebude podporované!
+only supported by a few fully conformant clients (eg. from apple). if you have to enter a url, it will most likely not be supported! groupdav sk Podporované iba niektorými plne kompatibilnými klientmi (napr. od Apple). Ak musíte zadať URL, pravdepodobne to nebude podporované!
only yours common sk iba vaše
oops! you caught us in the middle of system maintainance. common sk Ajajaj! Zastihli ste nás práve počas údržby systému.
open common sk Otvoriť
From 8c6ac14093df554f5eb1b3c7063278665d12ce03 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Sun, 13 Jul 2014 09:01:09 +0000
Subject: [PATCH 15/67] fixed typo
---
addressbook/inc/class.addressbook_groupdav.inc.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addressbook/inc/class.addressbook_groupdav.inc.php b/addressbook/inc/class.addressbook_groupdav.inc.php
index 954ad76a4e..61a052b5bc 100644
--- a/addressbook/inc/class.addressbook_groupdav.inc.php
+++ b/addressbook/inc/class.addressbook_groupdav.inc.php
@@ -1110,7 +1110,7 @@ class addressbook_groupdav extends groupdav_handler
'type' => 'multiselect',
'label' => 'Addressbooks to sync in addition to personal addressbook',
'name' => 'addressbook-home-set',
- 'help' => lang('Only supported by a few fully conformant clients (eg. from Apple). If you have to enter a URL, it will most likly not be suppored!').
+ 'help' => lang('Only supported by a few fully conformant clients (eg. from Apple). If you have to enter a URL, it will most likely not be supported!').
' '.lang('They will be sub-folders in users home (%1 attribute).','CardDAV "addressbook-home-set"').
' '.lang('Select "%1", if your client does not support multiple addressbooks.',lang('Sync all selected into one')).
' '.lang('Select "%1", if your client support groups, eg. OS X or iOS addressbook.',lang('Distribution lists as groups')),
From f011a6c3d1c9257329c6d5e7916dff93c20e4dee Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Sun, 13 Jul 2014 09:14:58 +0000
Subject: [PATCH 16/67] fixed broken regular expression for multiple
comma-separated values (dash in character class has to be last character!)
---
etemplate/js/et2_widget_selectAccount.js | 6 +++---
etemplate/js/et2_widget_selectbox.js | 14 ++++++++++++--
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/etemplate/js/et2_widget_selectAccount.js b/etemplate/js/et2_widget_selectAccount.js
index 8813d4b377..a44e883b86 100644
--- a/etemplate/js/et2_widget_selectAccount.js
+++ b/etemplate/js/et2_widget_selectAccount.js
@@ -291,7 +291,7 @@ var et2_selectAccount = et2_selectbox.extend(
*/
set_value: function(_value)
{
- if(typeof _value == "string" && this.options.multiple && _value.match(/^[,0-9A-Za-z/-_]+$/) !== null)
+ if(typeof _value == "string" && this.options.multiple && _value.match(this._is_multiple_regexp) !== null)
{
_value = _value.split(',');
}
@@ -312,7 +312,7 @@ var et2_selectAccount = et2_selectbox.extend(
// Not having a value to look up causes an infinite loop
if(!search[j]) continue;
-
+
// Options are not indexed, so we must look
for(var i = 0; !found && i < this.options.select_options.length; i++)
{
@@ -748,7 +748,7 @@ var et2_selectAccount = et2_selectbox.extend(
.appendTo(option);
this.egw().link_title('home-accounts', value, function(name) {this.text(name).removeClass("loading");}, label);
},
-
+
/**
* Overwritten attachToDOM metod to modify attachToDOM
*/
diff --git a/etemplate/js/et2_widget_selectbox.js b/etemplate/js/et2_widget_selectbox.js
index da86a058f7..cce0683055 100644
--- a/etemplate/js/et2_widget_selectbox.js
+++ b/etemplate/js/et2_widget_selectbox.js
@@ -423,10 +423,20 @@ var et2_selectbox = et2_inputWidget.extend(
this.set_select_options(this.options.select_options);
},
+ /**
+ * Regular expression, to check string-value contains multiple comma-separated values
+ */
+ _is_multiple_regexp: /^[,0-9A-Za-z/_-]+$/,
+
+ /**
+ * Set value
+ *
+ * @param _value
+ */
set_value: function(_value)
{
if (typeof _value == "number") _value = ""+_value; // convert to string for consitent matching
- if(typeof _value == "string" && this.options.multiple && _value.match(/^[,0-9A-Za-z/-_]+$/) !== null)
+ if(typeof _value == "string" && this.options.multiple && _value.match(this._is_multiple_regexp) !== null)
{
_value = _value.split(',');
}
@@ -915,7 +925,7 @@ var et2_selectbox_ro = et2_selectbox.extend([et2_IDetachedDOM],
if(typeof _value == "string")
{
- _value = _value.match(/^[,0-9A-Za-z]+$/) !== null ? _value.split(',') : [_value];
+ _value = _value.match(this._is_multiple_regexp) !== null ? _value.split(',') : [_value];
}
this.span.empty();
From f11f9937acbd98b7366fc4c68e88004576e486ec Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Sun, 13 Jul 2014 09:38:55 +0000
Subject: [PATCH 17/67] make detection of serialized values more robust, to
allow string like eg. "a:hello"
---
phpgwapi/inc/class.config.inc.php | 7 ++++---
phpgwapi/inc/common_functions.inc.php | 14 ++++++--------
2 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/phpgwapi/inc/class.config.inc.php b/phpgwapi/inc/class.config.inc.php
index b90ca0efde..fc6adbed46 100755
--- a/phpgwapi/inc/class.config.inc.php
+++ b/phpgwapi/inc/class.config.inc.php
@@ -313,17 +313,18 @@ class config
{
return $str;
}
- // handling of old PHP serialized and addslashed prefs
+ // handling of old PHP serialized config values
$data = php_safe_unserialize($str);
if($data === false)
{
- // manually retrieve the string lengths of the serialized array if unserialize failed
+ // manually retrieve the string lengths of the serialized array if unserialize failed (iso / utf-8 conversation)
$data = php_safe_unserialize(preg_replace_callback('!s:(\d+):"(.*?)";!s', function($matches)
{
return 's:'.mb_strlen($matches[2],'8bit').':"'.$matches[2].'";';
}, $str));
}
- return $data;
+ // returning original string, if unserialize failed, eg. for "a:hello"
+ return $data === false ? $str : $data;
}
/**
diff --git a/phpgwapi/inc/common_functions.inc.php b/phpgwapi/inc/common_functions.inc.php
index d703a46316..08c68c1bfc 100755
--- a/phpgwapi/inc/common_functions.inc.php
+++ b/phpgwapi/inc/common_functions.inc.php
@@ -1549,7 +1549,7 @@ function php_safe_unserialize($str)
preg_match('/(^|;|{)[OC]:\d+:"/', $str))
{
error_log(__METHOD__."('$str') contains objects --> return false");
- return false;
+ return null; // null, not false, to not trigger behavior of returning string itself to app code
}
return unserialize($str);
}
@@ -1601,18 +1601,16 @@ if (isset($_SERVER['SCRIPT_FILENAME']) && $_SERVER['SCRIPT_FILENAME'] == __FILE_
*/
function json_php_unserialize($str, $allow_not_serialized=false)
{
- if ($str[0] == 'a' && $str[1] == ':' || $str === 'N;')
+ if (($str[0] == 'a' && $str[1] == ':' || $str === 'N;') &&
+ ($arr = php_safe_unserialize($str)) !== false)
{
- return php_safe_unserialize($str);
+ return $arr;
}
- elseif (!$allow_not_serialized || $str[0] == '[' || $str[0] == '{')
+ if (!$allow_not_serialized || $str[0] == '[' || $str[0] == '{')
{
return json_decode($str, true);
}
- else
- {
- return $str;
- }
+ return $str;
}
/**
From 21bcc81b2182181f9626460ac63bd8deba340082 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Sun, 13 Jul 2014 10:27:46 +0000
Subject: [PATCH 18/67] * Preferences: non-admins were allowed to changed
default, forced or group preferences
---
preferences/inc/class.preferences_settings.inc.php | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/preferences/inc/class.preferences_settings.inc.php b/preferences/inc/class.preferences_settings.inc.php
index c62452b1c0..8bd2544066 100644
--- a/preferences/inc/class.preferences_settings.inc.php
+++ b/preferences/inc/class.preferences_settings.inc.php
@@ -68,7 +68,11 @@ class preferences_settings
{
case 'save':
case 'apply':
- // ToDo: save preferences
+ // check if user has rights to store preferences for $type and $account_id
+ if ($content['old_type'] !== 'user' && !$GLOBALS['egw_info']['user']['apps']['admin'])
+ {
+ throw new egw_exception_no_permission_admin;
+ }
list($type,$account_id) = explode(':', $content['old_type']);
// merge prefs of all tabs together again
$prefs = array();
@@ -463,7 +467,7 @@ class preferences_settings
'default' => 'Default preferences',
'forced' => 'Forced preferences',
);
- if ($GLOBALS['egw_info']['apps']['admin'])
+ if ($GLOBALS['egw_info']['user']['apps']['admin'])
{
$content['type'] = $type;
if (($id = $GLOBALS['egw']->preferences->get_account_id()) != $GLOBALS['egw_info']['user']['account_id'])
From 8a36e40b1094a611f5db7c9f707d2771f42aef6d Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Mon, 14 Jul 2014 09:59:02 +0000
Subject: [PATCH 19/67] Call applyFilters() function instead of setting
directly, which skipped change detection. Fixes selection not cleared when
applying a favorite.
---
etemplate/js/et2_extension_nextmatch.js | 9 ++++++++-
phpgwapi/js/jsapi/app_base.js | 3 +--
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/etemplate/js/et2_extension_nextmatch.js b/etemplate/js/et2_extension_nextmatch.js
index 4e1b9a0ba8..c4e2daac5c 100644
--- a/etemplate/js/et2_extension_nextmatch.js
+++ b/etemplate/js/et2_extension_nextmatch.js
@@ -387,6 +387,14 @@ var et2_nextmatch = et2_DOMWidget.extend([et2_IResizeable, et2_IInput],
* @param _set filter(s) to set eg. { filter: '' } to reset filter in NM header
*/
applyFilters: function(_set) {
+ var changed = false;
+
+ // Cleared explicitly
+ if(typeof _set != 'undefined' && jQuery.isEmptyObject(_set))
+ {
+ changed = true;
+ this.activeFilters = {};
+ }
if(typeof this.activeFilters == "undefined")
{
this.activeFilters = {col_filter: {}};
@@ -396,7 +404,6 @@ var et2_nextmatch = et2_DOMWidget.extend([et2_IResizeable, et2_IInput],
this.activeFilters.col_filter = {};
}
- var changed = false;
if (typeof _set == 'object')
{
for(var s in _set)
diff --git a/phpgwapi/js/jsapi/app_base.js b/phpgwapi/js/jsapi/app_base.js
index 6a95167240..1ed8cf87dd 100644
--- a/phpgwapi/js/jsapi/app_base.js
+++ b/phpgwapi/js/jsapi/app_base.js
@@ -285,8 +285,7 @@ var AppJS = Class.extend(
if(state.state && state.state.search) state.state.search = unescape(state.state.search);
// Apply
- _widget.activeFilters = state.state || state.filter || {};
- _widget.applyFilters();
+ _widget.applyFilters(state.state || state.filter || {});
nextmatched = true;
}, this, et2_nextmatch);
if(nextmatched) return false;
From c54e53d4054fd4a6d1950b8c653c9f3aa6aff9df Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Mon, 14 Jul 2014 10:02:47 +0000
Subject: [PATCH 20/67] fixed PHP Strict Standards: Declaration of
etemplate_widget_*::set_attrs() should be compatible with
etemplate_widget::set_attrs()
---
.../inc/class.etemplate_widget_menupopup.inc.php | 7 ++++---
.../inc/class.etemplate_widget_nextmatch.inc.php | 16 ++++++++++++----
.../inc/class.etemplate_widget_textbox.inc.php | 7 ++++---
.../inc/class.etemplate_widget_tree.inc.php | 5 +++--
4 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/etemplate/inc/class.etemplate_widget_menupopup.inc.php b/etemplate/inc/class.etemplate_widget_menupopup.inc.php
index ebb9e22087..e38712913d 100644
--- a/etemplate/inc/class.etemplate_widget_menupopup.inc.php
+++ b/etemplate/inc/class.etemplate_widget_menupopup.inc.php
@@ -48,12 +48,13 @@ class etemplate_widget_menupopup extends etemplate_widget
* Reimplemented to parse our differnt attributes
*
* @param string|XMLReader $xml
+ * @param boolean $cloned=true true: object does NOT need to be cloned, false: to set attribute, set them in cloned object
* @return etemplate_widget_template current object or clone, if any attribute was set
* @todo Use legacy_attributes instead of leaving it to typeOptions method to parse them
*/
- public function set_attrs($xml)
+ public function set_attrs($xml, $cloned=true)
{
- parent::set_attrs($xml);
+ parent::set_attrs($xml, $cloned);
// set attrs[multiple] from attrs[options], unset options only if it just contains number or rows
if ($this->attrs['options'] > 1)
@@ -94,7 +95,7 @@ class etemplate_widget_menupopup extends etemplate_widget
switch ($widget_type)
{
- case 'select-account':
+ case 'select-account':
// If in allowed options, skip account check to support app-specific options
if(count($allowed) > 0 && in_array($val,$allowed)) continue;
diff --git a/etemplate/inc/class.etemplate_widget_nextmatch.inc.php b/etemplate/inc/class.etemplate_widget_nextmatch.inc.php
index 9ac912398d..b217ab1a3d 100644
--- a/etemplate/inc/class.etemplate_widget_nextmatch.inc.php
+++ b/etemplate/inc/class.etemplate_widget_nextmatch.inc.php
@@ -175,7 +175,7 @@ class etemplate_widget_nextmatch extends etemplate_widget
{
$cat_app = $value['cat_app'] ? $value['cat_app'] : $GLOBALS['egw_info']['flags']['current_app'];
$value['options-cat_id'] = array();
-
+
// Add 'All', if not already there
if(!$value['options-cat_id'][''] && !($value['options-cat_id'][0] && $value['options-cat_id'][0]['value'] == ''))
{
@@ -369,7 +369,7 @@ class etemplate_widget_nextmatch extends etemplate_widget
if ($knownUids)
{
// row_id not set for nextmatch --> just skip them, we can't identify the rows
- if (!$row_id)
+ if (!$row_id)
{
foreach($knownUids as $uid)
{
@@ -1024,9 +1024,17 @@ class etemplate_widget_nextmatch_filterheader extends etemplate_widget_menupopup
*/
class etemplate_widget_nextmatch_accountfilter extends etemplate_widget_menupopup
{
- public function set_attrs($xml)
+ /**
+ * Parse and set extra attributes from xml in template object
+ *
+ * @param string|XMLReader $xml
+ * @param boolean $cloned=true true: object does NOT need to be cloned, false: to set attribute, set them in cloned object
+ * @return etemplate_widget_template current object or clone, if any attribute was set
+ */
+ public function set_attrs($xml, $cloned=true)
{
- parent::set_attrs($xml);
+ parent::set_attrs($xml, $cloned);
+
$this->attrs['type'] = 'select-account';
}
}
diff --git a/etemplate/inc/class.etemplate_widget_textbox.inc.php b/etemplate/inc/class.etemplate_widget_textbox.inc.php
index d3912d89b2..ff3fe70573 100644
--- a/etemplate/inc/class.etemplate_widget_textbox.inc.php
+++ b/etemplate/inc/class.etemplate_widget_textbox.inc.php
@@ -49,11 +49,12 @@ class etemplate_widget_textbox extends etemplate_widget
* Reimplemented to handle legacy read-only by setting size < 0
*
* @param string|XMLReader $xml
- * @return etemplate_widget_textbox current object or clone, if any attribute was set
+ * @param boolean $cloned=true true: object does NOT need to be cloned, false: to set attribute, set them in cloned object
+ * @return etemplate_widget_template current object or clone, if any attribute was set
*/
- public function set_attrs($xml)
+ public function set_attrs($xml, $cloned=true)
{
- parent::set_attrs($xml);
+ parent::set_attrs($xml, $cloned);
// Legacy handling only
// A negative size triggered the HTML readonly attibute, but not etemplate readonly,
diff --git a/etemplate/inc/class.etemplate_widget_tree.inc.php b/etemplate/inc/class.etemplate_widget_tree.inc.php
index e65e3bcdbc..a962e7e008 100644
--- a/etemplate/inc/class.etemplate_widget_tree.inc.php
+++ b/etemplate/inc/class.etemplate_widget_tree.inc.php
@@ -51,12 +51,13 @@ class etemplate_widget_tree extends etemplate_widget
* Reimplemented to parse our differnt attributes
*
* @param string|XMLReader $xml
+ * @param boolean $cloned=true true: object does NOT need to be cloned, false: to set attribute, set them in cloned object
* @return etemplate_widget_template current object or clone, if any attribute was set
*/
- public function set_attrs($xml)
+ public function set_attrs($xml, $cloned=true)
{
$this->attrs['type'] = $xml->localName;
- parent::set_attrs($xml);
+ parent::set_attrs($xml, $cloned);
// set attrs[multiple] from attrs[options]
if ($this->attrs['options'] > 1)
From 025f31872feaf9559affab53ca2084c033dbd14e Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Mon, 14 Jul 2014 10:19:32 +0000
Subject: [PATCH 21/67] Fix delete confirmation dialog in Global categories
edit popup
---
admin/inc/class.admin_categories.inc.php | 4 ++--
admin/js/app.js | 22 +++++++++++++++++++
admin/templates/default/categories.edit.xet | 11 +++++-----
.../class.preferences_categories_ui.inc.php | 3 ++-
4 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/admin/inc/class.admin_categories.inc.php b/admin/inc/class.admin_categories.inc.php
index 1ac2b7daf1..e4bbb091b6 100644
--- a/admin/inc/class.admin_categories.inc.php
+++ b/admin/inc/class.admin_categories.inc.php
@@ -127,10 +127,10 @@ class admin_categories
{
$cats = new categories($content['owner'] ? $content['owner'] : categories::GLOBAL_ACCOUNT,$content['appname']);
- if ($content['delete']['delete'])
+ if ($content['delete']['delete'] || $content['delete']['subs'])
{
$button = 'delete';
- $delete_subs = $content['delete']['subs'];
+ $delete_subs = $content['delete']['subs']?true:false;
}
else
{
diff --git a/admin/js/app.js b/admin/js/app.js
index 6cd3bf7b9a..20f8bd392f 100644
--- a/admin/js/app.js
+++ b/admin/js/app.js
@@ -767,5 +767,27 @@ app.classes.admin = AppJS.extend(
}
return true;
+ },
+
+ /**
+ * Delete confirmation dialog
+ *
+ */
+ delete_category: function ()
+ {
+ var _buttons = [
+ {"button_id": "delete[cancel]","text": 'Cancel', id: 'delete[cancel]', image: 'cancel', "default":true},
+ {"button_id": "delete[delete]","text": 'Delete', id: 'delete[delete]', image: 'delete'},
+ {"button_id": "delete[subs]","text": 'Delete including sub-enteries', id: 'delete[subs]', image: 'delete'},
+ ];
+ var self = this;
+ var delDialog_callBack = function (_buttons)
+ {
+ if (_buttons != "delete[cancel]")
+ {
+ self.et2.getInstanceManager().submit(_buttons);
+ }
+ };
+ et2_dialog.show_dialog(delDialog_callBack,"Are you sure you want to delete this category ?","Delete",{},_buttons);
}
});
diff --git a/admin/templates/default/categories.edit.xet b/admin/templates/default/categories.edit.xet
index fa2bd97914..e3f2147c51 100644
--- a/admin/templates/default/categories.edit.xet
+++ b/admin/templates/default/categories.edit.xet
@@ -17,14 +17,13 @@
-
+
-
+
-
@@ -41,7 +40,6 @@
-
@@ -92,11 +90,12 @@
-
+
-
+
+
diff --git a/preferences/inc/class.preferences_categories_ui.inc.php b/preferences/inc/class.preferences_categories_ui.inc.php
index 0574533134..a3b4b9c318 100644
--- a/preferences/inc/class.preferences_categories_ui.inc.php
+++ b/preferences/inc/class.preferences_categories_ui.inc.php
@@ -1,7 +1,7 @@
Date: Mon, 14 Jul 2014 10:22:48 +0000
Subject: [PATCH 22/67] Link was missing if application entry directory already
exists. Fixes unable to symlink existing entries to vfs
---
phpgwapi/inc/class.egw_link.inc.php | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/phpgwapi/inc/class.egw_link.inc.php b/phpgwapi/inc/class.egw_link.inc.php
index 4e911ca398..b302920810 100644
--- a/phpgwapi/inc/class.egw_link.inc.php
+++ b/phpgwapi/inc/class.egw_link.inc.php
@@ -1192,8 +1192,9 @@ class egw_link extends solink
error_log(__METHOD__. ' (Link target ' . egw_vfs::decodePath($file) . ' not found!');
return false;
}
- $link = egw_vfs::concat($app_path,egw_vfs::basename($file));
}
+
+ $link = egw_vfs::concat($app_path,egw_vfs::basename($file));
return egw_vfs::symlink($file,$link);
}
/**
From 141033ca6610738868e8e5e976fc29252e6e9cb8 Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Mon, 14 Jul 2014 11:29:55 +0000
Subject: [PATCH 23/67] Fix doubled widget ID in export dialog
---
importexport/inc/class.importexport_export_ui.inc.php | 3 +++
importexport/inc/class.importexport_widget_filter.inc.php | 2 +-
importexport/templates/default/export_dialog.xet | 4 ++--
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/importexport/inc/class.importexport_export_ui.inc.php b/importexport/inc/class.importexport_export_ui.inc.php
index 02058de323..021626d580 100644
--- a/importexport/inc/class.importexport_export_ui.inc.php
+++ b/importexport/inc/class.importexport_export_ui.inc.php
@@ -224,6 +224,8 @@ class importexport_export_ui {
$content['filter'][$field] = importexport_helper_functions::date_rel2abs($content['filter'][$field]);
}
}
+ // Filter is used twice in template, but can't have the same ID
+ $content['filter_html'] = $content['filter_tpl'] = $content['filter'];
}
}
@@ -286,6 +288,7 @@ class importexport_export_ui {
// Set filter
// Note that because not all dates are DB dates, the plugin has to handle them
$filter = array();
+ $_content['filter'] = $_content['filter_html'] ? $_content['filter_html'] : $_content['filter_tpl'];
if(is_array($_content['filter']))
{
foreach($_content['filter'] as $key => $value)
diff --git a/importexport/inc/class.importexport_widget_filter.inc.php b/importexport/inc/class.importexport_widget_filter.inc.php
index 9792410e58..9014c5fd51 100644
--- a/importexport/inc/class.importexport_widget_filter.inc.php
+++ b/importexport/inc/class.importexport_widget_filter.inc.php
@@ -54,7 +54,7 @@ class importexport_widget_filter extends etemplate_widget_transformer
error_log("$this has no fields");
self::$transformation = array(
'type' => 'label',
- 'label' => 'No fields'
+ 'value' => 'No fields'
);
return parent::beforeSendToClient($cname);
}
diff --git a/importexport/templates/default/export_dialog.xet b/importexport/templates/default/export_dialog.xet
index b45fde4f9a..9a02a5cbbb 100644
--- a/importexport/templates/default/export_dialog.xet
+++ b/importexport/templates/default/export_dialog.xet
@@ -65,7 +65,7 @@
-
+
@@ -75,7 +75,7 @@
-
+
From 94b726f883910eb6ef03f22649444389ad40742c Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Mon, 14 Jul 2014 12:03:04 +0000
Subject: [PATCH 24/67] Don't remove request from POSTs, etemplate is still
active client side. Fixes etemplates stop working after downloading a file
(merge print, zip, etc.)
---
etemplate/inc/class.etemplate_new.inc.php | 3 ---
1 file changed, 3 deletions(-)
diff --git a/etemplate/inc/class.etemplate_new.inc.php b/etemplate/inc/class.etemplate_new.inc.php
index bffb603bcd..92e458c634 100644
--- a/etemplate/inc/class.etemplate_new.inc.php
+++ b/etemplate/inc/class.etemplate_new.inc.php
@@ -355,9 +355,6 @@ class etemplate_new extends etemplate_widget_template
error_log(__METHOD__."(,".array2string($content).')');
error_log(' validated='.array2string($validated));
- // tell request call to remove request, if it is not modified eg. by call to exec in callback
- self::$request->remove_if_not_modified();
-
return ExecMethod(self::$request->method, self::complete_array_merge(self::$request->preserv, $validated));
}
From 2e2d48ff1f09bfcd55e284ba748e75cb650909eb Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Mon, 14 Jul 2014 13:30:26 +0000
Subject: [PATCH 25/67] Disable "Change Owner" item from category context menu
if it is a private one
---
admin/inc/class.admin_categories.inc.php | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/admin/inc/class.admin_categories.inc.php b/admin/inc/class.admin_categories.inc.php
index e4bbb091b6..451c97ad28 100644
--- a/admin/inc/class.admin_categories.inc.php
+++ b/admin/inc/class.admin_categories.inc.php
@@ -83,8 +83,8 @@ class admin_categories
/**
* Edit / add a category
*
- * @param array $content=null
- * @param string $msg=''
+ * @param array $content = null
+ * @param string $msg = ''
*/
public function edit(array $content=null,$msg='')
{
@@ -279,7 +279,7 @@ class admin_categories
/**
* Return URL of an icon, or base url with trailing slash
*
- * @param string $icon='' filename
+ * @param string $icon = '' filename
* @return string url
*/
static function icon_url($icon='')
@@ -369,7 +369,7 @@ class admin_categories
$row['class'] .= ' rowNoEdit rowNoDelete ';
}
// Can only edit (via context menu) categories for the selected app (backend restriction)
- if($row['appname'] != $query['appname'])
+ if($row['appname'] != $query['appname'] || (array_sum($row['owner']) > 0))
{
$row['class'] .= ' rowNoEdit ';
}
@@ -399,8 +399,8 @@ class admin_categories
/**
* Display the accesslog
*
- * @param array $content=null
- * @param string $msg=''
+ * @param array $content = null
+ * @param string $msg = ''
*/
public function index(array $content=null,$msg='')
{
@@ -626,7 +626,7 @@ class admin_categories
* @param string &$action_msg translated verb for the actions, to be used in a message like '%1 entries deleted'
* @param array $query get_rows parameter
* @param string &$msg on return user feedback
- * @param boolean $skip_notifications=false true to NOT notify users about changes
+ * @param boolean $skip_notifications = false true to NOT notify users about changes
* @return boolean true if all actions succeded, false otherwise
*/
function action($action, $checked, $use_all, &$success, &$failed, &$action_msg,
From 4d24812a487b1aec606f427b7ae66bc2db33a4d2 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Mon, 14 Jul 2014 15:56:34 +0000
Subject: [PATCH 26/67] Unlock the mail tree after move/copy actions
---
mail/js/app.js | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/mail/js/app.js b/mail/js/app.js
index 837047c6fc..55f8dfe705 100644
--- a/mail/js/app.js
+++ b/mail/js/app.js
@@ -1586,6 +1586,7 @@ app.classes.mail = AppJS.extend(
case "cancel":
rv = 'cancel';
}
+ if (rv !="cancel") that.lock_tree();
switch (_action.id)
{
case "delete":
@@ -1612,7 +1613,6 @@ app.classes.mail = AppJS.extend(
if (_action.id.substr(0,4)=='move') that.mail_callMove(_action, _elems,_target, rv);
if (_action.id.substr(0,4)=='copy') that.mail_callCopy(_action, _elems,_target, rv);
}
- if (rv !="cancel") that.lock_tree();
},
messageToDisplay,
this.egw.lang("Confirm"),
@@ -2580,12 +2580,10 @@ app.classes.mail = AppJS.extend(
/**
* mail_move2folder - implementation of the move action from action menu
*
- * @param _action
+ * @param _action _action.id holds folder target information
* @param _elems - the representation of the elements to be affected
*/
mail_move2folder: function(_action, _elems) {
- //alert('Copy or Move Called:'+_action.id);
- // _action.id holds folder target information
this.mail_move(_action, _elems, null);
},
@@ -2612,14 +2610,13 @@ app.classes.mail = AppJS.extend(
var target = _action.id == 'drop_move_mail' ? _target.iface.id : _action.id.substr(5);
var messages = this.mail_getFormData(_senders);
if (typeof _allMessagesChecked=='undefined') _allMessagesChecked=false;
- //alert('mail_move('+messages.msg.join(',')+' --> '+target+')');
// TODO: Write move/copy function which cares about doing the same stuff
// as the "onNodeSelect" function!
messages['all'] = _allMessagesChecked;
if (messages['all']=='cancel') return false;
if (messages['all']) messages['activeFilters'] = this.mail_getActiveFilters(_action);
-
- egw.json('mail.mail_ui.ajax_copyMessages',[target, messages, 'move'])
+ var self = this;
+ egw.json('mail.mail_ui.ajax_copyMessages',[target, messages, 'move'], function(){self.unlock_tree();})
.sendRequest();
var nm = this.et2.getWidgetById(this.nm_index);
this.mail_setRowClass(_senders,'deleted');
@@ -2649,15 +2646,14 @@ app.classes.mail = AppJS.extend(
var target = _action.id == 'drop_copy_mail' ? _target.iface.id : _action.id.substr(5);
var messages = this.mail_getFormData(_senders);
if (typeof _allMessagesChecked=='undefined') _allMessagesChecked=false;
- //alert('mail_copy('+messages.msg.join(',')+' --> '+target+')');
// TODO: Write move/copy function which cares about doing the same stuff
// as the "onNodeSelect" function!
messages['all'] = _allMessagesChecked;
if (messages['all']=='cancel') return false;
if (messages['all']) messages['activeFilters'] = this.mail_getActiveFilters(_action);
-
- egw.json('mail.mail_ui.ajax_copyMessages',[target, messages])
- .sendRequest();
+ var self = this;
+ egw.json('mail.mail_ui.ajax_copyMessages',[target, messages],function (){self.unlock_tree();})
+ .sendRequest();
// Server response contains refresh
},
From 24616609202116c55dc9f9005622fc1c7cec86d1 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Mon, 14 Jul 2014 16:26:03 +0000
Subject: [PATCH 27/67] * Preferences: do NOT use deny configuration for admins
---
phpgwapi/inc/class.egw_framework.inc.php | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php
index c843388527..3cc08c9f3b 100644
--- a/phpgwapi/inc/class.egw_framework.inc.php
+++ b/phpgwapi/inc/class.egw_framework.inc.php
@@ -1405,7 +1405,8 @@ if ($app == 'home') continue;
),
);
if (!$GLOBALS['egw_info']['user']['apps']['preferences'] || $GLOBALS['egw_info']['server']['deny_'.$type] &&
- array_intersect($memberships, (array)$GLOBALS['egw_info']['server']['deny_'.$type]))
+ array_intersect($memberships, (array)$GLOBALS['egw_info']['server']['deny_'.$type]) &&
+ !$GLOBALS['egw_info']['user']['apps']['admin'])
{
return; // user has no access to preferences app
}
From 9f9f5184fcdda5d6b7c68c3e6e4bc0e0aba50597 Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Mon, 14 Jul 2014 20:29:42 +0000
Subject: [PATCH 28/67] If selected egwActionObject(s) contain data, use that
over global data store.
---
phpgwapi/js/egw_action/egw_action_dragdrop.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/phpgwapi/js/egw_action/egw_action_dragdrop.js b/phpgwapi/js/egw_action/egw_action_dragdrop.js
index 42ee7d5d8b..fdff8ef275 100644
--- a/phpgwapi/js/egw_action/egw_action_dragdrop.js
+++ b/phpgwapi/js/egw_action/egw_action_dragdrop.js
@@ -157,10 +157,10 @@ function egwDragActionImplementation()
// Set file data
for(var i = 0; i < selected.length; i++)
{
- var data = egw.dataGetUIDdata(selected[i].id);
- if(data && data.data.mime && data.data.download_url)
+ var data = selected[i].data || egw.dataGetUIDdata(selected[i].id).data || {};
+ if(data && data.mime && data.download_url)
{
- var url = data.data.download_url;
+ var url = data.download_url;
// NEED an absolute URL
if (url[0] == '/') url = egw.link(url);
@@ -170,7 +170,7 @@ function egwDragActionImplementation()
// Unfortunately, dragging files is currently only supported by Chrome
if(navigator && navigator.userAgent.indexOf('Chrome'))
{
- event.dataTransfer.setData("DownloadURL", data.data.mime+':'+data.data.name+':'+url);
+ event.dataTransfer.setData("DownloadURL", data.mime+':'+data.name+':'+url);
}
else
{
From 3b915de4cb736588263910a14d238e6436ba9d7b Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Mon, 14 Jul 2014 20:47:52 +0000
Subject: [PATCH 29/67] Grid row action enhancements: - If row has a key 'id',
set the egwActionObject id to match instead of just row_[i] - Pass the row
content in egwActionObject's data, so it's available during action processing
---
etemplate/js/et2_widget_grid.js | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/etemplate/js/et2_widget_grid.js b/etemplate/js/et2_widget_grid.js
index 75f0ddae88..13eca54885 100644
--- a/etemplate/js/et2_widget_grid.js
+++ b/etemplate/js/et2_widget_grid.js
@@ -916,8 +916,15 @@ var et2_grid = et2_DOMWidget.extend([et2_IDetachedDOM, et2_IAligned],
// Add a new action object to the object manager
var row = $j('tr', this.tbody)[i];
var aoi = new et2_action_object_impl(this, row);
+ var content = this.getArrayMgr('content').getEntry(i);
+ var obj = widget_object.addObject(content.id || "row_"+i, aoi);
+
+ // Set the data to the content so it's available for the action
+ if(content)
+ {
+ obj.data = content;
+ }
- var obj = widget_object.addObject("row_"+i, aoi);
obj.updateActionLinks(action_links);
}
},
From 2b1d6e224423e3a79479250896de5585aafbc623 Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Mon, 14 Jul 2014 20:50:08 +0000
Subject: [PATCH 30/67] Add drag action for display popup attachments
---
mail/inc/class.mail_ui.inc.php | 11 +++++-
mail/js/app.js | 67 ++++++++++++++++++++++++++++++++++
2 files changed, 77 insertions(+), 1 deletion(-)
diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php
index be17fe8b31..7b25693b13 100644
--- a/mail/inc/class.mail_ui.inc.php
+++ b/mail/inc/class.mail_ui.inc.php
@@ -2232,6 +2232,15 @@ class mail_ui
$content['mail_id']=$rowID;
$content['mailDisplayContainerClass']=(count($attachments)?"mailDisplayContainer mailDisplayContainerFixedHeight":"mailDisplayContainer mailDisplayContainerFullHeight");
$content['mailDisplayAttachmentsClass']=(count($attachments)?"mailDisplayAttachments":"mail_DisplayNone");
+
+ // DRAG attachments actions
+ $etpl->setElementAttribute('mail_displayattachments', 'actions', array(
+ 'file_drag' => array(
+ 'dragType' => 'file',
+ 'type' => 'drag',
+ 'onExecute' => 'javaScript:app.mail.drag_attachment'
+ )
+ ));
//_debug_array($content);
$readonlys = $preserv = $content;
$etpl->exec('mail.mail_ui.displayMessage',$content,$sel_options,$readonlys,$preserv,2);
@@ -2272,7 +2281,7 @@ class mail_ui
$attachmentHTML[$key]['partID']=$value['partID'];
$attachmentHTML[$key]['winmailFlag']=$value['is_winmail'];
$attachmentHTML[$key]['classSaveAllPossiblyDisabled'] = "mail_DisplayNone";
-
+
switch(strtoupper($value['mimeType']))
{
case 'MESSAGE/RFC822':
diff --git a/mail/js/app.js b/mail/js/app.js
index 55f8dfe705..f75a4e49ae 100644
--- a/mail/js/app.js
+++ b/mail/js/app.js
@@ -140,6 +140,12 @@ app.classes.mail = AppJS.extend(
}
}
window.resizeTo((w_h[0]?w_h[0]:870),(w_h[1]?w_h[1]:(screen.availHeight>egw_getWindowOuterHeight()?screen.availHeight:egw_getWindowOuterHeight())));
+
+ // Register attachments for drag
+ this.register_for_drag(
+ this.et2.getArrayMgr("content").getEntry('mail_id'),
+ this.et2.getArrayMgr("content").getEntry('mail_displayattachments')
+ );
break;
case 'mail.compose':
var that = this;
@@ -912,6 +918,67 @@ app.classes.mail = AppJS.extend(
{
egw.jsonq('mail.mail_ui.ajax_refreshVacationNotice',[_server]);
},
+ /**
+ * Make sure attachments have all needed data, so they can be found for
+ * HTML5 native dragging
+ *
+ * @param {string} mail_id Mail UID
+ * @param {array} attachments Attachment information.
+ */
+ register_for_drag: function(mail_id, attachments)
+ {
+ // Put required info in global store
+ var data = {};
+ for (var i = 0; i < attachments.length; i++)
+ {
+ var data = attachments[i] || {};
+ if(!data.filename || !data.type) continue;
+
+ // Add required info
+ data.mime = data.type;
+ data.download_url = egw.link('/index.php', {
+ menuaction: 'mail.mail_ui.getAttachment',
+ id: mail_id,
+ part: data.partID,
+ is_winmail: data.winmailFlag
+ });
+ data.name = data.filename;
+ }
+ },
+
+ /**
+ * Display helper for dragging attachments
+ *
+ * @param {egwAction} _action
+ * @param {egwActionElement[]} _elems
+ * @returns {DOMNode}
+ */
+ drag_attachment: function(_action, _elems)
+ {
+ var div = $j(document.createElement("div"))
+ .css({
+ position: 'absolute',
+ top: '0px',
+ left: '0px',
+ width: '300px'
+ });
+
+ var data = _elems[0].data || {};
+
+ var text = $j(document.createElement('div')).css({left: '30px', position: 'absolute'});
+ // add filename or number of files for multiple files
+ text.text(_elems.length > 1 ? _elems.length+' '+this.egw.lang('files') : data.name || '');
+ div.append(text);
+
+ // Add notice of Ctrl key, if supported
+ if(window.FileReader && 'draggable' in document.createElement('span') &&
+ navigator && navigator.userAgent.indexOf('Chrome') >= 0)
+ {
+ var key = ["Mac68K","MacPPC","MacIntel"].indexOf(window.navigator.platform) < 0 ? 'Ctrl' : 'Command';
+ text.append(' ' + this.egw.lang('Hold %1 to drag files to your computer',key));
+ }
+ return div;
+ },
/**
* mail_refreshVacationNotice, function to call with appropriate data to refresh the vacationnotice for the active server
From 67390bbcfa07d80cfe7207ca85be6227e51eefb9 Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Mon, 14 Jul 2014 22:34:55 +0000
Subject: [PATCH 31/67] Add HTML5 drag support for Chrome for all files in link
lists
---
.../inc/class.etemplate_widget_link.inc.php | 1 +
etemplate/js/et2_widget_link.js | 66 +++++++++++++++++++
etemplate/templates/default/etemplate2.css | 6 ++
3 files changed, 73 insertions(+)
diff --git a/etemplate/inc/class.etemplate_widget_link.inc.php b/etemplate/inc/class.etemplate_widget_link.inc.php
index 3d0afe4635..83d29e61c4 100644
--- a/etemplate/inc/class.etemplate_widget_link.inc.php
+++ b/etemplate/inc/class.etemplate_widget_link.inc.php
@@ -183,6 +183,7 @@ class etemplate_widget_link extends etemplate_widget
}
$link['title'] = egw_vfs::decodePath($link['title']);
$link['icon'] = egw_link::vfs_path($link['app2'],$link['id2'],$link['id'],true);
+ $link['download_url'] = egw_vfs::download_url($link['icon']);
}
else
{
diff --git a/etemplate/js/et2_widget_link.js b/etemplate/js/et2_widget_link.js
index e3717c2052..dc3f739bd8 100644
--- a/etemplate/js/et2_widget_link.js
+++ b/etemplate/js/et2_widget_link.js
@@ -1511,6 +1511,11 @@ var et2_link_list = et2_link_string.extend(
var row = jQuery('#link_'+(self.context.data.dom_id ? self.context.data.dom_id : self.context.data.link_id), self.list);
self._delete_link(link_id, row);
});
+
+ // Native DnD - Doesn't play nice with jQueryUI Sortable
+ // Tell jQuery to include this property
+ jQuery.event.props.push('dataTransfer');
+
},
destroy: function() {
@@ -1569,6 +1574,7 @@ var et2_link_list = et2_link_string.extend(
_add_link: function(_link_data) {
var row = $j(document.createElement("tr"))
.attr("id", "link_"+(_link_data.dom_id ? _link_data.dom_id : _link_data.link_id))
+ .attr("draggable", _link_data.app == 'file' ? "true" : "")
.appendTo(this.list);
// Icon
@@ -1646,12 +1652,72 @@ var et2_link_list = et2_link_string.extend(
self.context.showAt(e.pageX, e.pageY, true);
e.preventDefault();
});
+
+
+ // Drag - adapted from egw_action_dragdrop, sidestepping action system
+ // so all linked files get it
+ // // Unfortunately, dragging files is currently only supported by Chrome
+ if(navigator && navigator.userAgent.indexOf('Chrome') >= 0)
+ {
+ row.on("dragstart", _link_data, function(event) {
+ if(event.dataTransfer == null) {
+ return;
+ }
+ var data = event.data || {};
+ if(data && data.type && data.download_url)
+ {
+ event.dataTransfer.dropEffect="copy";
+ event.dataTransfer.effectAllowed="copy";
+
+ var url = data.download_url;
+
+ // NEED an absolute URL
+ if (url[0] == '/') url = egw.link(url);
+ // egw.link adds the webserver, but that might not be an absolute URL - try again
+ if (url[0] == '/') url = window.location.origin+url;
+
+ // Unfortunately, dragging files is currently only supported by Chrome
+ if(navigator && navigator.userAgent.indexOf('Chrome'))
+ {
+ event.dataTransfer.setData("DownloadURL", data.type+':'+data.title+':'+url);
+ }
+
+ // Include URL as a fallback
+ event.dataTransfer.setData("text/uri-list", url);
+ }
+
+ if(event.dataTransfer.types.length == 0)
+ {
+ // No file data? Abort: drag does nothing
+ event.preventDefault();
+ return;
+ }
+ //event.dataTransfer.setDragImage(event.delegate.target,0,0);
+ var div = $j(document.createElement("div"))
+ .attr('id', 'drag_helper')
+ .css({
+ position: 'absolute',
+ top: '0px',
+ left: '0px',
+ width: '300px'
+ });
+ div.append(event.target.cloneNode(true));
+
+ self.list.append(div);
+
+ event.dataTransfer.setDragImage(div.get(0),0,0)
+ })
+ .on('drag', function() {
+ $j('#drag_helper',self.list).remove();
+ });
+ }
},
_delete_link: function(link_id, row) {
if(row)
{
var delete_button = jQuery('.delete',row);
delete_button.removeClass("delete").addClass("loading");
+ row.off();
}
if(typeof link_id != "object")
{
diff --git a/etemplate/templates/default/etemplate2.css b/etemplate/templates/default/etemplate2.css
index fcec4f6ffe..2fbdf598ea 100644
--- a/etemplate/templates/default/etemplate2.css
+++ b/etemplate/templates/default/etemplate2.css
@@ -662,6 +662,12 @@ ul.et2_link_string {
}
.et2_link_list {
border-collapse: collapse;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
}
.et2_link_list tr {
cursor: pointer;
From 82953bf156720f8da9691b813bb7c6f17f4ba1b1 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Tue, 15 Jul 2014 09:37:08 +0000
Subject: [PATCH 32/67] change phrase "all messages in current folder" to "all
messages in current view", as we take search and filters into account, also
change German translation accordingly
---
mail/js/app.js | 10 +++++-----
mail/lang/egw_de.lang | 5 ++---
mail/lang/egw_en.lang | 3 ++-
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/mail/js/app.js b/mail/js/app.js
index f75a4e49ae..0a78c36722 100644
--- a/mail/js/app.js
+++ b/mail/js/app.js
@@ -964,7 +964,7 @@ app.classes.mail = AppJS.extend(
});
var data = _elems[0].data || {};
-
+
var text = $j(document.createElement('div')).css({left: '30px', position: 'absolute'});
// add filename or number of files for multiple files
text.text(_elems.length > 1 ? _elems.length+' '+this.egw.lang('files') : data.name || '');
@@ -1496,7 +1496,7 @@ app.classes.mail = AppJS.extend(
var self = this;
this.egw.message(this.egw.lang('empty trash'));
egw.json('mail.mail_ui.ajax_emptyTrash',[server[0]],function(){self.lock_tree();})
- .sendRequest(true);
+ .sendRequest(true);
},
/**
@@ -1628,7 +1628,7 @@ app.classes.mail = AppJS.extend(
{text: this.egw.lang("Yes"), id: "all", class: "ui-priority-primary", "default": true},
{text: this.egw.lang("Cancel"), id:"cancel"}
];
- var messageToDisplay = this.egw.lang("Do you really want to apply %1 to ALL messages in the current folder?",this.egw.lang(_action.id))+" ";
+ var messageToDisplay = this.egw.lang("Do you really want to apply %1 to ALL messages in current view?",this.egw.lang(_action.id))+" ";
switch (_action.id)
{
case "unlabel":
@@ -1640,7 +1640,7 @@ app.classes.mail = AppJS.extend(
case "flagged":
case "read":
case "undelete":
- messageToDisplay = this.egw.lang("Do you really want to toggle flag %1 for ALL messages in the current folder?",this.egw.lang(_action.id))+" ";
+ messageToDisplay = this.egw.lang("Do you really want to toggle flag %1 for ALL messages in current view?",this.egw.lang(_action.id))+" ";
break;
}
return et2_dialog.show_dialog(function(_button_id, _value) {
@@ -2720,7 +2720,7 @@ app.classes.mail = AppJS.extend(
if (messages['all']) messages['activeFilters'] = this.mail_getActiveFilters(_action);
var self = this;
egw.json('mail.mail_ui.ajax_copyMessages',[target, messages],function (){self.unlock_tree();})
- .sendRequest();
+ .sendRequest();
// Server response contains refresh
},
diff --git a/mail/lang/egw_de.lang b/mail/lang/egw_de.lang
index a9cdcc7d3d..f72016aeda 100644
--- a/mail/lang/egw_de.lang
+++ b/mail/lang/egw_de.lang
@@ -1,8 +1,6 @@
%1 attachments mail de %1 Anhänge
%1 is not writable by you! mail de %1 ist nicht beschreibbar für Sie
%1 mails selected mail de %1 E-Mail(s) ausgewählt
-(*) wildcards (*,?) may be used. if you are trying to match * or ? itself, you must escape them with a backslash (). if you check "use regular expressions" you must use valid regular expressions. mail de (*) Platzhalter (*,?) können verwendet werden. Wenn Sie * oder ? selbst finden wollen, dann müssen Sie diesen Zeichen je einen Backslash (\) voranstellen. Wenn Sie "reguläre Ausdrücke verwenden" aktivieren, dann müssen Sie jedoch gültige reguläre Ausdrücke angeben.
-(*) wildcards (*,?) may be used. if you are trying to match * or ? itself, you must escape them with a backslash (). if you check "use regular expressions" you must use valid regular expressions. in order to escape of exclamation mark (!) at the begining not being used as "not", use regex and backslash () (e.g. !) mail de (*) wildcards (*,?) may be used. If you are trying to match * or ? itself, you must escape them with a backslash (\). If you check "Use regular expressions" you must use valid regular expressions. In order to escape of exclamation mark (!) at the begining not being used as "NOT", use regex and backslash (\) (e.g. \!)
(*) wildcards (*,?) may be used. if you are trying to match * or ? itself, you must escape them with a backslash (\). if you check "use regular expressions" you must use valid regular expressions. mail de (*) Platzhalter (*,?) können verwendet werden. Wenn Sie * oder ? selbst finden wollen, dann müssen Sie diesen Zeichen je einen Backslash (\) voranstellen. Wenn Sie "reguläre Ausdrücke verwenden" aktivieren, dann müssen Sie jedoch gültige reguläre Ausdrücke angeben.
(*) wildcards (*,?) may be used. if you are trying to match * or ? itself, you must escape them with a backslash (\). if you check "use regular expressions" you must use valid regular expressions. in order to escape of exclamation mark (!) at the begining not being used as "not", use regex and backslash (\) (e.g. \!) mail de (*) wildcards (*,?) may be used. If you are trying to match * or ? itself, you must escape them with a backslash (\). If you check "Use regular expressions" you must use valid regular expressions. In order to escape of exclamation mark (!) at the begining not being used as "NOT", use regex and backslash (\) (e.g. \!)
(leave empty for no quota) mail de (Leer lassen, um einen die Begrenzung zu deaktivieren)
@@ -93,8 +91,9 @@ display only when no plain text is available mail de nur anzeigen wenn kein Plai
displaying html messages is disabled mail de Die Anzeige von HTML-E-Mails ist deaktiviert.
displaying plain messages is disabled mail de Die Anzeige von reinen Text E-Mails ist deaktiviert.
do not auto create folders mail de Automatische Ordnererstellung verhindern für
-do you really want to apply %1 to all messages in the current folder? mail de Möchten Sie die ausgewählte Aktion: %1, auf alle Nachrichten in diesem Ordner anwenden?
+do you really want to apply %1 to all messages in current view? mail de Wollen Sie wirklich %1 auf alle Nachrichten in der aktuellen Ansicht anwenden?
do you really want to delete folder %1 ? mail de Wollen Sie den Ordner %1 wirklich löschen?
+do you really want to toggle flag %1 for all messages in current view? mail de Wollen Sie wirklich den Wert für %1 für alle Nachrichten in der aktuellen Ansicht umschalten?
do you want to be asked for confirmation before attaching selected messages to new mail? mail de Möchten Sie vor dem Anhängen von einer oder mehreren (ausgewählten) E-Mails an eine neue E-Mail gefragt werden?
do you want to be asked for confirmation before moving selected messages to another folder? mail de Möchten Sie vor dem Verschieben von E-Mails in andere Ordner gefragt werden?
do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? mail de Möchten Sie das Editieren/Einstellen von Filterregeln (via SIEVE) unterbinden?
diff --git a/mail/lang/egw_en.lang b/mail/lang/egw_en.lang
index 063926b4fb..4ae627f144 100644
--- a/mail/lang/egw_en.lang
+++ b/mail/lang/egw_en.lang
@@ -91,8 +91,9 @@ display only when no plain text is available mail en display only when no plain
displaying html messages is disabled mail en displaying html messages is disabled
displaying plain messages is disabled mail en displaying plain messages is disabled
do not auto create folders mail en do not auto create folders
-do you really want to apply %1 to all messages in the current folder? mail en Do you really want to apply %1 to ALL messages in the current folder?
+do you really want to apply %1 to all messages in current view? mail en Do you really want to apply %1 to ALL messages in current view?
do you really want to delete folder %1 ? mail en Do you really want to DELETE Folder %1 ?
+do you really want to toggle flag %1 for all messages in current view? mail en Do you really want to toggle flag %1 for ALL messages in current view?
do you want to be asked for confirmation before attaching selected messages to new mail? mail en Do you want to be asked for confirmation before attaching selected messages to new mail?
do you want to be asked for confirmation before moving selected messages to another folder? mail en Do you want to be asked for confirmation before moving selected messages to another folder?
do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? mail en Do you want to prevent the editing/setup of filter rules (, even if SIEVE is enabled)?
From 2e4a5107b83779524a5aa8592dc7c492316083a0 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Tue, 15 Jul 2014 09:38:29 +0000
Subject: [PATCH 33/67] pending French translations from translation.stylite.de
---
calendar/lang/egw_fr.lang | 13 +++++++++++++
phpgwapi/lang/egw_fr.lang | 16 +++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/calendar/lang/egw_fr.lang b/calendar/lang/egw_fr.lang
index 8a1d91e217..d290dc5026 100644
--- a/calendar/lang/egw_fr.lang
+++ b/calendar/lang/egw_fr.lang
@@ -1,6 +1,9 @@
%1 %2 in %3 calendar fr %1 %2 dans %3
+%1 days calendar fr %1 jours
%1 event(s) %2 calendar fr %1 événement(s) %2
%1 event(s) %2, %3 failed because of insufficent rights !!! calendar fr %1 événement(s) %2, %3 en échec pour droits insuffisants !
+%1 hours calendar fr %1 heures
+%1 minutes calendar fr %1 minutes
%1 participants removed because of missing invite grants calendar fr %1 participant(s) supprimé(s) pour manque de confirmation d'invitation.
%1 records imported calendar fr %1 enregistrement(s) importé(s)
%1 records read (not yet imported, you may go back and uncheck test import) calendar fr %1 enregistrements lus (pas encore importés, vous pouvez revenir en arrière et décocher Tester l'import)
@@ -22,6 +25,7 @@ actions calendar fr Actions
actions... calendar fr Actions...
add alarm calendar fr Ajouter une alarme
add current view as favorite calendar fr Ajouter cette vue aux favoris
+add new alarm calendar fr Ajouter une alarme
add new participants or resource calendar fr Ajouter de nouveaux participants ou ressources
add timesheet entry calendar fr Ajouter une entrée feuille de temps
added calendar fr Ajouté
@@ -32,6 +36,7 @@ after current date calendar fr Après la date courante
age: calendar fr Age :
alarm calendar fr Alarme
alarm added calendar fr Alarme ajoutée.
+alarm added automatic to new events before event start-time calendar fr Alarme ajouté automatiquement aux nouveaux événements avant l'heure début
alarm deleted calendar fr Alarme supprimée.
alarm for %1 at %2 in %3 calendar fr Alarme pour %1 à %2 dans %3
alarm management calendar fr Gestion des alarmes
@@ -112,6 +117,7 @@ creator calendar fr Créateur
csv calendar fr CSV
csv-fieldname calendar fr CSV - Nom du champ
csv-filename calendar fr CSV - Nom du fichier
+custom calendar fr Personnalisé
custom fields common fr Champs personnalisés
custom_2 common fr Libre/Occupé
daily calendar fr Journalier
@@ -123,6 +129,8 @@ days calendar fr jours
days of the week for a weekly repeated event calendar fr Jours de la semaine pour une répétition hebdomadaire
days repeated calendar fr Jours répétés
dayview calendar fr Vue journalière
+default alarm for regular events calendar fr Alarme par défaut pour les événements récurrents
+default alarm for whole-day events calendar fr Alarme par défaut pour les événements prenant une journée entière
default appointment length (in minutes) calendar fr Durée du rendez-vous par défaut (en minutes)
default calendar filter calendar fr Filtre de calendrier par défaut
default calendar view calendar fr Vue du calendrier par défaut
@@ -138,6 +146,7 @@ delete series calendar fr Supprimer des occurences
delete this alarm calendar fr Supprimer cette alarme
delete this event calendar fr Supprimer cet événement
delete this exception calendar fr Supprimer cet exception
+delete this recurrence calendar fr Supprimer cette récurrence
delete this series of recuring events calendar fr Supprimer ces occurences d'événements récurrents
deleted calendar fr Supprimé(s).
deny ressources reservation for private events calendar fr Refuser la réservation des ressources pour des événements privés.
@@ -168,6 +177,7 @@ edit series calendar fr Modifier des occurrences
edit status or alarms for this particular day calendar fr Modifier les statuts ou alarmes de ce jour en particulier
edit this event calendar fr Modifier cet événement
edit this series of recuring events calendar fr Modifier cette série d'événements récurrents
+empty = no alarm calendar fr vide = aucune alarme
empty for all calendar fr Vide pour tous
end calendar fr Fin
end date/time calendar fr Date/Heure de fin
@@ -307,6 +317,7 @@ maximum available quantity of %1 exceeded! calendar fr Dépassement de la quanti
meeting request calendar fr Demande de rendez-vous
meetingrequest to all participants calendar fr Demande de rendez-vous à tous les participants
merge document... calendar fr Fusionner un document...
+midnight calendar fr Minuit
minutes calendar fr Minutes
modified calendar fr Modifié
modifier calendar fr Editeur
@@ -318,6 +329,7 @@ monthly (by day) calendar fr Mensuel (par jour)
monthview calendar fr Vue mensuelle
multiple week view calendar fr Vue multi-semaines
name of current user, all other contact fields are valid too calendar fr Nom de l'utilisateur courant, tous les autres champs de contacts sont valides aussi
+name of the week (ex: monday), available for the first entry inside each day of week or daily table inside the selected range. calendar fr Jour de la semaine (ex: lundi), disponible comme première entrée sur chaque vue semaine ou journalière à l'intérieur d'une sélection.
needs action calendar fr Action nécessaire
new calendar fr Nouveau
new search with the above parameters calendar fr Nouvelle recherche avec les paramètres ci-dessus
@@ -496,6 +508,7 @@ this entry is currently opened by %1! calendar fr Cet élément est actuellement
this entry is opened by user: calendar fr Cet élément a été ouvert dans l'interface de temps défini par l'utilisateur :
this event is part of a series calendar fr Cet événements fait partie d'une série
this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar fr Ce groupe qui est présélectionné quand vous entrez dans le planificateur. Vous pouvez le modifier dans le planning chaque fois que vous le désirez.
+this is a recurring event. do you want to delete just this recurrence or the whole series? calendar fr Ceci est un événement récurrent. Souhaitez-vous supprimer juste cette occurrence ou bien toute la série ?
this mail contains a meeting request calendar fr Cet email contient une demande de rendez-vous
this mail contains a reply to a meeting request calendar fr Cet email contient une réponse à une demande de rendez-vous
this message is sent for canceled or deleted events. calendar fr Ce message est envoyé pour les événements annulés ou effacés.
diff --git a/phpgwapi/lang/egw_fr.lang b/phpgwapi/lang/egw_fr.lang
index 66397b3df3..9837bd345d 100644
--- a/phpgwapi/lang/egw_fr.lang
+++ b/phpgwapi/lang/egw_fr.lang
@@ -180,6 +180,7 @@ colombia common fr COLOMBIE
common preferences common fr Préférences communes
comoros common fr COMORRES
company common fr Société
+confirmation required common fr Confirmation requise
congo common fr CONGO
congo, the democratic republic of the common fr CONGO, REPUBLIQUE DEMOCRATIQUE DU
contacting server... common fr Connexion au serveur...
@@ -214,6 +215,7 @@ delete common fr Supprimer
delete category common fr Supprimer la catégorie
delete file common fr Supprimer le fichier
delete row common fr Supprimer ligne
+delete selected entries? common fr Supprimer les entrées sélectionnées ?
delete these entries common fr Supprimer ces entrées
delete this entry common fr Supprimer cette entrée
denmark common fr DANEMARK
@@ -283,11 +285,14 @@ etag common fr eTag
ethiopia common fr ETHIOPIE
everything common fr Tout
exact common fr exact
+failed to change password. common fr Echec du changement de mot de passe.
failed to contact server or invalid response from server. try to relogin. contact admin in case of faliure. common fr Impossible de contacter le serveur ou réponse invalide de ce dernier. Essayez de vous reconnecter. En cas de panne contactez votre administrateur.
failed to create required directory "%1"! admin fr Echec de la création du répertoire "%1"!
failed to move unconnected %1 %2 to %3! admin fr Echec à la suppression des %1 non connectés %2 à %3!
falkland islands (malvinas) common fr ILES FALKLAND (MALOUINES)
faroe islands common fr ILES FAROE
+favorite queries common fr Requêtes en favoris
+favorites common fr Favoris
fax number common fr Numéro de fax
features of the editor? common fr Fonctionnalités de l'éditeur
february common fr Février
@@ -437,6 +442,7 @@ line %1: '%2' csv data does not match column-count of table %3 ==> ignored
list common fr Liste
list members common fr Liste les membres
lithuania common fr LITHUANIE
+load common fr Charger
local common fr Local
location calendars groupdav fr Localisations des calendriers
locations common fr Localisations
@@ -447,6 +453,7 @@ logout common fr Déconnexion
lost login id common fr Identifiant oublié
lost password common fr Mot de passe oublié
low common fr Bas
+lowercase letters common fr lettres en minuscule
lowest common fr Plus bas
luxembourg common fr LUXEMBOURG
macau common fr MACAU
@@ -511,7 +518,9 @@ niger common fr NIGER
nigeria common fr NIGERIA
niue common fr NIUE
no common fr Non
+no - cancel common fr Non, annuler
no entries found, try again ... common fr Aucune occurence trouvée, essayez encore ...
+no filters common fr Aucun filtre
no history for this record common fr Pas d'historique pour cet enregistrement
no savant2 template directories were found in: common fr Pas de dossier modèle Savant2 n'a été trouvé dans:
no subject common fr Sans objet
@@ -525,12 +534,15 @@ not common fr pas
not a user yet? register now common fr Pas encore identifié? Enregisrez-vous maintenant
not assigned common fr non assigné
not readable %1 entry of user %2 common fr L'entrée %1 de l'utilisateur %2 est illisible
+not supported by current application! common fr Non supporté par l'application active
note common fr Note
notes common fr Notes
+nothing to save. common fr Rien à enregistrer.
notifications common fr Notifications
notify window common fr Fenêtre de notification
notify your administrator to correct this situation common fr Demandez à votre administrateur de corriger la situation
november common fr Novembre
+numbers common fr nombres
october common fr Octobre
ok common fr OK
old value common fr Ancienne valeur
@@ -676,6 +688,7 @@ select user common fr Sélectionner l'utilisateur
select work email address common fr Sélectionner l'email professionnel
selection common fr Sélection
send common fr Envoyer
+send succeeded to %1 common fr Envoi réussi vers %1
senegal common fr SENEGAL
september common fr Septembre
serbia common fr Serbie
@@ -720,6 +733,7 @@ south africa common fr AFRIQUE DU SUD
south georgia and the south sandwich islands common fr GEORGIE DU SUD ET LES ILES SANDWICH DU SUD
space common fr Espace
spain common fr ESPAGNE
+special characters common fr caractères spéciaux
sri lanka common fr SRI LANKA
start date common fr Date de début
start directory for image browser of rich text editor in egroupware vfs (filemanager). common fr Répertoire de début pour la navigation d'image dans l'éditeur riche dans le File Manager eGroupware
@@ -802,6 +816,7 @@ update the clock per minute or per second common fr Mettre à jour l'horloge par
upload common fr Déposer
upload directory does not exist, or is not writeable by webserver common fr Le répertoire de dépôt n'existe pas ou le serveur web ne peut pas y écrire
upload requires the directory to be writable by the webserver! common fr L'upload nécessite que le répertoire soit en écriture sur le serveur web !
+uppercase letters common fr lettres majuscules
url common fr Url
uruguay common fr URUGUAY
use button to search for common fr Utilisez le bouton pour rechercher
@@ -873,4 +888,3 @@ your settings have been updated common fr Vos préférences ont été mises à j
zambia common fr ZAMBIE
zimbabwe common fr ZIMBABWE
zoom common fr Agrandissement
-nothing to save. common fr Rien à enregistrer.
From 16c5a62ed4b41712736faba9a1e6b90c09e1318d Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Tue, 15 Jul 2014 09:52:00 +0000
Subject: [PATCH 34/67] Use similar Global category's delete confirmation
dialog as it is used in edit popup too
---
admin/inc/class.admin_categories.inc.php | 2 +-
admin/js/app.js | 25 ++++++++++++++++++--
admin/templates/default/categories.index.xet | 11 ---------
3 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/admin/inc/class.admin_categories.inc.php b/admin/inc/class.admin_categories.inc.php
index 451c97ad28..255f632ed5 100644
--- a/admin/inc/class.admin_categories.inc.php
+++ b/admin/inc/class.admin_categories.inc.php
@@ -601,9 +601,9 @@ class admin_categories
'delete' => array(
'caption' => 'Delete',
'allowOnMultiple' => true,
- 'nm_action' => 'open_popup',
'group' => ++$group,
'disableClass' => 'rowNoDelete',
+ 'onExecute' => 'javaScript:app.admin.delete_category'
),
);
diff --git a/admin/js/app.js b/admin/js/app.js
index 20f8bd392f..b6cd96589d 100644
--- a/admin/js/app.js
+++ b/admin/js/app.js
@@ -772,20 +772,41 @@ app.classes.admin = AppJS.extend(
/**
* Delete confirmation dialog
*
+ * @param {egw action} _action
*/
- delete_category: function ()
+ delete_category: function (_action)
{
var _buttons = [
{"button_id": "delete[cancel]","text": 'Cancel', id: 'delete[cancel]', image: 'cancel', "default":true},
{"button_id": "delete[delete]","text": 'Delete', id: 'delete[delete]', image: 'delete'},
{"button_id": "delete[subs]","text": 'Delete including sub-enteries', id: 'delete[subs]', image: 'delete'},
];
+ var action = _action;
var self = this;
var delDialog_callBack = function (_buttons)
{
if (_buttons != "delete[cancel]")
{
- self.et2.getInstanceManager().submit(_buttons);
+ if (self.et2._inst.name == "admin.categories.index")
+ {
+ var nm_widget = self.et2.getWidgetById('nm');
+ if (nm_widget)
+ {
+ if (_buttons == "delete[delete]")
+ {
+ nm_action(action);
+ }
+ else
+ {
+ action.id = 'delete_sub';
+ nm_action(action);
+ }
+ }
+ }
+ else
+ {
+ self.et2.getInstanceManager().submit(_buttons);
+ }
}
};
et2_dialog.show_dialog(delDialog_callBack,"Are you sure you want to delete this category ?","Delete",{},_buttons);
diff --git a/admin/templates/default/categories.index.xet b/admin/templates/default/categories.index.xet
index 7125b7dd89..61527b04d6 100644
--- a/admin/templates/default/categories.index.xet
+++ b/admin/templates/default/categories.index.xet
@@ -78,17 +78,6 @@
-
-
-
-
-
-
-
-
-
-
-
From f472ff10ee0d373857d8f39b898c5dcfadb4276c Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Tue, 15 Jul 2014 11:07:26 +0000
Subject: [PATCH 35/67] fixed PHP Fatal error: Call to a member function
MetaTables() on a non-object, when non-default apps like esyncpro got
installed/updated
---
phpgwapi/inc/class.db_backup.inc.php | 1 +
phpgwapi/inc/class.schema_proc.inc.php | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/phpgwapi/inc/class.db_backup.inc.php b/phpgwapi/inc/class.db_backup.inc.php
index c33fded96d..b118ea28a3 100644
--- a/phpgwapi/inc/class.db_backup.inc.php
+++ b/phpgwapi/inc/class.db_backup.inc.php
@@ -105,6 +105,7 @@ class db_backup
}
$this->db = $this->schema_proc->m_odb;
+ if (!$this->db->Link_ID) $this->db->connect();
$this->adodb = $this->db->Link_ID;
if (isset($GLOBALS['egw_setup']) && is_object($GLOBALS['egw_setup'])) // called from setup
{
diff --git a/phpgwapi/inc/class.schema_proc.inc.php b/phpgwapi/inc/class.schema_proc.inc.php
index a176ac52a8..fc426b2590 100644
--- a/phpgwapi/inc/class.schema_proc.inc.php
+++ b/phpgwapi/inc/class.schema_proc.inc.php
@@ -112,7 +112,7 @@ class schema_proc
$this->m_odb->connect();
$this->capabilities =& $this->m_odb->capabilities;
- $this->sType = $dbms ? $dmbs : $this->m_odb->Type;
+ $this->sType = $dbms ? $dbms : $this->m_odb->Type;
$this->adodb = &$this->m_odb->Link_ID;
$this->dict = NewDataDictionary($this->adodb);
From fb98168c7ef72a2ad1496d11a1d85baecf2d7192 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Tue, 15 Jul 2014 11:17:03 +0000
Subject: [PATCH 36/67] Fix confirmation dialog messages for move/copy mail
---
mail/js/app.js | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/mail/js/app.js b/mail/js/app.js
index 0a78c36722..aa8666cf89 100644
--- a/mail/js/app.js
+++ b/mail/js/app.js
@@ -1628,7 +1628,7 @@ app.classes.mail = AppJS.extend(
{text: this.egw.lang("Yes"), id: "all", class: "ui-priority-primary", "default": true},
{text: this.egw.lang("Cancel"), id:"cancel"}
];
- var messageToDisplay = this.egw.lang("Do you really want to apply %1 to ALL messages in current view?",this.egw.lang(_action.id))+" ";
+ var messageToDisplay = '';
switch (_action.id)
{
case "unlabel":
@@ -1640,10 +1640,21 @@ app.classes.mail = AppJS.extend(
case "flagged":
case "read":
case "undelete":
- messageToDisplay = this.egw.lang("Do you really want to toggle flag %1 for ALL messages in current view?",this.egw.lang(_action.id))+" ";
+ messageToDisplay = this.egw.lang("Do you really want to toggle flag %1 for ALL messages in the current folder?",this.egw.lang(_action.id))+" ";
break;
+ default:
+ var type = null;
+ if (_action.id.substr(0,4)=='move' || _action.id === "drop_move_mail")
+ {
+ type = 'Move';
+ }
+ if (_action.id.substr(0,4)=='copy' || _action.id === "drop_copy_mail")
+ {
+ type = 'Copy';
+ }
+ messageToDisplay = this.egw.lang("Do you really want to apply %1 to ALL messages in the current folder?",this.egw.lang(type?type:_action.id))+" ";
}
- return et2_dialog.show_dialog(function(_button_id, _value) {
+ return et2_dialog.show_dialog(function(_button_id) {
var rv = false;
switch (_button_id)
{
From 304dcf42a38127f9092d305740dead4c49050f63 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Tue, 15 Jul 2014 11:35:47 +0000
Subject: [PATCH 37/67] Fix accidently overwritten messages of commit 47671 by
commit 47680
---
mail/js/app.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mail/js/app.js b/mail/js/app.js
index aa8666cf89..99a004c3c2 100644
--- a/mail/js/app.js
+++ b/mail/js/app.js
@@ -1640,7 +1640,7 @@ app.classes.mail = AppJS.extend(
case "flagged":
case "read":
case "undelete":
- messageToDisplay = this.egw.lang("Do you really want to toggle flag %1 for ALL messages in the current folder?",this.egw.lang(_action.id))+" ";
+ messageToDisplay = this.egw.lang("Do you really want to toggle flag %1 for ALL messages in the current view?",this.egw.lang(_action.id))+" ";
break;
default:
var type = null;
@@ -1652,7 +1652,7 @@ app.classes.mail = AppJS.extend(
{
type = 'Copy';
}
- messageToDisplay = this.egw.lang("Do you really want to apply %1 to ALL messages in the current folder?",this.egw.lang(type?type:_action.id))+" ";
+ messageToDisplay = this.egw.lang("Do you really want to apply %1 to ALL messages in the current view?",this.egw.lang(type?type:_action.id))+" ";
}
return et2_dialog.show_dialog(function(_button_id) {
var rv = false;
From 6feb5fa30c19787f4ee86f3ebb7164b43c8a9c6a Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Tue, 15 Jul 2014 12:14:21 +0000
Subject: [PATCH 38/67] Add zip icon to mail attachment save as zip file
---
mail/templates/default/display.xet | 56 ++++++++++-----------
mail/templates/default/images/save_zip.gif | Bin 0 -> 909 bytes
mail/templates/default/index.xet | 52 +++++++++----------
3 files changed, 54 insertions(+), 54 deletions(-)
create mode 100644 mail/templates/default/images/save_zip.gif
diff --git a/mail/templates/default/display.xet b/mail/templates/default/display.xet
index 6385a0ee69..040cd465e5 100644
--- a/mail/templates/default/display.xet
+++ b/mail/templates/default/display.xet
@@ -53,34 +53,34 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mail/templates/default/images/save_zip.gif b/mail/templates/default/images/save_zip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..95bf122cba740e02495658bbcbba8c6dfc2cf0e2
GIT binary patch
literal 909
zcmZ?wbhEHb6krfw_|5;0V3mrgxbT3Xg@J=bfnhg!!Ou}S6l1ZDAEb8b#lJT}cD`xuMC=2YLQlGS-vIzK+~oXRC>6?4lVDQGd*Vm%QB
S(}f2o3NMvA(q*8)U=092=^)(z
literal 0
HcmV?d00001
diff --git a/mail/templates/default/index.xet b/mail/templates/default/index.xet
index 3a767ecdab..007344fc8e 100644
--- a/mail/templates/default/index.xet
+++ b/mail/templates/default/index.xet
@@ -79,32 +79,32 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 17b0c758f8ea23a74b7c9a8c6eab69ba6ead9bca Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Tue, 15 Jul 2014 15:18:06 +0000
Subject: [PATCH 39/67] Fix calendar Category ACL does not apply changes
---
calendar/inc/class.calendar_uiforms.inc.php | 10 +++++-----
calendar/templates/default/cat_acl.xet | 2 +-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php
index 954ff3b539..4e2e73e834 100644
--- a/calendar/inc/class.calendar_uiforms.inc.php
+++ b/calendar/inc/class.calendar_uiforms.inc.php
@@ -2313,7 +2313,7 @@ class calendar_uiforms extends calendar_ui
unset($content['button']);
if ($button != 'cancel') // store changed acl
{
- foreach($content['rows'] as $data)
+ foreach($content as $data)
{
if (!($cat_id = $data['cat_id'])) continue;
foreach(array_merge((array)$data['add'],(array)$data['status'],array_keys((array)$data['old'])) as $account_id)
@@ -2330,7 +2330,7 @@ class calendar_uiforms extends calendar_ui
egw::redirect_link('/admin/index.php', null, 'admin');
}
}
- $content['rows'] = $preserv['rows'] = array();
+ $content= $preserv = array();
$n = 1;
foreach($this->bo->get_cat_rights() as $Lcat_id => $data)
{
@@ -2345,8 +2345,8 @@ class calendar_uiforms extends calendar_ui
if ($rights & calendar_boupdate::CAT_ACL_ADD) $row['add'][] = $account_id;
if ($rights & calendar_boupdate::CAT_ACL_STATUS) $row['status'][] = $account_id;
}
- $content['rows'][$n] = $row;
- $preserv['rows'][$n] = array(
+ $content[$n] = $row;
+ $preserv[$n] = array(
'cat_id' => $cat_id,
'old' => $data,
);
@@ -2354,7 +2354,7 @@ class calendar_uiforms extends calendar_ui
++$n;
}
// add empty row for new entries
- $content['rows'][] = array('cat_id' => '');
+ $content[] = array('cat_id' => '');
$GLOBALS['egw_info']['flags']['app_header'] = lang('Calendar').' - '.lang('Category ACL');
$tmp = new etemplate_new('calendar.cat_acl');
diff --git a/calendar/templates/default/cat_acl.xet b/calendar/templates/default/cat_acl.xet
index 3a4a6e095a..f3ef22a3d3 100644
--- a/calendar/templates/default/cat_acl.xet
+++ b/calendar/templates/default/cat_acl.xet
@@ -6,7 +6,7 @@
-
+
From 10aa07b2fcd53d6fd80e084795f9cfbfcdb0211f Mon Sep 17 00:00:00 2001
From: Nathan Gray
Date: Tue, 15 Jul 2014 15:40:22 +0000
Subject: [PATCH 40/67] Fix extra options not used in read only select-account
---
etemplate/js/et2_widget_selectAccount.js | 32 ++++++++++++++++++++----
1 file changed, 27 insertions(+), 5 deletions(-)
diff --git a/etemplate/js/et2_widget_selectAccount.js b/etemplate/js/et2_widget_selectAccount.js
index a44e883b86..b4f2de90cd 100644
--- a/etemplate/js/et2_widget_selectAccount.js
+++ b/etemplate/js/et2_widget_selectAccount.js
@@ -855,17 +855,13 @@ var et2_selectAccount_ro = et2_link_string.extend([et2_IDetachedDOM],
// No clicks either
.off();
- if(this.options.select_options && this.options.select_options[_value] || this.options.empty_label)
+ if(this.options.select_options && !jQuery.isEmptyObject(this.options.select_options) || this.options.empty_label)
{
if(!_value)
{
// Empty label from selectbox
this.list.append("
"+this.options.empty_label+"
");
}
- else if (this.options.select_options[_value])
- {
- this.list.append("
"+this.options.select_options[_value]+"
");
- }
else if (typeof _value == 'object')
{
// An array with 0 / empty in it?
@@ -882,6 +878,32 @@ var et2_selectAccount_ro = et2_link_string.extend([et2_IDetachedDOM],
}
}
}
+ else
+ {
+ // Options are not indexed, so we must look
+ var search = _value;
+ if (!jQuery.isArray(search))
+ {
+ search = [_value];
+ }
+ for(var j = 0; j < search.length; j++)
+ {
+ var found = false;
+
+ // Not having a value to look up causes an infinite loop
+ if(!search[j]) continue;
+
+ for(var i in this.options.select_options)
+ {
+ if(this.options.select_options[i].value == search[j])
+ {
+ this.list.append("
\n";
}
/**
diff --git a/etemplate/inc/class.etemplate.inc.php b/etemplate/inc/class.etemplate.inc.php
index ba22de8f77..796731995c 100644
--- a/etemplate/inc/class.etemplate.inc.php
+++ b/etemplate/inc/class.etemplate.inc.php
@@ -1423,7 +1423,8 @@ class etemplate extends boetemplate
if ($multiple)
{
// add the set_val to the id to make it unique
- $options = str_replace('id="'.$form_name,'id="'.substr($form_name,0,-2)."[$set_val]",$options);
+ $options = str_replace('id="'.self::get_id($form_name).'"',
+ 'id="'.self::get_id(substr($form_name,0,-2)."[$set_val]"), $options);
}
$html .= html::input($form_name,$set_val,'checkbox',$options);
@@ -1450,7 +1451,8 @@ class etemplate extends boetemplate
$options .= ' checked="checked"';
}
// add the set_val to the id to make it unique
- $options = str_replace('id="'.$form_name,'id="'.$form_name."[$set_val]",$options);
+ $options = str_replace('id="'.self::get_id($form_name).'"',
+ 'id="'.self::get_id(substr($form_name,0,-2)."[$set_val]"), $options);
if ($readonly)
{
@@ -1502,7 +1504,7 @@ class etemplate extends boetemplate
{
if (!empty($img))
{
- $options .= ' title="'.$title.'"';
+ $options .= ' title="'.html::htmlspecialchars($title).'"';
}
if ($cell['onchange'] && $cell['onchange'] != 1)
{
@@ -1990,7 +1992,7 @@ class etemplate extends boetemplate
// if necessary show validation-error behind field
if (isset(self::$validation_errors[$form_name]))
{
- $html .= ' '.self::$validation_errors[$form_name].'';
+ $html .= ' '.htmlspecialchars(self::$validation_errors[$form_name]).'';
}
// generate an extra div, if we have an onclick handler and NO children or it's an extension
//echo "
'.fread($options['stream'], $options['size']);
+ $options['size'] += 5;
fclose($options['stream']);
unset($options['stream']);
- $options['size'] += 4;
}
}
// mitigate risk of html downloads by using CSP or force download for IE
From 5352f55892116babbd91b2111c4afbc775895883 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Thu, 17 Jul 2014 09:12:11 +0000
Subject: [PATCH 64/67] remove no longer used msg lines, as they show up as
white gap
---
admin/templates/default/categories.index.xet | 7 -------
1 file changed, 7 deletions(-)
diff --git a/admin/templates/default/categories.index.xet b/admin/templates/default/categories.index.xet
index 61527b04d6..ac7e4ec37a 100644
--- a/admin/templates/default/categories.index.xet
+++ b/admin/templates/default/categories.index.xet
@@ -66,13 +66,6 @@
-
-
-
-
-
-
-
From 448e1e367502efaf4b18f1e097f45a53b6a5cec6 Mon Sep 17 00:00:00 2001
From: Ralf Becker
Date: Thu, 17 Jul 2014 09:22:54 +0000
Subject: [PATCH 65/67] * Admin: automatic update check displaying an icon for
available (security-)updates for admins, escalating for security updates to
all users after 3 days
---
admin/templates/default/config.tpl | 20 ----
phpgwapi/inc/class.about.inc.php | 11 +-
phpgwapi/inc/class.egw_framework.inc.php | 105 ++++++++++++++++++
phpgwapi/lang/egw_de.lang | 3 +
phpgwapi/lang/egw_en.lang | 3 +
.../idots/class.idots_framework.inc.php | 3 +-
phpgwapi/templates/idots/css/traditional.css | 17 +++
phpgwapi/templates/idots/topmenu.tpl.php | 4 +-
8 files changed, 133 insertions(+), 33 deletions(-)
diff --git a/admin/templates/default/config.tpl b/admin/templates/default/config.tpl
index bd4f1b1bd5..8eae450db2 100644
--- a/admin/templates/default/config.tpl
+++ b/admin/templates/default/config.tpl
@@ -8,26 +8,6 @@
',
'applications' => $apps,
'templates' => $templates,
'translations' => $translations,
diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php
index 3cc08c9f3b..0b441209a8 100644
--- a/phpgwapi/inc/class.egw_framework.inc.php
+++ b/phpgwapi/inc/class.egw_framework.inc.php
@@ -873,6 +873,107 @@ abstract class egw_framework
'id="notificationbell" style="display: none"');
}
+ /**
+ * URL to check for security or maintenance updates
+ */
+ const CURRENT_VERSION_URL = 'http://www.egroupware.org/currentversion';
+ /**
+ * How long to cache (in secs) / often to check for updates
+ */
+ const VERSIONS_CACHE_TIMEOUT = 7200;
+ /**
+ * After how many days of not applied security updates, start warning non-admins too
+ */
+ const WARN_USERS_DAYS = 3;
+
+ /**
+ * Check update status
+ *
+ * @return string
+ * @todo Check from client-side, if server-side check fails
+ */
+ protected static function _get_update_notification()
+ {
+ $versions = egw_cache::getTree(__CLASS__, 'versions', function()
+ {
+ $versions = array();
+ $security = null;
+ if (($remote = file_get_contents(egw_framework::CURRENT_VERSION_URL)))
+ {
+ list($current, $security) = explode("\n", $remote);
+ if (empty($security)) $security = $current;
+ $versions = array(
+ 'current' => $current, // last maintenance update
+ 'security' => $security, // last security update
+ );
+ }
+ return $versions;
+ }, array(), self::VERSIONS_CACHE_TIMEOUT);
+
+ $api = self::api_version();
+
+ if ($versions)
+ {
+ if (version_compare($api, $versions['security'], '<'))
+ {
+ if (!$GLOBALS['egw_info']['user']['apps']['admin'] && !self::update_older($versions['security'], self::WARN_USERS_DAYS))
+ {
+ return null;
+ }
+ return html::a_href(html::image('phpgwapi', 'security-update', lang('EGroupware security update %1 needs to be installed!', $versions['security'])),
+ 'http://www.egroupware.org/changelog', null, ' target="_blank"');
+ }
+ if ($GLOBALS['egw_info']['user']['apps']['admin'] && version_compare($api, $versions['current'], '<'))
+ {
+ return html::a_href(html::image('phpgwapi', 'update', lang('EGroupware maintenance update %1 available', $versions['current'])),
+ 'http://www.egroupware.org/changelog', null, ' target="_blank"');
+ }
+ }
+ elseif ($GLOBALS['egw_info']['user']['apps']['admin'])
+ {
+ return html::a_href(html::image('phpgwapi', 'update', lang('Automatic update check failed, you need to check manually!')),
+ 'http://www.egroupware.org/changelog', null, ' target="_blank" data-api-version="'.$api.'"');
+ }
+ return null;
+ }
+
+ /**
+ * Check if version is older then $days days
+ *
+ * @param string $version eg. "14.1.20140715" last part is checked (only if > 20140000!)
+ * @param int $days
+ * @return boolean
+ */
+ protected static function update_older($version, $days)
+ {
+ list(,,$date) = explode('.', $version);
+ if ($date < 20140000) return false;
+ $version_timestamp = mktime(0, 0, 0, (int)substr($date, 4, 2), (int)substr($date, -2), (int)substr($date, 0, 4));
+
+ return (time() - $version_timestamp) / 86400 > $days;
+ }
+
+ /**
+ * Get API version from changelog or database, whichever is bigger
+ *
+ * @param string &$changelog on return path to changelog
+ * @return string
+ */
+ public static function api_version(&$changelog=null)
+ {
+ $version = preg_replace('/[^0-9.]/', '', $GLOBALS['egw_info']['server']['versions']['phpgwapi']);
+ // parse version from changelog
+ $changelog = EGW_SERVER_ROOT.'/doc/rpm-build/debian.changes';
+ $matches = null;
+ if (($f = fopen($changelog, 'r')) && preg_match('/egroupware-epl \(([0-9.]+)/', fread($f, 80), $matches) &&
+ version_compare($version, $matches[1], '<'))
+ {
+ $version = $matches[1];
+ fclose($f);
+ }
+ return $version;
+ }
+
/**
* Get the link to an application's index page
*
@@ -1373,6 +1474,10 @@ if ($app == 'home') continue;
$this->_add_topmenu_item($apps['logout']);
+ if (($update = self::_get_update_notification()))
+ {
+ $this->_add_topmenu_info_item($update, 'update');
+ }
if($GLOBALS['egw_info']['user']['apps']['notifications'])
{
$this->_add_topmenu_info_item(self::_get_notification_bell(), 'notifications');
diff --git a/phpgwapi/lang/egw_de.lang b/phpgwapi/lang/egw_de.lang
index 5c20ff89bb..2ccc882ae6 100644
--- a/phpgwapi/lang/egw_de.lang
+++ b/phpgwapi/lang/egw_de.lang
@@ -91,6 +91,7 @@ austria common de ÖSTERREICH
author common de Autor
autohide sidebox menu's common de Linkes Navigationsmenü ausblenden
autohide sidebox menus common de Linkes Navigationsmenü ausblenden
+automatic update check failed, you need to check manually! admin de Automatischer Test fehlgeschlagen, Sie müssen selbst überprüfen ob neue Updates vorliegen!
automatically hide the sidebox menu's? common de Automatisch linkes Navigationsmenü ausblenden?
automatically hide the sidebox menus? common de Automatisch linkes Navigationsmenü ausblenden?
autosave default category common de Standard-Kategorie automatisch speichern
@@ -266,6 +267,8 @@ edit categories common de Kategorien editieren
edit category common de Kategorie editieren
egroupware common de EGroupware
egroupware api version common de EGroupware API Version
+egroupware maintenance update %1 available admin de EGroupware Fehlerbehebungsupdate %1 ist verfügbar
+egroupware security update %1 needs to be installed! common de EGroupware Sicherheitsupdate %1 muss installiert werden!
egroupware: login blocked for user '%1', ip %2 common de EGroupware: Anmelden gesperrt für Benutzer '%1', IP %2
egypt common de ÄGYPTEN
el salvador common de EL SALVADOR
diff --git a/phpgwapi/lang/egw_en.lang b/phpgwapi/lang/egw_en.lang
index 5f7b91d2d7..748c167c30 100644
--- a/phpgwapi/lang/egw_en.lang
+++ b/phpgwapi/lang/egw_en.lang
@@ -91,6 +91,7 @@ austria common en AUSTRIA
author common en Author
autohide sidebox menu's common en Autohide side menu
autohide sidebox menus common en Autohide side menu
+automatic update check failed, you need to check manually! admin en Automatic update check failed, you need to check manually!
automatically hide the sidebox menu's? common en Automatically hide the side menu?
automatically hide the sidebox menus? common en Automatically hide the side menu?
autosave default category common en Auto-save default category.
@@ -266,6 +267,8 @@ edit categories common en Edit categories
edit category common en Edit category
egroupware common en EGroupware
egroupware api version common en EGroupware API version
+egroupware maintenance update %1 available admin en EGroupware maintenance update %1 available
+egroupware security update %1 needs to be installed! common en EGroupware security update %1 needs to be installed!
egroupware: login blocked for user '%1', ip %2 common en Login blocked for user '%1', IP %2
egypt common en EGYPT
el salvador common en EL SALVADOR
diff --git a/phpgwapi/templates/idots/class.idots_framework.inc.php b/phpgwapi/templates/idots/class.idots_framework.inc.php
index d6d530477a..e581ca6a63 100644
--- a/phpgwapi/templates/idots/class.idots_framework.inc.php
+++ b/phpgwapi/templates/idots/class.idots_framework.inc.php
@@ -450,8 +450,7 @@ class idots_framework extends egw_framework
*/
function _add_topmenu_info_item($content, $id=null)
{
- unset($id); // unused, but required in function signature
- $this->tplsav2->menuinfoitems[] = $content;
+ $this->tplsav2->menuinfoitems[$id] = $content;
}
/**
diff --git a/phpgwapi/templates/idots/css/traditional.css b/phpgwapi/templates/idots/css/traditional.css
index c3c122ea73..2e044d328f 100755
--- a/phpgwapi/templates/idots/css/traditional.css
+++ b/phpgwapi/templates/idots/css/traditional.css
@@ -324,6 +324,23 @@ body {
#topmenu_info
{
float:right;
+ white-space: nowrap;
+}
+
+.topmenu_info_item {
+ display: inline-block;
+ padding-left: 8px;
+ position: relative;
+}
+#topmenu_info_update {
+ position: relative;
+ padding-right: 16px;
+ display: inline;
+}
+#topmenu_info_update a img {
+ height: 32px;
+ position: absolute;
+ z-index: 10000;
}
#divUpperTabs
diff --git a/phpgwapi/templates/idots/topmenu.tpl.php b/phpgwapi/templates/idots/topmenu.tpl.php
index 1529c9cfc4..90087898d6 100644
--- a/phpgwapi/templates/idots/topmenu.tpl.php
+++ b/phpgwapi/templates/idots/topmenu.tpl.php
@@ -18,8 +18,8 @@
- menuinfoitems as $mitems):?>
-
+ menuinfoitems as $id => $mitems):?>
+
From 24606be5821a81359a9d17ab8022e4007b1d7ec2 Mon Sep 17 00:00:00 2001
From: Klaus Leithoff
Date: Thu, 17 Jul 2014 09:59:14 +0000
Subject: [PATCH 66/67] handle all text string for move and delete action
success message
---
mail/inc/class.mail_ui.inc.php | 11 +++++++----
mail/lang/egw_de.lang | 2 ++
mail/lang/egw_en.lang | 2 ++
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php
index 0ea6096f94..6e84a53544 100644
--- a/mail/inc/class.mail_ui.inc.php
+++ b/mail/inc/class.mail_ui.inc.php
@@ -4229,6 +4229,7 @@ class mail_ui
{
if(mail_bo::$debug) error_log(__METHOD__."->".print_r($_messageList,true).' Method:'.$_forceDeleteMethod);
$error = null;
+ $filtered = false;
if ($_messageList=='all' || !empty($_messageList['msg']))
{
if (isset($_messageList['all']) && $_messageList['all'])
@@ -4247,6 +4248,7 @@ class mail_ui
emailadmin_imapbase::$supportsORinQuery = egw_cache::getCache(egw_cache::INSTANCE,'email','supportsORinQuery'.trim($GLOBALS['egw_info']['user']['account_id']), null, array(), 60*60*10);
if (!isset(emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID])) emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]=true;
}
+ $filtered = true;
$filter = array('filterName' => (emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]?lang('quicksearch'):lang('subject')),'type' => ($query['filter2']?$query['filter2']:(emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]?'quick':'subject')),'string' => $query['search'],'status' => (!empty($query['filter'])?$query['filter']:'any'));
}
else
@@ -4303,7 +4305,7 @@ class mail_ui
$response = egw_json_response::get();
if (empty($error))
{
- $response->call('app.mail.mail_deleteMessagesShowResult',array('egw_message'=>lang('deleted %1 messages in %2',($messageList=='all'||$_messageList['all']?lang('all'):count($_messageList['msg'])),$folder),'msg'=>$_messageList['msg']));
+ $response->call('app.mail.mail_deleteMessagesShowResult',array('egw_message'=>lang('deleted %1 messages in %2',($messageList=='all'||$_messageList['all']?($filtered?lang('all filtered'):lang('all')):count($_messageList['msg'])),$folder),'msg'=>$_messageList['msg']));
}
else
{
@@ -4350,7 +4352,7 @@ class mail_ui
$lastFoldersUsedForMoveCont[$targetProfileID][$targetFolder]=$_folderName;
$changeFolderActions = true;
}
-
+ $filtered = false;
if ($_messageList=='all' || !empty($_messageList['msg']))
{
$error=false;
@@ -4371,6 +4373,7 @@ class mail_ui
emailadmin_imapbase::$supportsORinQuery = egw_cache::getCache(egw_cache::INSTANCE,'email','supportsORinQuery'.trim($GLOBALS['egw_info']['user']['account_id']), null, array(), 60*60*10);
if (!isset(emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID])) emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]=true;
}
+ $filtered = true;
$filter = array('filterName' => (emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]?lang('quicksearch'):lang('subject')),'type' => ($query['filter2']?$query['filter2']:(emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]?'quick':'subject')),'string' => $query['search'],'status' => (!empty($query['filter'])?$query['filter']:'any'));
}
else
@@ -4454,11 +4457,11 @@ class mail_ui
{
if ($_copyOrMove=='copy')
{
- $response->call('egw.message',lang('copied %1 message(s) from %2 to %3',count($messageList),$folder,$targetFolder));
+ $response->call('egw.message',lang('copied %1 message(s) from %2 to %3',($messageList=='all'||$_messageList['all']?($filtered?lang('all filtered'):lang('all')):count($messageList)),$folder,$targetFolder));
}
else
{
- $response->call('egw.refresh',lang('moved %1 message(s) from %2 to %3',count($messageList),$folder,$targetFolder),'mail',$messageListForRefresh,'delete');
+ $response->call('egw.refresh',lang('moved %1 message(s) from %2 to %3',($messageList=='all'||$_messageList['all']?($filtered?lang('all filtered'):lang('all')):count($messageList)),$folder,$targetFolder),'mail',$messageListForRefresh,'delete');
}
}
if ($changeFolderActions == true)
diff --git a/mail/lang/egw_de.lang b/mail/lang/egw_de.lang
index f72016aeda..a306be8ebb 100644
--- a/mail/lang/egw_de.lang
+++ b/mail/lang/egw_de.lang
@@ -18,8 +18,10 @@ add all my aliases mail de Alle Alias Adressen hinzufügen
add folder mail de Neuer Ordner
add to addressbook mail de zum Adressbuch hinzufügen
aliases+forwards mail de Aliase+Weiterleitungen
+all mail de alle
all adresses: mail de Alle Adressen
all available info admin de alle verfügbaren Informationen
+all filtered mail de alle gefilterten
all messages in the folder will be lost mail de Alle Nachrichten in dem ausgewählten Ordner werden unwiderruflich gelöscht werden.
all of mail de alle
all subfolders will be deleted too, and all messages in all affected folders will be lost mail de Alle Unterordner und Nachrichten in den betroffenen Ordnern werden unwiederruflich gelöscht.
diff --git a/mail/lang/egw_en.lang b/mail/lang/egw_en.lang
index 4ae627f144..b4430f458c 100644
--- a/mail/lang/egw_en.lang
+++ b/mail/lang/egw_en.lang
@@ -18,8 +18,10 @@ add all my aliases mail en Add all my aliases
add folder mail en Add Folder
add to addressbook mail en add to addressbook
aliases+forwards mail en Aliases+Forwards
+all mail en all
all adresses: mail en All Adresses:
all available info admin en all available info
+all filtered mail en all filtered
all messages in the folder will be lost mail en All messages in the folder will be lost
all of mail en all of
all subfolders will be deleted too, and all messages in all affected folders will be lost mail en All subfolders will be deleted too, and all messages in all affected folders will be lost
From 52a4a3ddd05a644f8182be717e18b012c6779733 Mon Sep 17 00:00:00 2001
From: Hadi Nategh
Date: Thu, 17 Jul 2014 10:10:43 +0000
Subject: [PATCH 67/67] Add zip icon to jdots and idots templates and apply zip
icon to context menu
---
filemanager/inc/class.filemanager_ui.inc.php | 2 +-
filemanager/templates/default/images/save_zip.gif | Bin 0 -> 909 bytes
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 filemanager/templates/default/images/save_zip.gif
diff --git a/filemanager/inc/class.filemanager_ui.inc.php b/filemanager/inc/class.filemanager_ui.inc.php
index 5483968216..4ee64ba526 100644
--- a/filemanager/inc/class.filemanager_ui.inc.php
+++ b/filemanager/inc/class.filemanager_ui.inc.php
@@ -135,7 +135,7 @@ class filemanager_ui
'caption' => lang('Save as ZIP'),
'group' => $group,
'allowOnMultiple' => true,
- 'icon' => 'filesave',
+ 'icon' => 'save_zip',
'postSubmit' => true
),
'edit' => array(
diff --git a/filemanager/templates/default/images/save_zip.gif b/filemanager/templates/default/images/save_zip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..95bf122cba740e02495658bbcbba8c6dfc2cf0e2
GIT binary patch
literal 909
zcmZ?wbhEHb6krfw_|5;0V3mrgxbT3Xg@J=bfnhg!!Ou}S6l1ZDAEb8b#lJT}cD`xuMC=2YLQlGS-vIzK+~oXRC>6?4lVDQGd*Vm%QB
S(}f2o3NMvA(q*8)U=092=^)(z
literal 0
HcmV?d00001