diff --git a/app/View/CollapsibleTextBoxWidget.php b/app/View/CollapsibleTextBoxWidget.php
index 3b0e379..adca77b 100644
--- a/app/View/CollapsibleTextBoxWidget.php
+++ b/app/View/CollapsibleTextBoxWidget.php
@@ -50,7 +50,14 @@ class CollapsibleTextBoxWidget
$out = nl2br($out);
- $out = preg_replace('|(https?://[^\s]+)|i', '\1', $out);
+ $out = preg_replace_callback('#\b((https?://|ftp://|mailto:)[^\s]+)#i', function($m) {
+ $href = $m[1];
+ $text = $href;
+ if (strpos($text, 'mailto:') === 0) {
+ $text = str_replace('mailto:', '', $text);
+ }
+ return "".e($text)."";
+ }, $out);
return $out;
}
@@ -67,7 +74,9 @@ class CollapsibleTextBoxWidget
}
if ($this->collapsing) {
- return '
' . $prefix . $content . '
';
+ return '' . $prefix . $content . '
';
} else {
return $prefix.'' . $prefix . $content . '
';
}
diff --git a/app/View/WidgetFactory.php b/app/View/WidgetFactory.php
index 0de0f5b..3dfcd92 100644
--- a/app/View/WidgetFactory.php
+++ b/app/View/WidgetFactory.php
@@ -31,6 +31,23 @@ class WidgetFactory
"";
}
+ /**
+ * Convert the given string to a-href if it is a link.
+ *
+ * @param $href
+ * @return string
+ */
+ public function tryLink($href)
+ {
+ $href = trim($href);
+ if (starts_with($href, ['http://', 'https://', 'mailto:', 'ftp://'])) {
+ $href_e = e($href);
+ return "".$href_e."";
+ } else {
+ return $href;
+ }
+ }
+
public function collapsible($text, $thrSize, $maxHeight)
{
return new CollapsibleTextBoxWidget($text, $thrSize, $maxHeight);
diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js
index f81373f..8115045 100644
--- a/resources/assets/js/app.js
+++ b/resources/assets/js/app.js
@@ -21,11 +21,26 @@ $(function () {
}, 500)
}, 2500)
- $('.block-collapse').on('click', (e) => {
- $(e.target).closest('.block-collapse').addClass('reveal')
- }).on('dblclick', (e) => {
- $(e.target).closest('.block-collapse').removeClass('reveal')
- });
+ // toggle collapse when clicked outside link, without drag
+ $('.block-collapse')
+ .on('mousedown', (e) => {
+ let $bc = $(e.target).closest('.block-collapse')
+ $bc.data('mx', e.screenX);
+ $bc.data('my', e.screenY);
+ })
+ .on('mouseup', (e) => {
+ if (e.target.nodeName === 'A') return
+ let $bc = $(e.target).closest('.block-collapse')
+ if (typeof $bc.data('mx') !== 'undefined') {
+ let x0 = +$bc.data('mx');
+ let y0 = +$bc.data('my');
+ if (Math.abs(x0 - e.screenX) > 5 || Math.abs(y0 - e.screenY) > 5) {
+ // drag
+ } else {
+ $(e.target).closest('.block-collapse').toggleClass('reveal')
+ }
+ }
+ })
})
// auto-alias
diff --git a/resources/assets/sass/_helpers.scss b/resources/assets/sass/_helpers.scss
index f84a1af..bdf5c94 100644
--- a/resources/assets/sass/_helpers.scss
+++ b/resources/assets/sass/_helpers.scss
@@ -46,3 +46,7 @@
.small2 {
font-size: 70%;
}
+
+a.link-no-color {
+ color: unset;
+}
diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss
index a84f931..c4a051c 100644
--- a/resources/assets/sass/app.scss
+++ b/resources/assets/sass/app.scss
@@ -15,7 +15,3 @@ html {
@import "bootstrap-customizations/navbar";
@import "bootstrap-customizations/footer";
@import "bootstrap-customizations/help";
-
-a.link-no-color {
- color: unset;
-}
diff --git a/resources/views/profile/view.blade.php b/resources/views/profile/view.blade.php
index cbbbf90..ccafb77 100644
--- a/resources/views/profile/view.blade.php
+++ b/resources/views/profile/view.blade.php
@@ -40,7 +40,7 @@
@if($user->website)
@icon(fa-link, User's Website:) |
- {{ $user->website }} |
+ {!! Widget::tryLink($user->website) !!} |
@endif
@@ -60,7 +60,7 @@
{{-- Table list card --}}
-