aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/dav/lib/Connector/Sabre/Directory.php11
-rw-r--r--apps/files/css/files.scss3
-rw-r--r--apps/files/templates/appnavigation.php2
-rw-r--r--apps/files_external/l10n/de.js1
-rw-r--r--apps/files_external/l10n/de.json1
-rw-r--r--apps/files_external/l10n/de_DE.js1
-rw-r--r--apps/files_external/l10n/de_DE.json1
-rw-r--r--apps/files_external/l10n/fr.js1
-rw-r--r--apps/files_external/l10n/fr.json1
-rw-r--r--apps/files_external/l10n/it.js1
-rw-r--r--apps/files_external/l10n/it.json1
-rw-r--r--apps/files_external/l10n/pt_BR.js1
-rw-r--r--apps/files_external/l10n/pt_BR.json1
-rw-r--r--apps/files_external/l10n/ru.js1
-rw-r--r--apps/files_external/l10n/ru.json1
-rw-r--r--apps/files_external/l10n/tr.js1
-rw-r--r--apps/files_external/l10n/tr.json1
-rw-r--r--core/css/icons.scss4
-rw-r--r--core/css/styles.scss34
-rw-r--r--core/img/actions/quota.svg (renamed from apps/files/img/quota.svg)0
-rw-r--r--core/l10n/da.js2
-rw-r--r--core/l10n/da.json2
-rw-r--r--lib/private/Template/SCSSCacher.php6
-rw-r--r--settings/css/settings.scss36
-rw-r--r--settings/l10n/el.js1
-rw-r--r--settings/l10n/el.json1
-rw-r--r--settings/templates/settings/personal/personal.info.php50
27 files changed, 90 insertions, 76 deletions
diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php
index a7b8ea1755e..aaf5f54ec26 100644
--- a/apps/dav/lib/Connector/Sabre/Directory.php
+++ b/apps/dav/lib/Connector/Sabre/Directory.php
@@ -28,6 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+
namespace OCA\DAV\Connector\Sabre;
use OC\Files\View;
@@ -147,8 +148,16 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node
$info = new \OC\Files\FileInfo($path, null, null, [], null);
}
$node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info);
+
+ // only allow 1 process to upload a file at once but still allow reading the file while writing the part file
$node->acquireLock(ILockingProvider::LOCK_SHARED);
- return $node->put($data);
+ $this->fileView->lockFile($path . '.upload.part', ILockingProvider::LOCK_EXCLUSIVE);
+
+ $result = $node->put($data);
+
+ $this->fileView->unlockFile($path . '.upload.part', ILockingProvider::LOCK_EXCLUSIVE);
+ $node->releaseLock(ILockingProvider::LOCK_SHARED);
+ return $result;
} catch (\OCP\Files\StorageNotAvailableException $e) {
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage(), $e->getCode(), $e);
} catch (InvalidPathException $ex) {
diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss
index b89332248f7..d2d810c1e6c 100644
--- a/apps/files/css/files.scss
+++ b/apps/files/css/files.scss
@@ -105,9 +105,6 @@
.nav-icon-trashbin {
background-image: url('../img/delete.svg?v=1');
}
-.nav-icon-quota {
- background-image: url('../img/quota.svg?v=1');
-}
#app-navigation .nav-files a.nav-icon-files {
width: auto;
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
index a85e2515a92..c811ace8abe 100644
--- a/apps/files/templates/appnavigation.php
+++ b/apps/files/templates/appnavigation.php
@@ -15,7 +15,7 @@
if ($_['quota'] !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
?>has-tooltip" title="<?php p($_['usage_relative'] . '%');
} ?>">
- <a href="#" class="nav-icon-quota svg">
+ <a href="#" class="icon-quota svg">
<p id="quotatext"><?php
if ($_['quota'] !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
p($l->t('%s of %s used', [$_['usage'], $_['total_space']]));
diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js
index 6fafc3e5489..eefbbe8c409 100644
--- a/apps/files_external/l10n/de.js
+++ b/apps/files_external/l10n/de.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Check for changes" : "Auf Änderungen prüfen",
"Never" : "Nie",
"Once every direct access" : "Einmal bei jedem Direktzugriff",
+ "Read only" : "Schreibgeschützt",
"Folder name" : "Ordnername",
"External storage" : "Externer Speicher",
"Authentication" : "Authentifizierung",
diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json
index 89f089605b9..50c07260636 100644
--- a/apps/files_external/l10n/de.json
+++ b/apps/files_external/l10n/de.json
@@ -110,6 +110,7 @@
"Check for changes" : "Auf Änderungen prüfen",
"Never" : "Nie",
"Once every direct access" : "Einmal bei jedem Direktzugriff",
+ "Read only" : "Schreibgeschützt",
"Folder name" : "Ordnername",
"External storage" : "Externer Speicher",
"Authentication" : "Authentifizierung",
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index ca2d37523b2..13e44ab0cb9 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Check for changes" : "Auf Änderungen prüfen",
"Never" : "Nie",
"Once every direct access" : "Einmal bei jedem Direktzugriff",
+ "Read only" : "Schreibgeschützt",
"Folder name" : "Ordnername",
"External storage" : "Externer Speicher",
"Authentication" : "Authentifizierung",
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index 4ab53e25cbc..1f19a325427 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -110,6 +110,7 @@
"Check for changes" : "Auf Änderungen prüfen",
"Never" : "Nie",
"Once every direct access" : "Einmal bei jedem Direktzugriff",
+ "Read only" : "Schreibgeschützt",
"Folder name" : "Ordnername",
"External storage" : "Externer Speicher",
"Authentication" : "Authentifizierung",
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index 7533b976a14..a3b12150d45 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Check for changes" : "Rechercher les modifications",
"Never" : "Jamais",
"Once every direct access" : "Une fois à chaque accès direct",
+ "Read only" : "Lecture seule",
"Folder name" : "Nom du dossier",
"External storage" : "Stockage externe",
"Authentication" : "Authentification",
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index 73b8bc28c5b..8b0bc077c0e 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -110,6 +110,7 @@
"Check for changes" : "Rechercher les modifications",
"Never" : "Jamais",
"Once every direct access" : "Une fois à chaque accès direct",
+ "Read only" : "Lecture seule",
"Folder name" : "Nom du dossier",
"External storage" : "Stockage externe",
"Authentication" : "Authentification",
diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js
index 26cf94da6d5..f8ac97f6f68 100644
--- a/apps/files_external/l10n/it.js
+++ b/apps/files_external/l10n/it.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Check for changes" : "Controlla le modifiche",
"Never" : "Mai",
"Once every direct access" : "Una volta per ogni accesso diretto",
+ "Read only" : "Sola lettura",
"Folder name" : "Nome della cartella",
"External storage" : "Archiviazione esterna",
"Authentication" : "Autenticazione",
diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json
index a8151db2395..6495f32fc8d 100644
--- a/apps/files_external/l10n/it.json
+++ b/apps/files_external/l10n/it.json
@@ -110,6 +110,7 @@
"Check for changes" : "Controlla le modifiche",
"Never" : "Mai",
"Once every direct access" : "Una volta per ogni accesso diretto",
+ "Read only" : "Sola lettura",
"Folder name" : "Nome della cartella",
"External storage" : "Archiviazione esterna",
"Authentication" : "Autenticazione",
diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js
index f1624a0f9ea..a04fc14c8a3 100644
--- a/apps/files_external/l10n/pt_BR.js
+++ b/apps/files_external/l10n/pt_BR.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Check for changes" : "Verifique se há alterações",
"Never" : "Nunca",
"Once every direct access" : "Uma vez a cada acesso direto",
+ "Read only" : "Somente leitura",
"Folder name" : "Nome da pasta",
"External storage" : "Armazenamento Externo",
"Authentication" : "Autenticação",
diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json
index 80d6ba18e09..bfe10a37539 100644
--- a/apps/files_external/l10n/pt_BR.json
+++ b/apps/files_external/l10n/pt_BR.json
@@ -110,6 +110,7 @@
"Check for changes" : "Verifique se há alterações",
"Never" : "Nunca",
"Once every direct access" : "Uma vez a cada acesso direto",
+ "Read only" : "Somente leitura",
"Folder name" : "Nome da pasta",
"External storage" : "Armazenamento Externo",
"Authentication" : "Autenticação",
diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js
index 39e02bdabde..fbb90ba4a89 100644
--- a/apps/files_external/l10n/ru.js
+++ b/apps/files_external/l10n/ru.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Check for changes" : "Проверять изменения",
"Never" : "Никогда",
"Once every direct access" : "Каждый раз при прямом доступе",
+ "Read only" : "Только чтение",
"Folder name" : "Имя папки",
"External storage" : "Внешнее хранилище",
"Authentication" : "Способ авторизации",
diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json
index 387b9087209..ff6df5b9a55 100644
--- a/apps/files_external/l10n/ru.json
+++ b/apps/files_external/l10n/ru.json
@@ -110,6 +110,7 @@
"Check for changes" : "Проверять изменения",
"Never" : "Никогда",
"Once every direct access" : "Каждый раз при прямом доступе",
+ "Read only" : "Только чтение",
"Folder name" : "Имя папки",
"External storage" : "Внешнее хранилище",
"Authentication" : "Способ авторизации",
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index 9d854556b97..bcc1c64cc0c 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Check for changes" : "Değişiklikleri denetle",
"Never" : "Asla",
"Once every direct access" : "Her doğrudan erişimde bir kez",
+ "Read only" : "Salt okunur",
"Folder name" : "Klasör adı",
"External storage" : "Dış depolama",
"Authentication" : "Kimlik Doğrulama",
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index 4376d41228c..73ebf0c7759 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -110,6 +110,7 @@
"Check for changes" : "Değişiklikleri denetle",
"Never" : "Asla",
"Once every direct access" : "Her doğrudan erişimde bir kez",
+ "Read only" : "Salt okunur",
"Folder name" : "Klasör adı",
"External storage" : "Dış depolama",
"Authentication" : "Kimlik Doğrulama",
diff --git a/core/css/icons.scss b/core/css/icons.scss
index 775decfa3a8..8f2d4748754 100644
--- a/core/css/icons.scss
+++ b/core/css/icons.scss
@@ -300,6 +300,10 @@ img, object, video, button, textarea, input, select, div[contenteditable=true] {
background-image: url('../img/actions/public.svg?v=1');
}
+.icon-quota {
+ background-image: url('../img/actions/quota.svg?v=1');
+}
+
.icon-rename {
background-image: url('../img/actions/rename.svg?v=1');
}
diff --git a/core/css/styles.scss b/core/css/styles.scss
index 0bbd89f075b..736713c3e7a 100644
--- a/core/css/styles.scss
+++ b/core/css/styles.scss
@@ -927,40 +927,6 @@ code {
font-family: 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', monospace;
}
-#body-settings #quota {
- cursor: default;
- margin: 30px !important;
- position: relative;
- padding: 0 !important;
- progress {
- height: 36px;
- &::-moz-progress-bar {
- border-radius: 3px 0 0 3px;
- }
- &::-webkit-progress-value {
- border-radius: 3px 0 0 3px;
- }
- }
- div {
- font-weight: normal;
- white-space: nowrap;
- position: absolute;;
- top: 0;
- &.quotatext-bg {
- mix-blend-mode: luminosity;
- }
- &.quotatext-fg {
- color: $color-primary-text;
- overflow: hidden;
- z-index: 50;
- max-width: 100%;
- }
- .quotatext {
- padding: .6em 1em;
- }
- }
-}
-
.pager {
list-style: none;
float: right;
diff --git a/apps/files/img/quota.svg b/core/img/actions/quota.svg
index 691cb29efce..691cb29efce 100644
--- a/apps/files/img/quota.svg
+++ b/core/img/actions/quota.svg
diff --git a/core/l10n/da.js b/core/l10n/da.js
index 882685fb124..005c28c0d43 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -266,6 +266,8 @@ OC.L10N.register(
"More apps" : "Flere apps",
"Search" : "Søg",
"Reset search" : "Nulstil søgning",
+ "Contacts" : "Kontakter",
+ "Contacts menu" : "Menuen kontakter",
"Confirm your password" : "Bekræft dit password",
"Server side authentication failed!" : "Server side godkendelse mislykkedes!",
"Please contact your administrator." : "Kontakt venligst din administrator.",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index 620bec0372f..b5863376fc1 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -264,6 +264,8 @@
"More apps" : "Flere apps",
"Search" : "Søg",
"Reset search" : "Nulstil søgning",
+ "Contacts" : "Kontakter",
+ "Contacts menu" : "Menuen kontakter",
"Confirm your password" : "Bekræft dit password",
"Server side authentication failed!" : "Server side godkendelse mislykkedes!",
"Please contact your administrator." : "Kontakt venligst din administrator.",
diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php
index 6fb9d11953b..6e25e1fa5de 100644
--- a/lib/private/Template/SCSSCacher.php
+++ b/lib/private/Template/SCSSCacher.php
@@ -273,7 +273,11 @@ class SCSSCacher {
$appDirectory = $this->appData->getDirectoryListing();
foreach ($appDirectory as $folder) {
foreach ($folder->getDirectoryListing() as $file) {
- $file->delete();
+ try {
+ $file->delete();
+ } catch(NotPermittedException $e) {
+ $this->logger->logException($e, ['message' => 'SCSSCacher: unable to delete file: ' . $file->getName()]);
+ }
}
}
}
diff --git a/settings/css/settings.scss b/settings/css/settings.scss
index a040ee6195a..3e7e5576640 100644
--- a/settings/css/settings.scss
+++ b/settings/css/settings.scss
@@ -52,9 +52,6 @@ input {
#displayavatar {
text-align: center;
- p {
- text-align: left;
- }
}
#uploadavatarbutton, #selectavatar, #removeavatar {
@@ -119,6 +116,7 @@ input {
background-size: 16px;
background-position: left 8px;
opacity: .3;
+ margin-top: -2px;
margin-left: 10px;
cursor: pointer;
@@ -162,6 +160,16 @@ input {
.section {
padding: 10px 10px;
}
+
+ .personal-info {
+ margin-right: 10%;
+ margin-bottom: 20px;
+ }
+ .personal-info[class^='icon-'], .personal-info[class*=' icon-'] {
+ background-position: 0px 2px;
+ padding-left: 30px;
+ opacity: 0.7;
+ }
}
@@ -234,7 +242,7 @@ input {
margin-bottom: 12px;
display: inline-flex;
flex-wrap: nowrap;
- justify-content: space-between;
+ justify-content: flex-start;
width: 100%;
> label {
white-space: nowrap;
@@ -272,6 +280,26 @@ input {
}
}
+
+#body-settings #quota {
+ cursor: default;
+ position: relative;
+ progress {
+ height: 6px;
+ &::-moz-progress-bar {
+ border-radius: 3px 0 0 3px;
+ }
+ &::-webkit-progress-value {
+ border-radius: 3px 0 0 3px;
+ }
+ }
+ div {
+ font-weight: normal;
+ white-space: nowrap;
+ }
+}
+
+
/* verify accounts */
/* only show pointer cursor when popup will be there */
.verification-dialog {
diff --git a/settings/l10n/el.js b/settings/l10n/el.js
index dbd8f865939..4f5a4d45c25 100644
--- a/settings/l10n/el.js
+++ b/settings/l10n/el.js
@@ -258,6 +258,7 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μόνο με χρήστες που ανήκουν στις ομάδες τους",
"Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό",
"These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username or email address needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης του ονόματος χρήστη στο πεδίο διαμοιρασμού. Αν η ρύθμιση αυτή είναι απενεργοποιημένη θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη ή το email του. ",
"This text will be shown on the public link upload page when the file list is hidden." : "Αυτό το κείμενο θα ",
"Tips & tricks" : "Συμβουλές & τεχνάσματα",
"How to do backups" : "Πώς να κάνετε αντίγραφα ασφαλείας",
diff --git a/settings/l10n/el.json b/settings/l10n/el.json
index 30c4fb7829e..9a440e76d72 100644
--- a/settings/l10n/el.json
+++ b/settings/l10n/el.json
@@ -256,6 +256,7 @@
"Restrict users to only share with users in their groups" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μόνο με χρήστες που ανήκουν στις ομάδες τους",
"Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό",
"These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username or email address needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης του ονόματος χρήστη στο πεδίο διαμοιρασμού. Αν η ρύθμιση αυτή είναι απενεργοποιημένη θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη ή το email του. ",
"This text will be shown on the public link upload page when the file list is hidden." : "Αυτό το κείμενο θα ",
"Tips & tricks" : "Συμβουλές & τεχνάσματα",
"How to do backups" : "Πώς να κάνετε αντίγραφα ασφαλείας",
diff --git a/settings/templates/settings/personal/personal.info.php b/settings/templates/settings/personal/personal.info.php
index 24f89076275..e581e6d39e6 100644
--- a/settings/templates/settings/personal/personal.info.php
+++ b/settings/templates/settings/personal/personal.info.php
@@ -37,34 +37,6 @@ vendor_style('jcrop/css/jquery.Jcrop');
?>
-<div id="quota" class="section">
- <progress value="<?php p($_['usage_relative']); ?>" max="100"
- <?php if($_['usage_relative'] > 80): ?> class="warn" <?php endif; ?>></progress>
-
- <div style="width:<?php p($_['usage_relative']);?>%" class="quotatext-fg">
- <p class="quotatext">
- <?php if ($_['quota'] === \OCP\Files\FileInfo::SPACE_UNLIMITED): ?>
- <?php print_unescaped($l->t('You are using <strong>%s</strong> of <strong>%s</strong>',
- [$_['usage'], $_['total_space']]));?>
- <?php else: ?>
- <?php print_unescaped($l->t('You are using <strong>%s</strong> of <strong>%s</strong> (<strong>%s %%</strong>)',
- [$_['usage'], $_['total_space'], $_['usage_relative']]));?>
- <?php endif ?>
- </p>
- </div>
- <div class="quotatext-bg">
- <p class="quotatext">
- <?php if ($_['quota'] === \OCP\Files\FileInfo::SPACE_UNLIMITED): ?>
- <?php print_unescaped($l->t('You are using <strong>%s</strong> of <strong>%s</strong>',
- [$_['usage'], $_['total_space']]));?>
- <?php else: ?>
- <?php print_unescaped($l->t('You are using <strong>%s</strong> of <strong>%s</strong> (<strong>%s %%</strong>)',
- [$_['usage'], $_['total_space'], $_['usage_relative']]));?>
- <?php endif ?>
- </p>
- </div>
-</div>
-
<div id="personal-settings">
<div id="personal-settings-avatar-container" class="personal-settings-container">
<div>
@@ -100,14 +72,28 @@ vendor_style('jcrop/css/jquery.Jcrop');
<?php } ?>
</form>
</div>
- <div class="personal-settings-setting-box personal-settings-group-box">
- <div id="groups" class="section">
- <h2><?php p($l->t('Groups')); ?></h2>
- <p><?php p($l->t('You are member of the following groups:')); ?></p>
+ <div class="personal-settings-setting-box personal-settings-group-box section">
+ <h2><?php p($l->t('Details')); ?></h2>
+ <div id="groups" class="personal-info icon-user">
+ <p class="icon-groups"><?php p($l->t('You are member of the following groups:')); ?></p>
<p id="groups-groups">
<strong><?php p(implode(', ', $_['groups'])); ?></strong>
</p>
</div>
+ <div id="quota" class="personal-info icon-quota">
+ <div class="quotatext-bg">
+ <p class="quotatext">
+ <?php if ($_['quota'] === \OCP\Files\FileInfo::SPACE_UNLIMITED): ?>
+ <?php print_unescaped($l->t('You are using <strong>%s</strong>',
+ [$_['usage']]));?>
+ <?php else: ?>
+ <?php print_unescaped($l->t('You are using <strong>%s</strong> of <strong>%s</strong> (<strong>%s %%</strong>)',
+ [$_['usage'], $_['total_space'], $_['usage_relative']]));?>
+ <?php endif ?>
+ </p>
+ </div>
+ <progress value="<?php p($_['usage_relative']); ?>" max="100"<?php if($_['usage_relative'] > 80): ?> class="warn" <?php endif; ?>></progress>
+ </div>
</div>
</div>