]>
git.immae.eu Git - github/shaarli/Shaarli.git/blob - tpl/default/js/shaarli.js
a3d40b0ddf32647006a8b5f3fcd4045d23594f84
2 * Retrieve an element up in the tree from its class name.
4 function getParentByClass(el
, className
) {
6 if (p
== null || p
.classList
.contains(className
)) {
9 return getParentByClass(p
, className
);
14 * Handle responsive menu.
15 * Source: http://purecss.io/layouts/tucked-menu-vertical/
17 (function (window
, document
) {
18 var menu
= document
.getElementById('shaarli-menu'),
19 WINDOW_CHANGE_EVENT
= ('onorientationchange' in window
) ? 'orientationchange':'resize';
21 function toggleHorizontal() {
23 document
.getElementById('shaarli-menu').querySelectorAll('.menu-transform'),
25 el
.classList
.toggle('pure-menu-horizontal');
30 function toggleMenu() {
31 // set timeout so that the panel has a chance to roll up
32 // before the menu switches states
33 if (menu
.classList
.contains('open')) {
34 setTimeout(toggleHorizontal
, 500);
39 menu
.classList
.toggle('open');
40 document
.getElementById('menu-toggle').classList
.toggle('x');
43 function closeMenu() {
44 if (menu
.classList
.contains('open')) {
49 document
.getElementById('menu-toggle').addEventListener('click', function (e
) {
53 window
.addEventListener(WINDOW_CHANGE_EVENT
, closeMenu
);
54 })(this, this.document
);
57 * Fold/Expand shaares description and thumbnail.
59 (function (window
, document
) {
60 var foldAllButtons
= document
.getElementsByClassName('fold-all');
61 var foldButtons
= document
.getElementsByClassName('fold-button');
63 [].forEach
.call(foldButtons
, function (foldButton
) {
64 // Retrieve description
65 var description
= null;
67 var linklistItem
= getParentByClass(foldButton
, 'linklist-item');
68 if (linklistItem
!= null) {
69 description
= linklistItem
.querySelector('.linklist-item-description');
70 thumbnail
= linklistItem
.querySelector('.linklist-item-thumbnail');
71 if (description
!= null || thumbnail
!= null) {
72 foldButton
.style
.display
= 'inline';
76 foldButton
.addEventListener('click', function (event
) {
77 event
.preventDefault();
78 toggleFold(event
.target
, description
, thumbnail
);
82 if (foldAllButtons
!= null) {
83 [].forEach
.call(foldAllButtons
, function (foldAllButton
) {
84 foldAllButton
.addEventListener('click', function (event
) {
85 event
.preventDefault();
86 [].forEach
.call(foldButtons
, function (foldButton
) {
87 // Retrieve description
88 var description
= null;
90 var linklistItem
= getParentByClass(foldButton
, 'linklist-item');
91 if (linklistItem
!= null) {
92 description
= linklistItem
.querySelector('.linklist-item-description');
93 thumbnail
= linklistItem
.querySelector('.linklist-item-thumbnail');
94 if (description
!= null || thumbnail
!= null) {
95 foldButton
.style
.display
= 'inline';
99 toggleFold(foldButton
.firstElementChild
, description
, thumbnail
);
101 foldAllButton
.firstElementChild
.classList
.toggle('fa-chevron-down');
102 foldAllButton
.firstElementChild
.classList
.toggle('fa-chevron-up');
106 })(this, this.document
);
108 function toggleFold(button
, description
, thumb
)
110 // Switch fold/expand - up = fold
111 if (button
.classList
.contains('fa-chevron-up')) {
112 button
.title
= 'Expand';
113 if (description
!= null) {
114 description
.style
.display
= 'none';
117 thumb
.style
.display
= 'none';
121 button
.title
= 'Fold';
122 if (description
!= null) {
123 description
.style
.display
= 'block';
126 thumb
.style
.display
= 'block';
129 button
.classList
.toggle('fa-chevron-down');
130 button
.classList
.toggle('fa-chevron-up');
134 * Confirmation message before deletion.
136 var deleteLinks
= document
.querySelectorAll('.confirm-delete');
137 [].forEach
.call(deleteLinks
, function(deleteLink
) {
138 deleteLink
.addEventListener('click', function(event
) {
139 if(! confirm('Are you sure you want to delete this link ?')) {
140 event
.preventDefault();
148 var closeLinks
= document
.querySelectorAll('.pure-alert-close');
149 [].forEach
.call(closeLinks
, function(closeLink
) {
150 closeLink
.addEventListener('click', function(event
) {
151 var alert
= getParentByClass(event
.target
, 'pure-alert-closable');
152 alert
.style
.display
= 'none';
157 * New version dismiss.
158 * Hide the message for one week using localStorage.
160 var newVersionDismiss
= document
.getElementById('new-version-dismiss');
161 var newVersionMessage
= document
.querySelector('.new-version-message');
162 if (newVersionMessage
!= null
163 && localStorage
.getItem('newVersionDismiss') != null
164 && parseInt(localStorage
.getItem('newVersionDismiss')) + 7*24*60*60*1000 > (new Date()).getTime()
166 newVersionMessage
.style
.display
= 'none';
168 if (newVersionDismiss
!= null) {
169 newVersionDismiss
.addEventListener('click', function () {
170 localStorage
.setItem('newVersionDismiss', (new Date()).getTime());
174 var hiddenReturnurl
= document
.getElementsByName('returnurl');
175 if (hiddenReturnurl
!= null) {
176 hiddenReturnurl
.value
= window
.location
.href
;
180 * Autofocus text fields
182 var autofocusElements
= document
.querySelector('.autofocus');
183 if (autofocusElements
!= null) {
184 autofocusElements
.focus();
188 * Handle sub menus/forms
190 var openers
= document
.getElementsByClassName('subheader-opener');
191 if (openers
!= null) {
192 [].forEach
.call(openers
, function(opener
) {
193 opener
.addEventListener('click', function(event
) {
194 event
.preventDefault();
196 var id
= opener
.getAttribute('data-open-id');
197 var sub
= document
.getElementById(id
);
200 [].forEach
.call(document
.getElementsByClassName('subheader-form'), function (element
) {
201 if (element
!= sub
) {
202 removeClass(element
, 'open')
206 sub
.classList
.toggle('open');
212 function removeClass(element
, classname
) {
213 element
.className
= element
.className
.replace(new RegExp('(?:^|\\s)'+ classname
+ '(?:\\s|$)'), ' ');
217 * Remove CSS target padding (for fixed bar)
219 var anchor
= document
.querySelector('.anchor:target');
220 if (anchor
!= null) {
221 var padsize
= anchor
.clientHeight
;
222 this.window
.scroll(0, this.window
.scrollY
- padsize
);
223 anchor
.style
.paddingTop
= 0;