diff options
-rw-r--r-- | .docker/nginx.conf | 43 | ||||
-rw-r--r-- | .dockerignore | 11 | ||||
-rw-r--r-- | .htaccess | 2 | ||||
-rw-r--r-- | assets/vintage/css/shaarli.css | 61 | ||||
-rw-r--r-- | doc/md/Docker.md | 7 | ||||
-rw-r--r-- | doc/md/Server-configuration.md | 42 | ||||
-rw-r--r-- | docker-compose.yml | 9 | ||||
-rw-r--r-- | tpl/vintage/daily.html | 8 | ||||
-rw-r--r-- | tpl/vintage/editlink.html | 32 | ||||
-rw-r--r-- | tpl/vintage/page.header.html | 24 |
10 files changed, 163 insertions, 76 deletions
diff --git a/.docker/nginx.conf b/.docker/nginx.conf index 023f52c1..30810a87 100644 --- a/.docker/nginx.conf +++ b/.docker/nginx.conf | |||
@@ -17,27 +17,13 @@ http { | |||
17 | index index.html index.php; | 17 | index index.html index.php; |
18 | 18 | ||
19 | server { | 19 | server { |
20 | listen 80; | 20 | listen 80; |
21 | root /var/www/shaarli; | 21 | root /var/www/shaarli; |
22 | 22 | ||
23 | access_log /var/log/nginx/shaarli.access.log; | 23 | access_log /var/log/nginx/shaarli.access.log; |
24 | error_log /var/log/nginx/shaarli.error.log; | 24 | error_log /var/log/nginx/shaarli.error.log; |
25 | 25 | ||
26 | location ~ /\. { | 26 | location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ { |
27 | # deny access to dotfiles | ||
28 | access_log off; | ||
29 | log_not_found off; | ||
30 | deny all; | ||
31 | } | ||
32 | |||
33 | location ~ ~$ { | ||
34 | # deny access to temp editor files, e.g. "script.php~" | ||
35 | access_log off; | ||
36 | log_not_found off; | ||
37 | deny all; | ||
38 | } | ||
39 | |||
40 | location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { | ||
41 | # cache static assets | 27 | # cache static assets |
42 | expires max; | 28 | expires max; |
43 | add_header Pragma public; | 29 | add_header Pragma public; |
@@ -49,30 +35,25 @@ http { | |||
49 | alias /var/www/shaarli/images/favicon.ico; | 35 | alias /var/www/shaarli/images/favicon.ico; |
50 | } | 36 | } |
51 | 37 | ||
38 | location /doc/html/ { | ||
39 | default_type "text/html"; | ||
40 | try_files $uri $uri/ $uri.html =404; | ||
41 | } | ||
42 | |||
52 | location / { | 43 | location / { |
53 | # Slim - rewrite URLs | 44 | # Slim - rewrite URLs & do NOT serve static files through this location |
54 | try_files $uri /index.php$is_args$args; | 45 | try_files _ /index.php$is_args$args; |
55 | } | 46 | } |
56 | 47 | ||
57 | location ~ (index)\.php$ { | 48 | location ~ index\.php$ { |
58 | # Slim - split URL path into (script_filename, path_info) | 49 | # Slim - split URL path into (script_filename, path_info) |
59 | try_files $uri =404; | 50 | try_files $uri =404; |
60 | fastcgi_split_path_info ^(.+\.php)(/.+)$; | 51 | fastcgi_split_path_info ^(index.php)(/.+)$; |
61 | 52 | ||
62 | # filter and proxy PHP requests to PHP-FPM | 53 | # filter and proxy PHP requests to PHP-FPM |
63 | fastcgi_pass unix:/var/run/php-fpm.sock; | 54 | fastcgi_pass unix:/var/run/php-fpm.sock; |
64 | fastcgi_index index.php; | 55 | fastcgi_index index.php; |
65 | include fastcgi.conf; | 56 | include fastcgi.conf; |
66 | } | 57 | } |
67 | |||
68 | location ~ /doc/ { | ||
69 | default_type "text/html"; | ||
70 | try_files $uri $uri/ $uri.html =404; | ||
71 | } | ||
72 | |||
73 | location ~ \.php$ { | ||
74 | # deny access to all other PHP scripts | ||
75 | deny all; | ||
76 | } | ||
77 | } | 58 | } |
78 | } | 59 | } |
diff --git a/.dockerignore b/.dockerignore index 96fd31c5..19fd87a5 100644 --- a/.dockerignore +++ b/.dockerignore | |||
@@ -2,8 +2,16 @@ | |||
2 | .dev | 2 | .dev |
3 | .git | 3 | .git |
4 | .github | 4 | .github |
5 | .gitattributes | ||
6 | .gitignore | ||
7 | .travis.yml | ||
5 | tests | 8 | tests |
6 | 9 | ||
10 | # Docker related resources are not needed inside the container | ||
11 | .dockerignore | ||
12 | Dockerfile | ||
13 | Dockerfile.armhf | ||
14 | |||
7 | # Docker Compose resources | 15 | # Docker Compose resources |
8 | docker-compose.yml | 16 | docker-compose.yml |
9 | 17 | ||
@@ -13,6 +21,9 @@ data/* | |||
13 | pagecache/* | 21 | pagecache/* |
14 | tmp/* | 22 | tmp/* |
15 | 23 | ||
24 | # Shaarli's docs are created during the build | ||
25 | doc/html/ | ||
26 | |||
16 | # Eclipse project files | 27 | # Eclipse project files |
17 | .settings | 28 | .settings |
18 | .buildpath | 29 | .buildpath |
@@ -13,7 +13,7 @@ RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] | |||
13 | # Alternative (if the 2 lines above don't work) | 13 | # Alternative (if the 2 lines above don't work) |
14 | # SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 | 14 | # SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 |
15 | 15 | ||
16 | # REST API | 16 | # Slim URL Redirection |
17 | # Ionos Hosting needs RewriteBase / | 17 | # Ionos Hosting needs RewriteBase / |
18 | # RewriteBase / | 18 | # RewriteBase / |
19 | RewriteCond %{REQUEST_FILENAME} !-f | 19 | RewriteCond %{REQUEST_FILENAME} !-f |
diff --git a/assets/vintage/css/shaarli.css b/assets/vintage/css/shaarli.css index 1688dce0..33e178af 100644 --- a/assets/vintage/css/shaarli.css +++ b/assets/vintage/css/shaarli.css | |||
@@ -1122,6 +1122,16 @@ ul.errors { | |||
1122 | float: left; | 1122 | float: left; |
1123 | } | 1123 | } |
1124 | 1124 | ||
1125 | ul.warnings { | ||
1126 | color: orange; | ||
1127 | float: left; | ||
1128 | } | ||
1129 | |||
1130 | ul.successes { | ||
1131 | color: green; | ||
1132 | float: left; | ||
1133 | } | ||
1134 | |||
1125 | #pluginsadmin { | 1135 | #pluginsadmin { |
1126 | width: 80%; | 1136 | width: 80%; |
1127 | padding: 20px 0 0 20px; | 1137 | padding: 20px 0 0 20px; |
@@ -1248,3 +1258,54 @@ ul.errors { | |||
1248 | width: 0%; | 1258 | width: 0%; |
1249 | height: 10px; | 1259 | height: 10px; |
1250 | } | 1260 | } |
1261 | |||
1262 | .loading-input { | ||
1263 | position: relative; | ||
1264 | } | ||
1265 | |||
1266 | @keyframes around { | ||
1267 | 0% { | ||
1268 | transform: rotate(0deg); | ||
1269 | } | ||
1270 | |||
1271 | 100% { | ||
1272 | transform: rotate(360deg); | ||
1273 | } | ||
1274 | } | ||
1275 | |||
1276 | .loading-input .icon-container { | ||
1277 | position: absolute; | ||
1278 | right: 60px; | ||
1279 | top: calc(50% - 10px); | ||
1280 | } | ||
1281 | |||
1282 | .loading-input .loader { | ||
1283 | position: relative; | ||
1284 | height: 20px; | ||
1285 | width: 20px; | ||
1286 | display: inline-block; | ||
1287 | animation: around 5.4s infinite; | ||
1288 | } | ||
1289 | |||
1290 | .loading-input .loader::after, | ||
1291 | .loading-input .loader::before { | ||
1292 | content: ""; | ||
1293 | background: #eee; | ||
1294 | position: absolute; | ||
1295 | display: inline-block; | ||
1296 | width: 100%; | ||
1297 | height: 100%; | ||
1298 | border-width: 2px; | ||
1299 | border-color: #333 #333 transparent transparent; | ||
1300 | border-style: solid; | ||
1301 | border-radius: 20px; | ||
1302 | box-sizing: border-box; | ||
1303 | top: 0; | ||
1304 | left: 0; | ||
1305 | animation: around 0.7s ease-in-out infinite; | ||
1306 | } | ||
1307 | |||
1308 | .loading-input .loader::after { | ||
1309 | animation: around 0.7s ease-in-out 0.1s infinite; | ||
1310 | background: transparent; | ||
1311 | } | ||
diff --git a/doc/md/Docker.md b/doc/md/Docker.md index c152fe92..fc406c00 100644 --- a/doc/md/Docker.md +++ b/doc/md/Docker.md | |||
@@ -1,3 +1,4 @@ | |||
1 | |||
1 | # Docker | 2 | # Docker |
2 | 3 | ||
3 | [Docker](https://docs.docker.com/get-started/overview/) is an open platform for developing, shipping, and running applications | 4 | [Docker](https://docs.docker.com/get-started/overview/) is an open platform for developing, shipping, and running applications |
@@ -113,9 +114,11 @@ $ mkdir shaarli && cd shaarli | |||
113 | # Download the latest version of Shaarli's docker-compose.yml | 114 | # Download the latest version of Shaarli's docker-compose.yml |
114 | $ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/latest/docker-compose.yml -o docker-compose.yml | 115 | $ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/latest/docker-compose.yml -o docker-compose.yml |
115 | # Create the .env file and fill in your VPS and domain information | 116 | # Create the .env file and fill in your VPS and domain information |
116 | # (replace <MY_SHAARLI_DOMAIN> and <MY_CONTACT_EMAIL> with your actual information) | 117 | # (replace <shaarli.mydomain.org>, <admin@mydomain.org> and <latest> with your actual information) |
117 | $ echo 'SHAARLI_VIRTUAL_HOST=shaarli.mydomain.org' > .env | 118 | $ echo 'SHAARLI_VIRTUAL_HOST=shaarli.mydomain.org' > .env |
118 | $ echo 'SHAARLI_LETSENCRYPT_EMAIL=admin@mydomain.org' >> .env | 119 | $ echo 'SHAARLI_LETSENCRYPT_EMAIL=admin@mydomain.org' >> .env |
120 | # Available Docker tags can be found at https://hub.docker.com/r/shaarli/shaarli/tags | ||
121 | $ echo 'SHAARLI_DOCKER_TAG=latest' >> .env | ||
119 | # Pull the Docker images | 122 | # Pull the Docker images |
120 | $ docker-compose pull | 123 | $ docker-compose pull |
121 | # Run! | 124 | # Run! |
@@ -224,4 +227,4 @@ $ docker system prune | |||
224 | - [docker pull](https://docs.docker.com/engine/reference/commandline/pull/) | 227 | - [docker pull](https://docs.docker.com/engine/reference/commandline/pull/) |
225 | - [docker run](https://docs.docker.com/engine/reference/commandline/run/) | 228 | - [docker run](https://docs.docker.com/engine/reference/commandline/run/) |
226 | - [docker-compose logs](https://docs.docker.com/compose/reference/logs/) | 229 | - [docker-compose logs](https://docs.docker.com/compose/reference/logs/) |
227 | - Træfik: [Getting Started](https://docs.traefik.io/), [Docker backend](https://docs.traefik.io/configuration/backends/docker/), [Let's Encrypt](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/), [Docker image](https://hub.docker.com/_/traefik/) \ No newline at end of file | 230 | - Træfik: [Getting Started](https://docs.traefik.io/), [Docker backend](https://docs.traefik.io/configuration/backends/docker/), [Let's Encrypt](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/), [Docker image](https://hub.docker.com/_/traefik/) |
diff --git a/doc/md/Server-configuration.md b/doc/md/Server-configuration.md index 4e74d80b..a49b6033 100644 --- a/doc/md/Server-configuration.md +++ b/doc/md/Server-configuration.md | |||
@@ -193,19 +193,24 @@ sudo nano /etc/apache2/sites-available/shaarli.mydomain.org.conf | |||
193 | Require all granted | 193 | Require all granted |
194 | </Directory> | 194 | </Directory> |
195 | 195 | ||
196 | <LocationMatch "/\."> | 196 | # BE CAREFUL: directives order matter! |
197 | # Prevent accessing dotfiles | ||
198 | RedirectMatch 404 ".*" | ||
199 | </LocationMatch> | ||
200 | 197 | ||
201 | <LocationMatch "\.(?:ico|css|js|gif|jpe?g|png)$"> | 198 | <FilesMatch ".*\.(?!(ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$)[^\.]*$"> |
199 | Require all denied | ||
200 | </FilesMatch> | ||
201 | |||
202 | <Files "index.php"> | ||
203 | Require all granted | ||
204 | </Files> | ||
205 | |||
206 | <FilesMatch "\.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2)$"> | ||
202 | # allow client-side caching of static files | 207 | # allow client-side caching of static files |
203 | Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate" | 208 | Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate" |
204 | </LocationMatch> | 209 | </FilesMatch> |
210 | |||
205 | 211 | ||
206 | # serve the Shaarli favicon from its custom location | 212 | # serve the Shaarli favicon from its custom location |
207 | Alias favicon.ico /var/www/shaarli.mydomain.org/images/favicon.ico | 213 | Alias favicon.ico /var/www/shaarli.mydomain.org/images/favicon.ico |
208 | |||
209 | </VirtualHost> | 214 | </VirtualHost> |
210 | ``` | 215 | ``` |
211 | 216 | ||
@@ -296,7 +301,7 @@ server { | |||
296 | location / { | 301 | location / { |
297 | # default index file when no file URI is requested | 302 | # default index file when no file URI is requested |
298 | index index.php; | 303 | index index.php; |
299 | try_files $uri /index.php$is_args$args; | 304 | try_files _ /index.php$is_args$args; |
300 | } | 305 | } |
301 | 306 | ||
302 | location ~ (index)\.php$ { | 307 | location ~ (index)\.php$ { |
@@ -309,23 +314,7 @@ server { | |||
309 | include fastcgi.conf; | 314 | include fastcgi.conf; |
310 | } | 315 | } |
311 | 316 | ||
312 | location ~ \.php$ { | 317 | location ~ /doc/html/ { |
313 | # deny access to all other PHP scripts | ||
314 | # disable this if you host other PHP applications on the same virtualhost | ||
315 | deny all; | ||
316 | } | ||
317 | |||
318 | location ~ /\. { | ||
319 | # deny access to dotfiles | ||
320 | deny all; | ||
321 | } | ||
322 | |||
323 | location ~ ~$ { | ||
324 | # deny access to temp editor files, e.g. "script.php~" | ||
325 | deny all; | ||
326 | } | ||
327 | |||
328 | location ~ /doc/ { | ||
329 | default_type "text/html"; | 318 | default_type "text/html"; |
330 | try_files $uri $uri/ $uri.html =404; | 319 | try_files $uri $uri/ $uri.html =404; |
331 | } | 320 | } |
@@ -336,13 +325,12 @@ server { | |||
336 | } | 325 | } |
337 | 326 | ||
338 | # allow client-side caching of static files | 327 | # allow client-side caching of static files |
339 | location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { | 328 | location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ { |
340 | expires max; | 329 | expires max; |
341 | add_header Cache-Control "public, must-revalidate, proxy-revalidate"; | 330 | add_header Cache-Control "public, must-revalidate, proxy-revalidate"; |
342 | # HTTP 1.0 compatibility | 331 | # HTTP 1.0 compatibility |
343 | add_header Pragma public; | 332 | add_header Pragma public; |
344 | } | 333 | } |
345 | |||
346 | } | 334 | } |
347 | ``` | 335 | ``` |
348 | 336 | ||
diff --git a/docker-compose.yml b/docker-compose.yml index a3de4b1c..4ebae447 100644 --- a/docker-compose.yml +++ b/docker-compose.yml | |||
@@ -2,12 +2,13 @@ | |||
2 | # Shaarli - Docker Compose example configuration | 2 | # Shaarli - Docker Compose example configuration |
3 | # | 3 | # |
4 | # See: | 4 | # See: |
5 | # - https://shaarli.readthedocs.io/en/master/docker/shaarli-images/ | 5 | # - https://shaarli.readthedocs.io/en/master/Docker/#docker-compose |
6 | # - https://shaarli.readthedocs.io/en/master/guides/install-shaarli-with-debian9-and-docker/ | ||
7 | # | 6 | # |
8 | # Environment variables: | 7 | # Environment variables: |
9 | # - SHAARLI_VIRTUAL_HOST Fully Qualified Domain Name for the Shaarli instance | 8 | # - SHAARLI_VIRTUAL_HOST Fully Qualified Domain Name for the Shaarli instance |
10 | # - SHAARLI_LETSENCRYPT_EMAIL Contact email for certificate renewal | 9 | # - SHAARLI_LETSENCRYPT_EMAIL Contact email for certificate renewal |
10 | # - SHAARLI_DOCKER_TAG Shaarli docker tag to use | ||
11 | # See: https://hub.docker.com/r/shaarli/shaarli/tags | ||
11 | version: '3' | 12 | version: '3' |
12 | 13 | ||
13 | networks: | 14 | networks: |
@@ -20,7 +21,7 @@ volumes: | |||
20 | 21 | ||
21 | services: | 22 | services: |
22 | shaarli: | 23 | shaarli: |
23 | image: shaarli/shaarli:master | 24 | image: shaarli/shaarli:${SHAARLI_DOCKER_TAG} |
24 | build: ./ | 25 | build: ./ |
25 | networks: | 26 | networks: |
26 | - http-proxy | 27 | - http-proxy |
@@ -40,7 +41,7 @@ services: | |||
40 | - "--entrypoints=Name:https Address::443 TLS" | 41 | - "--entrypoints=Name:https Address::443 TLS" |
41 | - "--retry" | 42 | - "--retry" |
42 | - "--docker" | 43 | - "--docker" |
43 | - "--docker.domain=docker.localhost" | 44 | - "--docker.domain=${SHAARLI_VIRTUAL_HOST}" |
44 | - "--docker.exposedbydefault=true" | 45 | - "--docker.exposedbydefault=true" |
45 | - "--docker.watch=true" | 46 | - "--docker.watch=true" |
46 | - "--acme" | 47 | - "--acme" |
diff --git a/tpl/vintage/daily.html b/tpl/vintage/daily.html index 74f6cdc7..28ba9f90 100644 --- a/tpl/vintage/daily.html +++ b/tpl/vintage/daily.html | |||
@@ -14,9 +14,9 @@ | |||
14 | 14 | ||
15 | <div class="dailyAbout"> | 15 | <div class="dailyAbout"> |
16 | All links of one day<br>in a single page.<br> | 16 | All links of one day<br>in a single page.<br> |
17 | {if="$previousday"} <a href="{$base_path}/daily&day={$previousday}"><b><</b>Previous day</a>{else}<b><</b>Previous day{/if} | 17 | {if="$previousday"} <a href="{$base_path}/daily?day={$previousday}"><b><</b>Previous day</a>{else}<b><</b>Previous day{/if} |
18 | - | 18 | - |
19 | {if="$nextday"}<a href="{$base_path}/daily&day={$nextday}">Next day<b>></b></a>{else}Next day<b>></b>{/if} | 19 | {if="$nextday"}<a href="{$base_path}/daily?day={$nextday}">Next day<b>></b></a>{else}Next day<b>></b>{/if} |
20 | <br> | 20 | <br> |
21 | 21 | ||
22 | {loop="$daily_about_plugin"} | 22 | {loop="$daily_about_plugin"} |
@@ -52,13 +52,13 @@ | |||
52 | {$link=$value} | 52 | {$link=$value} |
53 | <div class="dailyEntry"> | 53 | <div class="dailyEntry"> |
54 | <div class="dailyEntryPermalink"> | 54 | <div class="dailyEntryPermalink"> |
55 | <a href="{$base_path}/?{$value.shorturl}"> | 55 | <a href="{$base_path}/shaare/{$value.shorturl}"> |
56 | <img src="{$asset_path}/img/squiggle.png#" width="25" height="26" title="permalink" alt="permalink"> | 56 | <img src="{$asset_path}/img/squiggle.png#" width="25" height="26" title="permalink" alt="permalink"> |
57 | </a> | 57 | </a> |
58 | </div> | 58 | </div> |
59 | {if="!$hide_timestamps || $is_logged_in"} | 59 | {if="!$hide_timestamps || $is_logged_in"} |
60 | <div class="dailyEntryLinkdate"> | 60 | <div class="dailyEntryLinkdate"> |
61 | <a href="{$base_path}/?{$value.shorturl}">{function="strftime('%c', $link.timestamp)"}</a> | 61 | <a href="{$base_path}/shaare/{$value.shorturl}">{function="strftime('%c', $link.timestamp)"}</a> |
62 | </div> | 62 | </div> |
63 | {/if} | 63 | {/if} |
64 | {if="$link.tags"} | 64 | {if="$link.tags"} |
diff --git a/tpl/vintage/editlink.html b/tpl/vintage/editlink.html index eb8807b5..343418bc 100644 --- a/tpl/vintage/editlink.html +++ b/tpl/vintage/editlink.html | |||
@@ -6,6 +6,7 @@ | |||
6 | {if="$link.title==''"}onload="document.linkform.lf_title.focus();" | 6 | {if="$link.title==''"}onload="document.linkform.lf_title.focus();" |
7 | {elseif="$link.description==''"}onload="document.linkform.lf_description.focus();" | 7 | {elseif="$link.description==''"}onload="document.linkform.lf_description.focus();" |
8 | {else}onload="document.linkform.lf_tags.focus();"{/if} > | 8 | {else}onload="document.linkform.lf_tags.focus();"{/if} > |
9 | {$asyncLoadClass=$link_is_new && $async_metadata && empty($link.title) ? 'loading-input' : ''} | ||
9 | <div id="pageheader"> | 10 | <div id="pageheader"> |
10 | {include="page.header"} | 11 | {include="page.header"} |
11 | <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div> | 12 | <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div> |
@@ -14,12 +15,29 @@ | |||
14 | {if="isset($link.id)"} | 15 | {if="isset($link.id)"} |
15 | <input type="hidden" name="lf_id" value="{$link.id}"> | 16 | <input type="hidden" name="lf_id" value="{$link.id}"> |
16 | {/if} | 17 | {/if} |
17 | <label for="lf_url"><i>URL</i></label><br><input type="text" name="lf_url" id="lf_url" value="{$link.url}" class="lf_input"><br> | 18 | <label for="lf_url"><i>URL</i></label><br><input type="text" name="lf_url" id="lf_url" value="{$link.url}" class="lf_input"> |
18 | <label for="lf_title"><i>Title</i></label><br><input type="text" name="lf_title" id="lf_title" value="{$link.title}" class="lf_input"><br> | 19 | <label for="lf_title"><i>Title</i></label> |
19 | <label for="lf_description"><i>Description</i></label><br><textarea name="lf_description" id="lf_description" rows="4" cols="25">{$link.description}</textarea><br> | 20 | <div class="{$asyncLoadClass}"> |
20 | <label for="lf_tags"><i>Tags</i></label><br> | 21 | <input type="text" name="lf_title" id="lf_title" value="{$link.title}" class="lf_input"> |
21 | <input type="text" name="lf_tags" id="lf_tags" value="{$link.tags}" class="lf_input" | 22 | <div class="icon-container"> |
22 | data-list="{loop="$tags"}{$key}, {/loop}" data-multiple autocomplete="off" ><br> | 23 | <i class="loader"></i> |
24 | </div> | ||
25 | </div> | ||
26 | <label for="lf_description"><i>Description</i></label> | ||
27 | <div class="{if="$retrieve_description"}{$asyncLoadClass}{/if}"> | ||
28 | <textarea name="lf_description" id="lf_description" rows="4" cols="25">{$link.description}</textarea> | ||
29 | <div class="icon-container"> | ||
30 | <i class="loader"></i> | ||
31 | </div> | ||
32 | </div> | ||
33 | <label for="lf_tags"><i>Tags</i></label> | ||
34 | <div class="{if="$retrieve_description"}{$asyncLoadClass}{/if}"> | ||
35 | <input type="text" name="lf_tags" id="lf_tags" value="{$link.tags}" class="lf_input" | ||
36 | data-list="{loop="$tags"}{$key}, {/loop}" data-multiple autocomplete="off" > | ||
37 | <div class="icon-container"> | ||
38 | <i class="loader"></i> | ||
39 | </div> | ||
40 | </div> | ||
23 | 41 | ||
24 | {if="$formatter==='markdown'"} | 42 | {if="$formatter==='markdown'"} |
25 | <div class="md_help"> | 43 | <div class="md_help"> |
@@ -56,5 +74,5 @@ | |||
56 | </div> | 74 | </div> |
57 | </div> | 75 | </div> |
58 | {include="page.footer"} | 76 | {include="page.footer"} |
59 | </body> | 77 | {if="$link_is_new && $async_metadata"}<script src="{$asset_path}/js/metadata.min.js?v={$version_hash}#"></script>{/if}</body> |
60 | </html> | 78 | </html> |
diff --git a/tpl/vintage/page.header.html b/tpl/vintage/page.header.html index 0a33523b..64d7f656 100644 --- a/tpl/vintage/page.header.html +++ b/tpl/vintage/page.header.html | |||
@@ -54,6 +54,30 @@ | |||
54 | </ul> | 54 | </ul> |
55 | {/if} | 55 | {/if} |
56 | 56 | ||
57 | {if="!empty($global_errors)"} | ||
58 | <ul class="errors"> | ||
59 | {loop="$global_errors"} | ||
60 | <li>{$value}</li> | ||
61 | {/loop} | ||
62 | </ul> | ||
63 | {/if} | ||
64 | |||
65 | {if="!empty($global_warnings)"} | ||
66 | <ul class="warnings"> | ||
67 | {loop="$global_warnings"} | ||
68 | <li>{$value}</li> | ||
69 | {/loop} | ||
70 | </ul> | ||
71 | {/if} | ||
72 | |||
73 | {if="!empty($global_successes)"} | ||
74 | <ul class="successes"> | ||
75 | {loop="$global_successes"} | ||
76 | <li>{$value}</li> | ||
77 | {/loop} | ||
78 | </ul> | ||
79 | {/if} | ||
80 | |||
57 | <div class="clear"></div> | 81 | <div class="clear"></div> |
58 | 82 | ||
59 | 83 | ||