sharkey-web 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/Gemfile +4 -0
- data/LICENSE.md +19 -0
- data/README.md +188 -0
- data/Rakefile +8 -0
- data/bin/sharkey-web +9 -0
- data/config.ru +3 -0
- data/lib/sharkey.rb +12 -0
- data/lib/sharkey/app.rb +526 -0
- data/lib/sharkey/importerexporter.rb +79 -0
- data/lib/sharkey/models.rb +295 -0
- data/lib/sharkey/public/css/loading.gif +0 -0
- data/lib/sharkey/public/css/magicsuggest.css +232 -0
- data/lib/sharkey/public/css/nprogress.css +74 -0
- data/lib/sharkey/public/css/styles.css +263 -0
- data/lib/sharkey/public/css/ui.fancytree.css +545 -0
- data/lib/sharkey/public/data/sentences.txt +5 -0
- data/lib/sharkey/public/fonts/Quadrata.eot +0 -0
- data/lib/sharkey/public/fonts/Quadrata.svg +613 -0
- data/lib/sharkey/public/fonts/Quadrata.ttf +0 -0
- data/lib/sharkey/public/fonts/Quadrata.woff +0 -0
- data/lib/sharkey/public/fonts/Quadrata.zip +0 -0
- data/lib/sharkey/public/images/loader.gif +0 -0
- data/lib/sharkey/public/images/sharkey-logo.png +0 -0
- data/lib/sharkey/public/images/sharkey.png +0 -0
- data/lib/sharkey/public/js/ajaxmanager.js +67 -0
- data/lib/sharkey/public/js/keybindings.js +92 -0
- data/lib/sharkey/public/js/lib/bootstrap.min.js +6 -0
- data/lib/sharkey/public/js/lib/jquery-1.9.1.min.js +5 -0
- data/lib/sharkey/public/js/lib/jquery-ui.js +16150 -0
- data/lib/sharkey/public/js/lib/jquery.bootstrap-autohidingnavbar.js +213 -0
- data/lib/sharkey/public/js/lib/jquery.fancytree-all.js +6424 -0
- data/lib/sharkey/public/js/lib/jquery.tagcloud.js +92 -0
- data/lib/sharkey/public/js/lib/magicsuggest.js +1468 -0
- data/lib/sharkey/public/js/lib/mousetrap.min.js +9 -0
- data/lib/sharkey/public/js/lib/nprogress.js +476 -0
- data/lib/sharkey/public/js/page-add-link-autofill.js +102 -0
- data/lib/sharkey/public/js/page-add-link.js +156 -0
- data/lib/sharkey/public/js/page-categories.js +348 -0
- data/lib/sharkey/public/js/page-edit-link.js +103 -0
- data/lib/sharkey/public/js/page-links.js +54 -0
- data/lib/sharkey/public/js/page-settings.js +93 -0
- data/lib/sharkey/public/js/page-tagcloud.js +35 -0
- data/lib/sharkey/public/js/page-tags.js +287 -0
- data/lib/sharkey/public/js/scripts.js +147 -0
- data/lib/sharkey/public/themes/amelia/style.css +7 -0
- data/lib/sharkey/public/themes/bootstrap/style.css +5785 -0
- data/lib/sharkey/public/themes/cerulean/style.css +7 -0
- data/lib/sharkey/public/themes/cosmo/style.css +7 -0
- data/lib/sharkey/public/themes/cyborg/style.css +7 -0
- data/lib/sharkey/public/themes/darkly/style.css +7 -0
- data/lib/sharkey/public/themes/facebook-like/README.md +6 -0
- data/lib/sharkey/public/themes/facebook-like/style.css +6085 -0
- data/lib/sharkey/public/themes/flatly/style.css +7 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.svg +229 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/sharkey/public/themes/holo-like/README.md +5 -0
- data/lib/sharkey/public/themes/holo-like/style.css +5997 -0
- data/lib/sharkey/public/themes/journal/style.css +7 -0
- data/lib/sharkey/public/themes/lumen/style.css +7 -0
- data/lib/sharkey/public/themes/readable/style.css +7 -0
- data/lib/sharkey/public/themes/simplex/style.css +7 -0
- data/lib/sharkey/public/themes/slate/style.css +7 -0
- data/lib/sharkey/public/themes/spacelab/style.css +7 -0
- data/lib/sharkey/public/themes/superhero/style.css +7 -0
- data/lib/sharkey/public/themes/united/style.css +7 -0
- data/lib/sharkey/public/themes/yeti/style.css +7 -0
- data/lib/sharkey/setting.rb +74 -0
- data/lib/sharkey/version.rb +5 -0
- data/lib/sharkey/views/404.slim +4 -0
- data/lib/sharkey/views/about.slim +7 -0
- data/lib/sharkey/views/add_link.slim +157 -0
- data/lib/sharkey/views/categories.slim +101 -0
- data/lib/sharkey/views/category.slim +22 -0
- data/lib/sharkey/views/centered.slim +49 -0
- data/lib/sharkey/views/dashboard.slim +107 -0
- data/lib/sharkey/views/dashboard_index.slim +26 -0
- data/lib/sharkey/views/edit_link.slim +121 -0
- data/lib/sharkey/views/help.slim +74 -0
- data/lib/sharkey/views/keybindings.slim +58 -0
- data/lib/sharkey/views/link.slim +30 -0
- data/lib/sharkey/views/links.slim +22 -0
- data/lib/sharkey/views/navbar.slim +68 -0
- data/lib/sharkey/views/settings.slim +74 -0
- data/lib/sharkey/views/settings_index.slim +220 -0
- data/lib/sharkey/views/single_category.slim +37 -0
- data/lib/sharkey/views/single_link.slim +95 -0
- data/lib/sharkey/views/single_tag.slim +33 -0
- data/lib/sharkey/views/tag.slim +22 -0
- data/lib/sharkey/views/tagcloud.slim +54 -0
- data/lib/sharkey/views/tags.slim +99 -0
- data/sharkey-web.gemspec +44 -0
- metadata +324 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
/ Lists all links
|
2
|
+
|
3
|
+
h1.page-header Links
|
4
|
+
|
5
|
+
p Page with everything about your links
|
6
|
+
|
7
|
+
h2.sub-header All Links
|
8
|
+
|
9
|
+
p Here's a list of all links.
|
10
|
+
|
11
|
+
ul.links.list-group
|
12
|
+
- if @links.empty?
|
13
|
+
li.list-group-item
|
14
|
+
| You have no links!
|
15
|
+
|
16
|
+
- else
|
17
|
+
- @links.each do |the_link|
|
18
|
+
== slim(:single_link, locals: { link: the_link })
|
19
|
+
|
20
|
+
|
21
|
+
script src="/js/page-links.js"
|
22
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
/
|
2
|
+
Top navigation bar
|
3
|
+
|
4
|
+
.navbar.navbar-inverse.navbar-fixed-top#the-navbar role="navigation"
|
5
|
+
.container-fluid
|
6
|
+
.navbar-header
|
7
|
+
button.navbar-toggle type="button" data-toggle="collapse" data-target=".navbar-collapse"
|
8
|
+
span.sr-only Toggle navigation
|
9
|
+
span.icon-bar
|
10
|
+
span.icon-bar
|
11
|
+
span.icon-bar
|
12
|
+
a.navbar-brand href="/" Sharkey
|
13
|
+
|
14
|
+
.collapse.navbar-collapse
|
15
|
+
ul.nav.navbar-nav.navbar-left
|
16
|
+
li
|
17
|
+
a href="#" data-toggle="modal" data-target="#add-link"
|
18
|
+
span.glyphicon.glyphicon-plus-sign
|
19
|
+
'
|
20
|
+
| Add Link
|
21
|
+
|
22
|
+
form.navbar-form.navbar-left
|
23
|
+
.input-group.input-group-sm
|
24
|
+
input.form-control type="text" placeholder="Search" name="search"
|
25
|
+
.input-group-btn
|
26
|
+
button.btn.btn-default tyle="submit"
|
27
|
+
span.glyphicon.glyphicon-search
|
28
|
+
|
29
|
+
ul.nav.navbar-nav.navbar-right
|
30
|
+
|
31
|
+
li class="#{ if page == 'home' then 'active' end }"
|
32
|
+
a#keybind-home href="/"
|
33
|
+
span.glyphicon.glyphicon-dashboard
|
34
|
+
'
|
35
|
+
| Dashboard
|
36
|
+
|
37
|
+
li class="#{ if page == 'settings' then 'active' end }"
|
38
|
+
a#keybind-settings href="/settings"
|
39
|
+
span.glyphicon.glyphicon-cog
|
40
|
+
'
|
41
|
+
|Settings
|
42
|
+
|
43
|
+
li class="#{ if page == 'help' then 'active' end }"
|
44
|
+
a#keybind-help href="/help"
|
45
|
+
span.glyphicon.glyphicon-question-sign
|
46
|
+
'
|
47
|
+
| Help
|
48
|
+
li class="#{ if page == 'about' then 'active' end }"
|
49
|
+
a#keybind-about href="/about"
|
50
|
+
span.glyphicon.glyphicon-info-sign
|
51
|
+
'
|
52
|
+
| About
|
53
|
+
|
54
|
+
script src="/js/lib/mousetrap.min.js"
|
55
|
+
script src="/js/keybindings.js"
|
56
|
+
== slim(:keybindings)
|
57
|
+
|
58
|
+
script src="/js/lib/jquery.bootstrap-autohidingnavbar.js"
|
59
|
+
|
60
|
+
script src="/js/lib/magicsuggest.js"
|
61
|
+
script src="/js/page-add-link.js"
|
62
|
+
- if Sharkey::Setting['auto_fill'] == 'true'
|
63
|
+
script src="/js/page-add-link-autofill.js"
|
64
|
+
== slim(:add_link)
|
65
|
+
|
66
|
+
script src="/js/page-edit-link.js"
|
67
|
+
== slim(:edit_link)
|
68
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
/
|
2
|
+
Layout for the settings page
|
3
|
+
|
4
|
+
doctype html
|
5
|
+
html
|
6
|
+
head
|
7
|
+
meta charset="utf-8"
|
8
|
+
|
9
|
+
/!
|
10
|
+
.
|
11
|
+
mmm mmm m mm m m mmmmm mmm m mm
|
12
|
+
# ' ' # #' ' # # # # # ' # #' #
|
13
|
+
'''m m'''# # # # # # # m'''# # #
|
14
|
+
'mmm' 'mm'# # 'mm'# # # # 'mm'# # #
|
15
|
+
sharkey link: the best thing since Delicious
|
16
|
+
.
|
17
|
+
|
18
|
+
title Sharkey Link
|
19
|
+
|
20
|
+
/ Poor Man's Theme Support
|
21
|
+
link rel="stylesheet" media="screen, projection" href="/themes/#{Sharkey::Setting['theme']}/style.css"
|
22
|
+
|
23
|
+
- if Sharkey::Setting['loading_bar'] == 'true'
|
24
|
+
link rel="stylesheet" href="/css/nprogress.css"
|
25
|
+
|
26
|
+
link rel="stylesheet" href="/css/magicsuggest.css"
|
27
|
+
|
28
|
+
link rel="stylesheet" media="screen, projection" href="/css/styles.css"
|
29
|
+
|
30
|
+
/[if lt IE 9]
|
31
|
+
script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"
|
32
|
+
|
33
|
+
script src="/js/lib/jquery-1.9.1.min.js"
|
34
|
+
script src="/js/lib/jquery-ui.js"
|
35
|
+
|
36
|
+
script src="/js/lib/bootstrap.min.js"
|
37
|
+
|
38
|
+
- if Sharkey::Setting['loading_bar'] == 'true'
|
39
|
+
script src="/js/lib/nprogress.js"
|
40
|
+
|
41
|
+
script src="/js/page-settings.js"
|
42
|
+
script src="/js/scripts.js"
|
43
|
+
|
44
|
+
body data-spy="scroll" data-target="#the-sidebar"
|
45
|
+
== slim(:navbar, locals: { page: page })
|
46
|
+
|
47
|
+
.container-fluid
|
48
|
+
.row
|
49
|
+
|
50
|
+
/ The sidebar
|
51
|
+
.col-sm-3.col-md-2.sidebar#the-sidebar
|
52
|
+
ul.nav.nav-sidebar
|
53
|
+
li
|
54
|
+
a href="#general"
|
55
|
+
span> class="glyphicon glyphicon-wrench"
|
56
|
+
| General
|
57
|
+
li
|
58
|
+
a href="#appearance"
|
59
|
+
span> class="glyphicon glyphicon-tasks"
|
60
|
+
| Appearance
|
61
|
+
li
|
62
|
+
a href="#data"
|
63
|
+
span> class="glyphicon glyphicon-file"
|
64
|
+
| Data
|
65
|
+
li
|
66
|
+
a href="#erase-stuff"
|
67
|
+
span> class="glyphicon glyphicon-fire"
|
68
|
+
| Erase Stuff
|
69
|
+
|
70
|
+
/ The actual content
|
71
|
+
.col-sm-9.col-sm-offset-3.col-md-10.col-md-offset-2.main
|
72
|
+
== yield
|
73
|
+
|
74
|
+
|
@@ -0,0 +1,220 @@
|
|
1
|
+
h1.page-header Settings
|
2
|
+
|
3
|
+
p Configure all your stuff here
|
4
|
+
|
5
|
+
h2.sub-header#general General Settings
|
6
|
+
|
7
|
+
.row.setting
|
8
|
+
.col-md-12
|
9
|
+
h4 Auto-fill Link Info
|
10
|
+
.row
|
11
|
+
.col-md-8
|
12
|
+
p.help-block
|
13
|
+
| Automatically try to fill the link's information at the "Add Link" dialog.
|
14
|
+
p.help-block
|
15
|
+
| Tip: it stops when you start typing.
|
16
|
+
|
17
|
+
.col-md-4
|
18
|
+
form role="form" action="/setting" method="POST"
|
19
|
+
.btn-group data-toggle="buttons"
|
20
|
+
|
21
|
+
- if Sharkey::Setting['auto_fill'] == 'true'
|
22
|
+
label.btn.btn-primary.ajax-radio.active
|
23
|
+
input type="radio" name="auto_fill" value="true" checked="true"
|
24
|
+
| On
|
25
|
+
label.btn.btn-default.ajax-radio
|
26
|
+
input type="radio" name="auto_fill" value="false" checked="false"
|
27
|
+
| Off
|
28
|
+
- else
|
29
|
+
label.btn.btn-default.ajax-radio
|
30
|
+
input type="radio" name="auto_fill" value="true" checked="false"
|
31
|
+
| On
|
32
|
+
label.btn.btn-primary.ajax-radio.active
|
33
|
+
input type="radio" name="auto_fill" value="false" checked="true"
|
34
|
+
| Off
|
35
|
+
|
36
|
+
h2.sub-header#appearance Appearance
|
37
|
+
|
38
|
+
.row.setting
|
39
|
+
.col-md-12
|
40
|
+
h4 Theme
|
41
|
+
.row
|
42
|
+
.col-md-8
|
43
|
+
p.help-block
|
44
|
+
| Change how it looks!
|
45
|
+
p.help-block
|
46
|
+
| Courtesy of
|
47
|
+
a< href="http://bootswatch.com/" Bootswatch.
|
48
|
+
|
49
|
+
.col-md-4
|
50
|
+
form#theme-form role="form" action="/setting" method="POST"
|
51
|
+
.form-group
|
52
|
+
select.form-control#theme-select name="theme" placeholder="Theme"
|
53
|
+
- Dir.entries(File.expand_path('./lib/sharkey/public/themes')).sort.each do |dir|
|
54
|
+
- if (dir != 'fonts') and (dir[0] != '.')
|
55
|
+
- if dir == Sharkey::Setting['theme']
|
56
|
+
option value="#{dir}" selected="true" = dir
|
57
|
+
- else
|
58
|
+
option value="#{dir}" = dir
|
59
|
+
|
60
|
+
button.btn.btn-primary type="submit" title="Apply"
|
61
|
+
span> class="glyphicon glyphicon-picture"
|
62
|
+
| Apply
|
63
|
+
|
64
|
+
.row.setting
|
65
|
+
.col-md-12
|
66
|
+
h4 Date format
|
67
|
+
.row
|
68
|
+
.col-md-8
|
69
|
+
p.help-block
|
70
|
+
| How the date will get shown besides Links and Tags.
|
71
|
+
p.help-block
|
72
|
+
| Relative date (e.g. '8 hours ago') or full date
|
73
|
+
format (18:05 22-12-2014).
|
74
|
+
|
75
|
+
.col-md-4
|
76
|
+
form role="form" action="/setting" method="POST"
|
77
|
+
.btn-group data-toggle="buttons"
|
78
|
+
|
79
|
+
- if Sharkey::Setting['date_format'] == 'relative'
|
80
|
+
label.btn.btn-primary.ajax-radio.active
|
81
|
+
input type="radio" name="date_format" value="relative" checked="true"
|
82
|
+
| Relative Date
|
83
|
+
label.btn.btn-default.ajax-radio
|
84
|
+
input type="radio" name="date_format" value="full" checked="false"
|
85
|
+
| Full Date
|
86
|
+
- else
|
87
|
+
label.btn.btn-default.ajax-radio
|
88
|
+
input type="radio" name="date_format" value="relative" checked="false"
|
89
|
+
| Relative Date
|
90
|
+
label.btn.btn-primary.ajax-radio.active
|
91
|
+
input type="radio" name="date_format" value="full" checked="true"
|
92
|
+
| Full Date
|
93
|
+
|
94
|
+
|
95
|
+
.row.setting
|
96
|
+
.col-md-12
|
97
|
+
h4 Loading bar
|
98
|
+
.row
|
99
|
+
.col-md-8
|
100
|
+
p.help-block
|
101
|
+
| Show progress bar when loading the page
|
102
|
+
|
103
|
+
.col-md-4
|
104
|
+
form role="form" action="/setting" method="POST"
|
105
|
+
.btn-group data-toggle="buttons"
|
106
|
+
|
107
|
+
- if Sharkey::Setting['loading_bar'] == 'true'
|
108
|
+
label.btn.btn-primary.ajax-radio.active
|
109
|
+
input type="radio" name="loading_bar" value="true" checked="true"
|
110
|
+
| On
|
111
|
+
label.btn.btn-default.ajax-radio
|
112
|
+
input type="radio" name="loading_bar" value="false" checked="false"
|
113
|
+
| Off
|
114
|
+
- else
|
115
|
+
label.btn.btn-default.ajax-radio
|
116
|
+
input type="radio" name="loading_bar" value="true" checked="false"
|
117
|
+
| On
|
118
|
+
label.btn.btn-primary.ajax-radio.active
|
119
|
+
input type="radio" name="loading_bar" value="false" checked="true"
|
120
|
+
| Off
|
121
|
+
|
122
|
+
|
123
|
+
h2.sub-header#data Data
|
124
|
+
|
125
|
+
.row.setting
|
126
|
+
.col-md-12
|
127
|
+
h4 Import Links
|
128
|
+
.row
|
129
|
+
.col-md-8
|
130
|
+
p.help-block
|
131
|
+
| Select a <a href="http://fileformats.archiveteam.org/wiki/Netscape_bookmarks" target="_blank">Bookmark HTML file</a>, generated by most owsers and tools such as <em>Delicious</em>
|
132
|
+
|
133
|
+
.col-md-4
|
134
|
+
form role="form" action="/import" method="POST" enctype="multipart/form-data"
|
135
|
+
input type="file" name="file"
|
136
|
+
button.btn.btn-primary#button-import type="submit" title="Import"
|
137
|
+
span> class="glyphicon glyphicon-import"
|
138
|
+
| Import
|
139
|
+
|
140
|
+
.row.setting
|
141
|
+
.col-md-12
|
142
|
+
h4 Export Links
|
143
|
+
.row
|
144
|
+
.col-md-8
|
145
|
+
p.help-block Not supported...
|
146
|
+
.col-md-4
|
147
|
+
span> class="glyphicon glyphicon-export"
|
148
|
+
p ...yet
|
149
|
+
|
150
|
+
h2.sub-header#erase-stuff Erase Stuff
|
151
|
+
|
152
|
+
p.help-block
|
153
|
+
| All these options are highly destructive.
|
154
|
+
p.help-block
|
155
|
+
| There's no way to get your data back once it's gone!
|
156
|
+
|
157
|
+
.row.setting
|
158
|
+
.col-md-12
|
159
|
+
h4 Erase all Links
|
160
|
+
.row
|
161
|
+
.col-md-8
|
162
|
+
p.help-block Deletes all links, keeping Tags, Categories and every other information.
|
163
|
+
|
164
|
+
.col-md-4
|
165
|
+
form role="form" action="/all-links" method="POST"
|
166
|
+
input type="hidden" name="_method" value="DELETE"
|
167
|
+
|
168
|
+
button.btn.btn-sm.btn-warning type="submit" title="Exterminate Links"
|
169
|
+
span.glyphicon.glyphicon-trash
|
170
|
+
'
|
171
|
+
| Exterminate Links
|
172
|
+
|
173
|
+
.row.setting
|
174
|
+
.col-md-12
|
175
|
+
h4 Erase all Tags
|
176
|
+
.row
|
177
|
+
.col-md-8
|
178
|
+
p.help-block Deletes all tags, keeping every other information.
|
179
|
+
|
180
|
+
.col-md-4
|
181
|
+
form role="form" action="/all-tags" method="POST"
|
182
|
+
input type="hidden" name="_method" value="DELETE"
|
183
|
+
|
184
|
+
button.btn.btn-sm.btn-warning type="submit" title="Exterminate Tags"
|
185
|
+
span.glyphicon.glyphicon-trash
|
186
|
+
'
|
187
|
+
| Exterminate Tags
|
188
|
+
|
189
|
+
.row.setting
|
190
|
+
.col-md-12
|
191
|
+
h4 Erase all Categories
|
192
|
+
.row
|
193
|
+
.col-md-8
|
194
|
+
p.help-block Deletes all categories, but not their links.
|
195
|
+
|
196
|
+
.col-md-4
|
197
|
+
form role="form" action="/all-categories" method="POST"
|
198
|
+
input type="hidden" name="_method" value="DELETE"
|
199
|
+
|
200
|
+
button.btn.btn-sm.btn-warning type="submit" title="Exterminate Categories"
|
201
|
+
span> class="glyphicon glyphicon-trash"
|
202
|
+
| Exterminate Categories
|
203
|
+
|
204
|
+
|
205
|
+
.row.setting
|
206
|
+
.col-md-12
|
207
|
+
h4 Erase Everything
|
208
|
+
.row
|
209
|
+
.col-md-8
|
210
|
+
p.help-block Deletes the entire database - Tags, Links, Categories... Watch out!
|
211
|
+
|
212
|
+
.col-md-4
|
213
|
+
form role="form" action="/everything" method="POST"
|
214
|
+
input type="hidden" name="_method" value="DELETE"
|
215
|
+
|
216
|
+
|
217
|
+
button.btn.btn-sm.btn-danger type="submit" title="Delete Everything"
|
218
|
+
span> class="glyphicon glyphicon-fire"
|
219
|
+
| Destroy all Stuff
|
220
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
/ Layout for a single Category
|
2
|
+
It will get shown as a part of a greater
|
3
|
+
list
|
4
|
+
Local variable: category
|
5
|
+
|
6
|
+
li.folder.list-group-item.nolink
|
7
|
+
|
8
|
+
/ This span is for FancyTree to allow
|
9
|
+
inserting arbitrary HTML on items
|
10
|
+
span
|
11
|
+
a href="/category/#{category.id}" = category.name
|
12
|
+
|
13
|
+
- if (not category.childs.empty?) or (not category.links.empty?)
|
14
|
+
ul
|
15
|
+
- if not category.childs.empty?
|
16
|
+
- category.childs.each do |child|
|
17
|
+
== slim(:single_category, locals: { category: child })
|
18
|
+
|
19
|
+
- if not category.links.empty?
|
20
|
+
- category.links.each do |link|
|
21
|
+
li.list-group-item
|
22
|
+
span
|
23
|
+
/ This empty <a> tag is for FancyTree to redirect
|
24
|
+
to it when pressing ENTER or SPACE.
|
25
|
+
That's because it redirects to the FIRST link
|
26
|
+
it finds.
|
27
|
+
So if you want to redirect to the EXTERNAL link
|
28
|
+
just delete this
|
29
|
+
a.link-internal-link href="/link/#{link.id}"
|
30
|
+
|
31
|
+
- if link.title.empty?
|
32
|
+
a.link-link target="_blank" href="#{link.url}" data-link-id="#{link.id}"
|
33
|
+
| #{link.url}
|
34
|
+
- else
|
35
|
+
a.link-link target="_blank" href="#{link.url}" data-link-id="#{link.id}"
|
36
|
+
| #{link.title}
|
37
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
/
|
2
|
+
Layout for a single Link
|
3
|
+
It will get shown as a part of a greater
|
4
|
+
list
|
5
|
+
Local variable: link
|
6
|
+
|
7
|
+
li.link.list-group-item.hoverable-parent.ajax-delete-parent data-link-id="#{link.id}"
|
8
|
+
.row
|
9
|
+
span.link-title
|
10
|
+
- if link.title.empty?
|
11
|
+
a target="_blank" href="#{link.url}" = link.url
|
12
|
+
- else
|
13
|
+
a target="_blank" href="#{link.url}" = link.title
|
14
|
+
span.link-title-short-url
|
15
|
+
| #{link.url.host}
|
16
|
+
|
17
|
+
.row
|
18
|
+
.link-categories
|
19
|
+
- if link.category
|
20
|
+
a.link-category href="/category/#{link.category.id}" title="#{link.category.name}"
|
21
|
+
span.label.label-default = link.category.name
|
22
|
+
.row
|
23
|
+
.link-tags
|
24
|
+
- if link.tags
|
25
|
+
- link.tags.each do |tag|
|
26
|
+
a.link-tag href="/tag/#{tag.id}" title="#{tag.name}"
|
27
|
+
span.badge = tag.name
|
28
|
+
.row
|
29
|
+
span.link-internal-link
|
30
|
+
a.btn.btn-xs.btn-primary href="/link/#{link.id}" title="Internal Link"
|
31
|
+
span.label.label-primary
|
32
|
+
span.glyphicon.glyphicon-link
|
33
|
+
|
34
|
+
span.link-checkbox
|
35
|
+
| possibly checkbox
|
36
|
+
|
37
|
+
/span.asdasdcol-md-4.hoverable-children
|
38
|
+
span.link-controls
|
39
|
+
button.btn.btn-xs.btn-primary.link-favorite title="Favorite"
|
40
|
+
span class="glyphicon glyphicon-star#{if not link.favorite then '-empty' end}"
|
41
|
+
|
42
|
+
button.btn.btn-xs.btn-primary.link-edit title="Edit Link" data-toggle="modal" data-target="#edit-link"
|
43
|
+
span.glyphicon.glyphicon-pencil
|
44
|
+
|
45
|
+
form action="/link/#{link.id}" method="POST"
|
46
|
+
.form-group
|
47
|
+
/ Most browsers don't recognize the DELETE
|
48
|
+
HTTP method, so this is a fake for Sinatra
|
49
|
+
to recognize it as DELETE anyway
|
50
|
+
input type="hidden" name="_method" value="DELETE"
|
51
|
+
|
52
|
+
button.ajax-delete.btn.btn-xs.btn-primary type="submit" title="Delete Link"
|
53
|
+
span.glyphicon.glyphicon-trash
|
54
|
+
|
55
|
+
|
56
|
+
.row
|
57
|
+
span.link-description
|
58
|
+
/ We need this to retain line breaks
|
59
|
+
from the original comment
|
60
|
+
- if link.comment
|
61
|
+
- link.comment.split("\n").each do |line|
|
62
|
+
= line
|
63
|
+
br/
|
64
|
+
|
65
|
+
span.link-added
|
66
|
+
- if Sharkey::Setting['date_format'] == 'relative'
|
67
|
+
| Added
|
68
|
+
time<> datetime="#{formatted_date(link.added_at)}"
|
69
|
+
| #{relative_date(link.added_at)}
|
70
|
+
| ago
|
71
|
+
- else
|
72
|
+
| Added
|
73
|
+
time< datetime="#{formatted_date(link.added_at)}"
|
74
|
+
| #{formatted_date(link.added_at)}
|
75
|
+
|
76
|
+
.row
|
77
|
+
span.link-visited
|
78
|
+
span.link-visited-date
|
79
|
+
- if link.visited?
|
80
|
+
- if Sharkey::Setting['date_format'] == 'relative'
|
81
|
+
| Last visited
|
82
|
+
time<> datetime="#{formatted_date(link.last_visit)}"
|
83
|
+
| #{relative_date(link.last_visit)}
|
84
|
+
| ago
|
85
|
+
- else
|
86
|
+
| Last visited
|
87
|
+
time< datetime="#{formatted_date(link.last_visit)}"
|
88
|
+
| #{formatted_date(link.last_visit)}
|
89
|
+
|
90
|
+
'
|
91
|
+
span.badge.link-visited-count
|
92
|
+
span.glyphicon.glyphicon-open
|
93
|
+
'
|
94
|
+
= link.visit_count
|
95
|
+
|