From 5b6ad09f98115d5ba57705b7df2abce6ba92f5cb Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 26 Dec 2014 01:23:56 +0100 Subject: [PATCH 001/190] Updated toolbar icons --- dist/main.css | Bin 34810 -> 34741 bytes dist/main.js | Bin 169647 -> 169569 bytes index.html | 75 ++++++++++++++++++++++++++----------- src/images/iconic.svg | 1 + src/scripts/view.js | 18 +++++---- src/styles/_header.scss | 81 ++++++++++++++++------------------------ src/styles/main.scss | 5 +++ 7 files changed, 103 insertions(+), 77 deletions(-) create mode 100755 src/images/iconic.svg diff --git a/dist/main.css b/dist/main.css index a792a6a1dc7849024d533d092cc777a13b9ff059..118f6b4f90e0c3247dc55bbc1389fb3af6ef1cd1 100644 GIT binary patch delta 483 zcmZ`#!Ab)$5QX+&y<1xlG*Se6$l9&cU9))brr@PLcq^LSWV^wVEJ@m~mg*<;kZ8Vy(W0Bx2nwro4=K9QuF`?&tYQA`F z(W$(ht!W{KA(rO#9#lh-LB;MEAD~c3LM60_`RLcTQcOq=w}9J9vspr|j08?N(%M{S z^@Bg&JxVj++j84!7EBn?335BOjYd)liBiG1rqaB0cTBmrd$Ob?IBlO0fZF OeDT=ZE-&6M_uL<$<*+OO delta 584 zcmZvZ&rZTX5XKWcz{Lw3;9>&7i_tc;7+YE&KyMlhSF*Ibbd$2vY!?I@CB%z24*Lc^ zfeG;)d<^a;CSE<+KUC3hnM`J8fAj4(ugk*MvhY$Z6$x_jC5z;OR#!Krw~O*%ECjH~ z0Ux;4G)>c%+VMd#q<7fTHF}{V!&{NjsoBUF=0Dn9>&iCpz<9Z$&ag| zp=LnKg9+w2mJo99;dnK#Z~Cf_iHL{~NLWcK7Y`M=u9V8!Sum|@tvHxT5(oKt-H^}S z$~-`>OWDxMMmkBmodhkI=JaN^y&uvcqwHj}vnc@lu#fz~c(kh){woF^2#8!720ogl ze@^(T$L{`~t){Gva!!Yyuzz%&W~%KiGYK%EA|~GHN<~Z})2|jXDNNTd RW>N)li;?6Tw*y5RlmW>Q8Danc delta 174 zcmaF3hHL#=u7(!IElgI0wkjG*%1NaqCHZ;r#U+VF3W-XZdPS+Z`DLljIf=!^8cLbT z`FXk^Dc#iEf|5!FIA2LqXS!7(ld=R@Phv_6x`ycmg-p(JxMU&5fz&8Ze^ba5&kR&J Yed2dUk?9FVOpQzmiQ69*F*PUy0ICB#NB{r; diff --git a/index.html b/index.html index 9c2e656..0473d73 100644 --- a/index.html +++ b/index.html @@ -29,39 +29,72 @@
+ + + -
diff --git a/src/images/iconic.svg b/src/images/iconic.svg new file mode 100755 index 0000000..19b6fcf --- /dev/null +++ b/src/images/iconic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/scripts/view.js b/src/scripts/view.js index 1dd6a1a..efac1e1 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -447,14 +447,14 @@ view.photo = { star: function() { - $('#button_star a').removeClass('icon-star-empty icon-star'); if (photo.json.star==1) { // Starred - $('#button_star a').addClass('icon-star'); - $('#button_star').attr('title', 'Unstar Photo'); + $('#button_star') + .addClass('active') + .attr('title', 'Unstar Photo'); } else { // Unstarred - $('#button_star a').addClass('icon-star-empty'); + $('#button_star').removeClass('active'); $('#button_star').attr('title', 'Star Photo'); } @@ -464,13 +464,15 @@ view.photo = { if (photo.json.public==1||photo.json.public==2) { // Photo public - $('#button_share a').addClass('active'); - $('#button_share').attr('title', 'Share Photo'); + $('#button_share') + .addClass('active') + .attr('title', 'Share Photo'); if (photo.json.init) $('#infobox .attr_visibility').html('Public'); } else { // Photo private - $('#button_share a').removeClass('active'); - $('#button_share').attr('title', 'Make Public'); + $('#button_share') + .removeClass('active') + .attr('title', 'Make Public'); if (photo.json.init) $('#infobox .attr_visibility').html('Private'); } diff --git a/src/styles/_header.scss b/src/styles/_header.scss index 344e375..cf89584 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -55,38 +55,41 @@ header { &.editable { cursor: pointer; } } - /* Button ------------------------------------------------*/ - .button { - color: #888; - font-family: 'FontAwesome'; - font-size: 21px; - font-weight: bold; - text-decoration: none !important; - cursor: pointer; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .3); - - &:hover { - color: #fff; - } - - &.left { - float: left; - position: absolute; - padding: 16px 10px 8px 18px; - } - - &.right { - float: right; - position: relative; - padding: 16px 19px 13px 11px; - } + /* Toolbars ------------------------------------------------*/ + .toolbar { + display: none; + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 0 10px; } - #tools_albums, - #tools_album, - #tools_photo, - #button_signin { - display: none; + /* Button ------------------------------------------------*/ + .button { + display: inline-block; + padding: 16px 8px 12px; + width: 15px; + cursor: pointer; + + &.left { float: left; } + + &.right { float: right; } + + .iconic { + fill: #888; + filter: drop-shadow( 0 -1px 0 rgba(0, 0, 0, .2) ); + transition: fill .2s ease; + } + + &:hover .iconic { fill: #fff; } + + &--star.active .iconic { fill: #f0ef77; } + + &--eye.active .iconic { fill: #ff9737; } + + &#button_signin { display: none; } + } /* Button Divider ------------------------------------------------*/ @@ -129,24 +132,6 @@ header { &:hover { opacity: 1; } } - /* Tools ------------------------------------------------*/ - .tools { - float: right; - padding: 14px 8px; - color: #888; - font-size: 21px; - text-shadow: 0 -1px 0 #222; - cursor: pointer; - - &:first-of-type { margin-right: 6px; } - - &:hover a { color: #fff; } - - .icon-star { color: #f0ef77; } - - .icon-share.active { color: #ff9737; } - } - /* Hosted with Lychee ------------------------------------------------*/ #hostedwith { float: right; diff --git a/src/styles/main.scss b/src/styles/main.scss index 319ffe8..0d0914e 100755 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -42,6 +42,11 @@ input { user-select: text !important; } +.iconic { + width: 100%; + height: 100%; +} + @import 'animations'; @import 'content'; @import 'contextmenu'; From 2c0a9a489fdf7e35f63cc4d6f02ceda7ac4303c6 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 28 Dec 2014 23:29:01 +0100 Subject: [PATCH 002/190] Fixed search x, new InfoBox close --- dist/main.css | Bin 34741 -> 35022 bytes dist/main.js | Bin 169569 -> 169673 bytes dist/view.js | Bin 96760 -> 96956 bytes index.html | 2 +- src/scripts/build.coffee | 11 +++++++++-- src/scripts/init.js | 11 ++++------- src/styles/_header.scss | 13 +++++++++---- src/styles/_infobox.scss | 22 +++++++++++++--------- src/styles/main.scss | 2 +- 9 files changed, 37 insertions(+), 24 deletions(-) diff --git a/dist/main.css b/dist/main.css index 118f6b4f90e0c3247dc55bbc1389fb3af6ef1cd1..3d0aa7c3cf158e596ac8a405e6e4a2d19886822c 100644 GIT binary patch delta 285 zcmdnm&vb4g(}vff%Ekp1)e}VoFM8Ub>Zmb#i`Aevy^3g@wgr<}gQ2 z9WY-(&uFrupV;JpFcA;9NU=g{VsWZ&erbtya%oX9P**{IW?o5ZQEf(QVoGX}f^u?B zYGP3^5GQ9?W#pHo7F9z{PfJU)-drDck8ARIU&+b+syvM5lVcK3n&~Cy%k!fo`(}vff5~c+e)aRWWF%R$=ZHAlk>tvq-!%$ z6H`))6qJ*5QWJ}UfjBwCDkHxvwWxaYsjz!olg}rfP*1E*%gIkHu>zY0H^>lZfr1%` z0J98DC;yF+U@|h8JU>@)azc?9SAIcaa%M@Tm7eM33rUL7iBNN4!iKfVnR#jXN%<8D Yll2)DC;v+>VYSN3&r97rEyY3w0Ip+7^#A|> diff --git a/dist/main.js b/dist/main.js index 7f95959c446030dc789d59d99057a3dbbf4f58be..f3495f11c8a1fbca46711e21cb7240b0cfd093a0 100644 GIT binary patch delta 361 zcma)%F-yZh9L32ME0m6cONaAcAt{NMjzyXbj)LOiENODKhw+Z)E;T|$CpQP{5F8vt zN8N;53LTsT{SYpWegna?{Q|DP-{U>r=Tq(NxpwhltxbXSa-{@6h>`?aL~w_CvEYgp zYKQWi7_1vpE3Z^ZoC-iQ)CW%m%E$#Vtz850 zh|!ZRQ3Q4yw{Zt|Y#gVNlz|Pda={L}xum#A89&+_Wc2Wla~GQ6(z*4G4!gc-3gOJ_ vY5x>$uQcb^>=4{u&eDV|79EIL7N>NhfR+p8&jfY!>lJdA{u9?Go>YDT7bATR delta 185 zcmX@Pmh0gfu7)j)ihH(u>|rcmW=!0^Z$INZ9_3UWCB3B5l9K$q_{5YHC7tB_ypq(4 z65rIkQazx6re1#D^t{K6;?obEVQd!AgG%QDrQ?&*m8LVUViewPcb4((Vn&VW+J#Ii z(>G)@@lIb<$Rsj7u8@gudUhexevp{p^#55*;?wPmm$WLGf0J@$-O8@`> diff --git a/dist/view.js b/dist/view.js index b03315efc2329984c0d4fa70757cd1b197216bf0..586ea9da20602257e9c7da9f202ce1e8684f6979 100644 GIT binary patch delta 258 zcmezInRU-s)`l&Nr()PMlk@X3lWiwYoGV_RXPZ}3qf}g!te=^in4Vg!50TU>E=yO^ zDX}d9Nf(m7sspU@j6}IXI3I+-m3Kr@L$vKI|#kT57+9ldb>UK7z#in%()Ob)uo9zkI#8v>^wVXGxr|)fEy@`?nWi7AWHbW+ DO7m5n delta 69 zcmdn@dFV - × + ×
diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index cb80906..93a1bc2 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -5,6 +5,13 @@ window.build = {} +build.iconic = (icon, classes, path) -> + + path = path || 'src/images/iconic.svg' + classes = classes || 'iconic' + + "" + build.divider = (title) -> "

#{ title }

" @@ -258,7 +265,7 @@ build.tags = (tags, forView) -> build.infoboxPhoto = (data, forView) -> html = """ -
+
""" @@ -356,7 +363,7 @@ build.infoboxPhoto = (data, forView) -> build.infoboxAlbum = (data, forView) -> html = """ -

About

+
""" diff --git a/src/scripts/init.js b/src/scripts/init.js index 9ee5980..de5a590 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -28,6 +28,7 @@ $(document).ready(function() { $('#button_settings') .on(event_name, contextMenu.settings); $('#button_info_album') .on(event_name, view.infobox.show); $('#button_info') .on(event_name, view.infobox.show); + $('.button_add') .on(event_name, contextMenu.add); $('#button_more') .on(event_name, function(e) { contextMenu.photoMore(photo.getID(), e) }); $('#button_move') .on(event_name, function(e) { contextMenu.move([photo.getID()], e) }); $('#hostedwith') .on(event_name, function() { window.open(lychee.website) }); @@ -54,7 +55,7 @@ $(document).ready(function() { /* Infobox */ $('#infobox') - .on(event_name, '.header a', view.infobox.hide) + .on(event_name, '.header .close', view.infobox.hide) .on(event_name, '#edit_title_album', function() { album.setTitle([album.getID()]) }) .on(event_name, '#edit_description_album', function() { album.setDescription(album.getID()) }) .on(event_name, '#edit_title', function() { photo.setTitle([photo.getID()]) }) @@ -160,13 +161,9 @@ $(document).ready(function() { .on(event_name, '.message .button:first', function() { if (modal.fns!==null) modal.fns[0](); if (!visible.signin()) modal.close() }) .on(event_name, '.message .button:last', function() { if (modal.fns!==null) modal.fns[1](); if (!visible.signin()) modal.close() }) - /* Add Dialog */ - .on(event_name, '.button_add', contextMenu.add) - /* Context Menu */ - .on('contextmenu', '.photo', function(e) { contextMenu.photo(photo.getID(), e) }) - .on('contextmenu', '.album', function(e) { contextMenu.album(album.getID(), e) }) - .on(event_name, '.contextmenu_bg', contextMenu.close) + .on('contextmenu', '.photo', function(e) { contextMenu.photo(photo.getID(), e) }) + .on('contextmenu', '.album', function(e) { contextMenu.album(album.getID(), e) }) /* Infobox */ .on(event_name, '#infobox_overlay', view.infobox.hide) diff --git a/src/styles/_header.scss b/src/styles/_header.scss index cf89584..cce3a85 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -122,14 +122,19 @@ header { #clearSearch { position: absolute; - top: 15px; - right: 81px; + top: 13px; + right: 78px; padding: 0; + color: #888; font-size: 20px; opacity: 0; - transition: opacity .2s ease-out; + transition: opacity .2s ease-out, color .2s ease-out; + cursor: pointer; - &:hover { opacity: 1; } + &:hover { + color: #fff; + opacity: 1; + } } /* Hosted with Lychee ------------------------------------------------*/ diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index 96cc7aa..49bab06 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -56,6 +56,7 @@ height: 49px; width: 100%; background-image: linear-gradient(to bottom, #2A2A2A, #131313); + border-bottom: 1px solid rgba(0, 0, 0, .7); } .header h1 { @@ -69,17 +70,20 @@ text-shadow: 0 -1px 0 rgba(0, 0, 0, .3); } - .header a { + .header .close { float: right; - padding: 15px 65px 15px 15px; - color: #fff; - font-size: 20px; - font-weight: bold; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .3); - opacity: .5; + padding: 16px 65px 12px 15px; + width: 15px; cursor: pointer; - &:hover { opacity: 1; } + .iconic { + fill: #888; + filter: drop-shadow( 0 -1px 0 rgba(0, 0, 0, .2) ); + transition: fill .2s ease; + } + + &:hover .iconic { fill: #fff; } + } /* Seperator ------------------------------------------------*/ @@ -90,7 +94,7 @@ box-shadow: 0 -1px 0 rgba(0, 0, 0, .5); &:first-child { - border: none; + border-top: 1px solid rgba(255, 255, 255, .02); box-shadow: none; } diff --git a/src/styles/main.scss b/src/styles/main.scss index 0d0914e..a6dab16 100755 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -33,7 +33,7 @@ body { .center { position: absolute; left: 50%; - top:50%; + top: 50%; } input { From 404ebc2988ae226944dc88088a99e0508fb47ecc Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 28 Dec 2014 23:51:13 +0100 Subject: [PATCH 003/190] Added Infobox basic elements to index.html --- dist/main.css | Bin 35022 -> 35002 bytes dist/main.js | Bin 169673 -> 169466 bytes dist/view.js | Bin 96956 -> 96717 bytes index.html | 15 ++++++++++++--- src/scripts/build.coffee | 16 ++++------------ src/scripts/init.js | 4 +++- src/scripts/view.js | 8 ++++---- src/styles/_infobox.scss | 11 +++++------ 8 files changed, 28 insertions(+), 26 deletions(-) diff --git a/dist/main.css b/dist/main.css index 3d0aa7c3cf158e596ac8a405e6e4a2d19886822c..3f19d66d586a1efc2470739156bd07549a39b047 100644 GIT binary patch delta 100 zcmX>%k!jaNrVW8{Y`Vtg1_c$9gW{4VAB>ZoEFvK|xzCStvYQ0|h=O@V#p#frQT2C(I6=s8QHuEJM&;S69IUe`` delta 94 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 MerSk_;PK@D1E~~0VgLXD delta 14292 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 diff --git a/dist/view.js b/dist/view.js index 586ea9da20602257e9c7da9f202ce1e8684f6979..5e70f806a4f62ceff092fc8f9ab27b7e576eb508 100644 GIT binary patch delta 85 zcmV-b0IL7I^##rI1%R{x3tg8HT>&8nX=870X=5O_GF<^v6u0$p0m}rJ$aVohmw0yp rgqKZt0SLDRcmaU|1PXmAESF1l0U8lvb!~8Eawk4KFJx(UJ|cZPFpnJ0 delta 268 zcmX^6nRU-s)`l&N+_7w#$@zJi$ - + @@ -80,7 +80,7 @@ - + @@ -104,7 +104,16 @@
-
+
diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index 93a1bc2..bfae055 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -8,9 +8,9 @@ window.build = {} build.iconic = (icon, classes, path) -> path = path || 'src/images/iconic.svg' - classes = classes || 'iconic' + classes = classes || '' - "" + "" build.divider = (title) -> @@ -264,10 +264,7 @@ build.tags = (tags, forView) -> build.infoboxPhoto = (data, forView) -> - html = """ - -
- """ + html = "" switch data.public when '0' then visible = 'No' @@ -355,17 +352,13 @@ build.infoboxPhoto = (data, forView) -> html += """
-
""" return html build.infoboxAlbum = (data, forView) -> - html = """ - -
- """ + html = "" switch data.public when '0' then visible = 'No' @@ -425,7 +418,6 @@ build.infoboxAlbum = (data, forView) -> html += """
-
""" return html \ No newline at end of file diff --git a/src/scripts/init.js b/src/scripts/init.js index de5a590..c50b5b0 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -42,6 +42,9 @@ $(document).ready(function() { /* Search */ $('#search').on('keyup click', function() { search.find($(this).val()) }); + /* Infobox */ + $('#infobox .header .close').on(event_name, view.infobox.hide); + /* Clear Search */ $('#clearSearch').on(event_name, function () { $('#search').focus(); @@ -55,7 +58,6 @@ $(document).ready(function() { /* Infobox */ $('#infobox') - .on(event_name, '.header .close', view.infobox.hide) .on(event_name, '#edit_title_album', function() { album.setTitle([album.getID()]) }) .on(event_name, '#edit_description_album', function() { album.setDescription(album.getID()) }) .on(event_name, '#edit_title', function() { photo.setTitle([photo.getID()]) }) diff --git a/src/scripts/view.js b/src/scripts/view.js index efac1e1..15b74ae 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -360,14 +360,14 @@ view.album = { password: function() { - if (album.json.password==1) $('#infobox .attr_password').html('Yes'); - else $('#infobox .attr_password').html('No'); + if (album.json.password==1) $('#infobox .attr_password').html('Yes'); + else $('#infobox .attr_password').html('No'); }, infobox: function() { - if ((visible.album()||!album.json.init)&&!visible.photo()) lychee.infobox.html(build.infoboxAlbum(album.json)).show(); + if ((visible.album()||!album.json.init)&&!visible.photo()) lychee.infobox.find('.wrapper').html(build.infoboxAlbum(album.json)); } @@ -495,7 +495,7 @@ view.photo = { infobox: function() { - lychee.infobox.html(build.infoboxPhoto(photo.json)).show(); + lychee.infobox.find('.wrapper').html(build.infoboxPhoto(photo.json)); } diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index 49bab06..9c759f1 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -7,8 +7,8 @@ position: fixed; width: 100%; height: 100%; - top: 0px; - left: 0px; + top: 0; + left: 0; background-color: rgba(0, 0, 0, .8); } @@ -16,16 +16,15 @@ z-index: 4; position: fixed; - right: 0px; + right: -370px; width: 350px; height: 100%; background-color: rgba(20, 20, 20, .98); box-shadow: -1px 0 2px rgba(0, 0, 0, .8); - display: none; - transform: translateX(370px); + transform: translateX(0); transition: transform .3s cubic-bezier(.51, .92, .24, 1.15); - &.active { transform: translateX(50px); } + &.active { transform: translateX(-92%); } /* Misc ------------------------------------------------*/ .wrapper { From a5adb4f0bdfbd536abf6754a2bc9d0f826f19f5a Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 29 Dec 2014 01:50:57 +0100 Subject: [PATCH 004/190] New design --- dist/main.css | Bin 35002 -> 33569 bytes dist/main.js | Bin 169466 -> 169544 bytes dist/view.js | Bin 96717 -> 96795 bytes index.html | 7 ++- src/scripts/build.coffee | 12 ++--- src/styles/_content.scss | 88 ++++++++--------------------------- src/styles/_contextmenu.scss | 19 +++----- src/styles/_header.scss | 33 +++++-------- src/styles/_infobox.scss | 31 +++++------- src/styles/main.scss | 2 +- 10 files changed, 61 insertions(+), 131 deletions(-) diff --git a/dist/main.css b/dist/main.css index 3f19d66d586a1efc2470739156bd07549a39b047..da444a280b177ce20a9404d64bd065901befb6e0 100644 GIT binary patch delta 881 zcmY*XPiWIn7$>RgWZgQ%>6n{cT)zQgB zWfu?Q13iesKs@L`A)e-h3W5j4yPiD?dJ%8K_tq6xetD4Zd++!C`+ZyM?8XE3&FyFu z=@el-+UN(okiltD4 z8zYAhRL!Yn{1VokC51kuSDvNel$fT-<^@&5#T%CAR4cl|>!O5ZiI66O?W(`a z%Ml(qdp8Qr>q8^q!Wr&@%w_GOQ?ZNbtXpydhs$bMw~Ur|*|f`Lg*Q!8U9$C{q)3Df ze>8Le34#hcT1qEB^{j5+v`N-wv+UqNDH~>>E@IEJD@slz=}7heJKS~bg+rp4R2>%= z?ckOo?r&#*qX>3J=DO$zL{27j*uFc!<^@<;9EMH)UQ9G8)WE0(&@1pP5@0=Z82pou zVzMl!c_~K$+kL6-eYOA_eu5nnVD@?v9w!dLGd~Ki>M?kq?2AZ38dif7Ob-4g7iho) zGX&Mq*e#Q09_Zwo z)rY?>cCj!$^OTX`=S-u6?!Y*_)JC9E=!EaHS0Wf=GWjRr*GmgbKZ&XqowDOK#c7JJ zh~e7hPb@qy9EI7!94iaqR^dyuQx?t delta 1905 zcmaJ?-EZ4e6qjAdMA^F0m7=7SICaMsh%LuJirs8FbS~-Kr#;qBoy|9#D_GAM-YEN{{pl@ier2>xmrU2QY)>L?)5tb= z1)36Df~aZQ-Vq4-I=0(GBo_9Yb#%jUT*nSxSm^RI<#IXrY4H~xlDj7!%Gq@HQT*i@ zDNHHRoTUcxs@Rc2m|2xNn#i)SQ#IH|DA2#ga4w2gUN?19P%l@`r~s*j(;*4OAhvmyw$_m$-s#BCBc} zedqrRJ|M(2lR`q{3?(&BDfVB6R;0_p%gE8CiOTO*J-6jphSY}p@kCry6pB1EhFVDv zX|Em^OqbjyDr0iPkahTR`R%TZX@y8WK~r=_{?3Hx6cF8#TSW<-G~6!t=a>0V+Tg?7&?tsVpK|k8dfGSi;9z5x-wfxRAQDXKcBW<{s%zgRn=L|IXVOPpx9)d{y-SWJ z5Sxf8+-SNUK@Nf2uioY~*m$is%Zi#6PgaGq7jMEpS3U`z-Mq@hv?4S3cs0%E)6i%= z%`160TulT&y#5sre_3bX*48@Ut;OJvtzTm&R3*cH@WrJxR}Ai5a(H+Lug&MrJ3)i85aoRJIT|7Dx(uoV9TjGO9p#8>-@tyjTYc%^xUk$J`>@G siDElTMSXzQmcq^uWX&%T4>^NRVjl?nUVdtE0BUqs5D`MbXJ%LU7iDIB0{{R3 diff --git a/dist/main.js b/dist/main.js index b73c1a02160d09edd5c0c71ad510583eef084acb..39fe93b6a12a4a752b4a2eb03d9a3534f9efdca9 100644 GIT binary patch delta 3532 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 bTUoktr0gAXJMQKC%LZ=8EkzzETeRX|i*;p= diff --git a/dist/view.js b/dist/view.js index 5e70f806a4f62ceff092fc8f9ab27b7e576eb508..8927bd8e4e90f2ba040e662de16aabc7c436e34f 100644 GIT binary patch delta 203 zcmX^6nRWIT)`l&NorzNFc1qewrI|S?dYQ@jd6~%?O2s9KMM|35O4Fw%GU`cU%BNPQ zf~7AcGU{T{o|9Qz0+#1VV$_z#)SjG^pPUU+u-rL`kqL_daQppJ7?W_@zkOc{BflsB DCWb#< delta 137 zcmbRJh4t)b)`l&NorydOnaTNiy2T}lMe26b7bi06@j^v15{puSLa!1Tb@?GeMXC8k zDXAcJhDnUtLJ+}{%v_){8~sE(CC%xAsf=RVCnqsJVMH}|VhUpts=3>FQW^P00sL+) Ap#T5? diff --git a/index.html b/index.html index 70df7bd..34d5dfc 100644 --- a/index.html +++ b/index.html @@ -45,8 +45,11 @@ - - × + + + +
diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index bfae055..0aa0489 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -59,10 +59,10 @@ build.album = (data) -> if lychee.publicMode is false - if data.star is '1' then html += "" - if data.public is '1' then html += "" - if data.unsorted is '1' then html += "" - if data.recent is '1' then html += "" + if data.star is '1' then html += "#{ build.iconic('star') }" + if data.public is '1' then html += "#{ build.iconic('eye') }" + if data.unsorted is '1' then html += "#{ build.iconic('list') }" + if data.recent is '1' then html += "#{ build.iconic('clock') }" html += "
" @@ -94,8 +94,8 @@ build.photo = (data) -> html += "
" - if data.star is '1' then html += "" - if lychee.publicMode is false and data.public is '1' and album.json.public isnt '1' then html += "" + if data.star is '1' then html += "#{ build.iconic('star') }" + if lychee.publicMode is false and data.public is '1' and album.json.public isnt '1' then html += "#{ build.iconic('eye') }" html += "
" diff --git a/src/styles/_content.scss b/src/styles/_content.scss index 6687499..9b476c4 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -8,22 +8,6 @@ width: 100%; min-height: calc(100% - 90px); -webkit-overflow-scrolling: touch; - - // Adds a gradient to the top - &::before { - content: ''; - position: absolute; - left: 0px; - width: 100%; - height: 20px; - background: linear-gradient(to bottom, #262626, #222); - border-top: 1px solid #333; - } - - // Removes the gradient when using the view - &.view::before { - display: none; - } } /* Photo ------------------------------------------------*/ @@ -70,7 +54,7 @@ height: 200px; background-color: #222; border-radius: 2px; - border: 2px solid #ccc; + border: 2px solid #bbb; &:first-child, &:nth-child(2) { @@ -91,7 +75,7 @@ &:hover img, &.active img { - box-shadow: 0 0 5px #005ecc; + box-shadow: 0 0 3px #2293EC; } } @@ -150,12 +134,11 @@ .album .badge, .photo .badge { position: absolute; - margin-top: -1px; - margin-left: 12px; + margin: -1px 0 0 12px; padding: 12px 7px 3px 7px; - background: linear-gradient(to bottom, #d64b4b 0%, #ab2c2c 100%); - box-shadow: 0 0 3px rgba(0, 0, 0, .8); - border-radius: 0 0 3px 3px; + box-shadow: 0 0 2px rgba(0, 0, 0, .6); + background: #d02a32; + border-radius: 0 0 5px 5px; border: 1px solid #fff; border-top: none; color: #fff; @@ -163,55 +146,23 @@ text-shadow: 0 1px 0 rgba(0, 0, 0, .4); opacity: .9; - &::after { - content: ''; - position: absolute; - margin-top: -12px; - margin-left: -26px; - width: 38px; - height: 5px; - background: linear-gradient(to bottom, rgba(0,0,0,1) 0%,rgba(0,0,0,0) 100%); - opacity: .4; + &:nth-child(2n) { margin-left: 57px; } + + .iconic { + fill: #fff; + width: 21px; + filter: drop-shadow( 0 -1px 0 rgba(0, 0, 0, .1) ); } - - &:nth-child(2n) { - margin-left: 57px; - } - } - - .album .badge.icon-star, - .photo .badge.icon-star { - padding: 12px 8px 3px 8px; - - &::after { margin-left: -29px; } - } - - .album .badge.icon-share, - .photo .badge.icon-share { - padding: 12px 6px 3px 8px; - - &::after { margin-left: -31px; } - } - - .album .badge.icon-time, - .photo .badge.icon-time { - padding: 12px 8px 3px 9px; - - ::after { margin-left: -29px; } - } - - .album .badge.icon-reorder::after { - margin-left: -30px; } /* Divider ------------------------------------------------*/ .divider { float: left; + margin: 50px 0 0; + padding: 10px 0; width: 100%; - margin-top: 50px; opacity: 0; - border-top: 1px solid rgba(255, 255, 255, .03); - box-shadow: 0 -1px 0 rgba(0, 0, 0, .25); + background: rgba(0, 0, 0, .15); &:first-child { margin-top: 0; @@ -220,11 +171,10 @@ h1 { float: left; - margin: 20px 0 0 30px; - color: #fff; + margin: 0 0 0 30px; + color: rgba(255, 255, 255, .6); font-size: 14px; font-weight: bold; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .5); } } @@ -238,8 +188,8 @@ margin-top: -60px; margin-left: -90px; padding-top: 20px; - color: rgba(20, 20, 20, 1); - text-shadow: 0px 1px 0px rgba(255, 255, 255, .05); + color: rgba(15, 15, 15, 1); + text-shadow: 0px 1px 0px rgba(255, 255, 255, .01); text-align: center; .icon { diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index f1965b0..a4c140e 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -6,23 +6,20 @@ .basicContext { padding: 5px 0 6px; - background: linear-gradient(to bottom, #444 0%, #2f2f2f 100%); - border: 1px solid rgba(0, 0, 0, .5); - border-bottom: 1px solid rgba(0, 0, 0, .6); + background: linear-gradient(to bottom, #333, #252525); + border: 1px solid rgba(0, 0, 0, .7); + border-bottom: 1px solid rgba(0, 0, 0, .8); border-radius: 5px; - box-shadow: 0 1px 4px rgba(0, 0, 0, .15), inset 0px 1px 0px rgba(255, 255, 255, .08); + box-shadow: 0 1px 4px rgba(0, 0, 0, .2), inset 0 1px 0 rgba(255, 255, 255, .05); /* Item ------------------------------------------------*/ tr { margin-bottom: 2px; color: #eee; font-size: 14px; - text-shadow: 0 -1px 0px rgba(0, 0, 0, .2); + text-shadow: 0 -1px 0px rgba(0, 0, 0, .1); - &.separator { - background-color: rgba(0, 0, 0, .2); - border-bottom: 1px solid rgba(255, 255, 255, .1); - } + &.separator { background-color: rgba(0, 0, 0, .3); } } tr td { @@ -32,9 +29,7 @@ border-radius: 0; transition: none; - &:hover { - background: linear-gradient(to bottom, #6a84f2, #4967F0); - } + &:hover { background: linear-gradient(to bottom, #2293EC, darken(#2293EC, 2%)); } } tr td .albumCover { diff --git a/src/styles/_header.scss b/src/styles/_header.scss index cce3a85..d4faa07 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -7,8 +7,8 @@ header { position: fixed; height: 49px; width: 100%; - background: linear-gradient(to bottom, #3E3E3E, #282828); - border-bottom: 1px solid #161616; + background: linear-gradient(to bottom, #222222, #1a1a1a); + border-bottom: 1px solid #0f0f0f; z-index: 1; transition: transform .3s ease-out; @@ -29,15 +29,7 @@ header { background: none; border-bottom: none; - &.error { - background-color: rgba(10, 10, 10, .99); - } - - .button, - #title, - .tools { - text-shadow: none !important; - } + &.error { background-color: rgba(10, 10, 10, .99); } } /* Title ------------------------------------------------*/ @@ -50,7 +42,7 @@ header { font-size: 16px; font-weight: bold; text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .3); + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); &.editable { cursor: pointer; } } @@ -68,7 +60,7 @@ header { /* Button ------------------------------------------------*/ .button { display: inline-block; - padding: 16px 8px 12px; + padding: 17px 8px 15px; width: 15px; cursor: pointer; @@ -77,7 +69,7 @@ header { &.right { float: right; } .iconic { - fill: #888; + fill: #aaa; filter: drop-shadow( 0 -1px 0 rgba(0, 0, 0, .2) ); transition: fill .2s ease; } @@ -106,10 +98,9 @@ header { width: 80px; margin: 12px 12px 0 0; padding: 5px 12px 6px 12px; - background-color: #383838; + background-color: #222; color: #fff; - border: 1px solid rgba(0, 0, 0, .6); - box-shadow: 0 1px 0 rgba(255, 255, 255, .06); + border: 0; outline: none; border-radius: 50px; opacity: .6; @@ -144,14 +135,12 @@ header { margin: 13px 9px; color: #888; font-size: 13px; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .3); + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + border-radius: 100px; display: none; cursor: pointer; - &:hover { - background-color: rgba(0, 0, 0, .2); - border-radius: 100px; - } + &:hover { background-color: rgba(0, 0, 0, .3); } } } \ No newline at end of file diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index 9c759f1..12caaab 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -19,8 +19,8 @@ right: -370px; width: 350px; height: 100%; - background-color: rgba(20, 20, 20, .98); - box-shadow: -1px 0 2px rgba(0, 0, 0, .8); + background-color: rgba(30, 30, 30, .98); + box-shadow: -1px 0 2px rgba(0, 0, 0, .7); transform: translateX(0); transition: transform .3s cubic-bezier(.51, .92, .24, 1.15); @@ -54,8 +54,8 @@ float: left; height: 49px; width: 100%; - background-image: linear-gradient(to bottom, #2A2A2A, #131313); - border-bottom: 1px solid rgba(0, 0, 0, .7); + background: linear-gradient(to bottom, #1f1f1f, #1a1a1a); + border-bottom: 1px solid #0f0f0f; } .header h1 { @@ -66,7 +66,7 @@ font-size: 16px; font-weight: bold; text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .3); + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); } .header .close { @@ -88,21 +88,15 @@ /* Seperator ------------------------------------------------*/ .separator { float: left; + padding: 8px 0; width: 100%; - border-top: 1px solid rgba(255, 255, 255, .02); - box-shadow: 0 -1px 0 rgba(0, 0, 0, .5); - - &:first-child { - border-top: 1px solid rgba(255, 255, 255, .02); - box-shadow: none; - } + background: rgba(0, 0, 0, .15); h1 { - margin: 20px 0 5px 20px; - color: #fff; + margin: 0 0 0 20px; + color: rgba(255, 255, 255, .6); font-size: 14px; font-weight: bold; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .3); } } @@ -150,15 +144,14 @@ #tags .tag { float: left; - padding: 4px 7px; + padding: 6px 10px; margin: 0 6px 8px 0; background-color: rgba(0, 0, 0, .5); - border: 2px solid rgba(255, 255, 255, .3); border-radius: 100px; font-size: 12px; - transition: border .3s; + transition: background-color .3s; - &:hover { border: 2px solid #aaa; } + &:hover { background-color: rgba(0, 0, 0, .3); } } #tags .tag span { diff --git a/src/styles/main.scss b/src/styles/main.scss index a6dab16..6f8a31d 100755 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -17,7 +17,7 @@ body { } body { - background-color: #222; + background-color: #1d1d1d; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; -webkit-font-smoothing: antialiased; From d21a8c650051a808697f36f3dbb748dd7721436f Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 29 Dec 2014 23:19:39 +0100 Subject: [PATCH 005/190] Serveral style changes including the border of albums/photos --- dist/main.css | Bin 33569 -> 33435 bytes dist/main.js | Bin 169544 -> 169542 bytes dist/view.js | Bin 96795 -> 96793 bytes src/styles/_content.scss | 109 ++++++++++++++--------------------- src/styles/_contextmenu.scss | 4 +- 5 files changed, 44 insertions(+), 69 deletions(-) diff --git a/dist/main.css b/dist/main.css index da444a280b177ce20a9404d64bd065901befb6e0..a2d4ad9d8837f7e84ed8d05529f7d420dc3fabb4 100644 GIT binary patch delta 577 zcmY+AL2J}N6vs)H3NBU9W_Pph+D(mHx+MuSiCxx-AR>Z2sP*8%izV4)H_>b-CR4iG zBD9AJg12`ODxy^H!hV5zmVzGq3_aG5;LM_JWf+)wy!U^<|Nql#d2d(#T23%xuv={kd_Rh_R=OU=ut9YnY7o6fzv@U46VZ`EP}w+z@)XW^yVlrS8ZYj9ZE zhfVbtJSpwLhpM3tysRIuaZ1j0;tZuj_&uv$Xt!LSGDZi28V;|t3rIt7srLS&@PsC= zFt-LjS1YhRQsAg|<5m#oY2uBDpV00L_e7s>5JRHf?a?)6=J94ouvj}WOmyG(VW&PP zwa5GQj%;Y?FAqkj>C)8e#%x3oCz=>$H2p72W!@IFXL2`1)ErpL`o6b-3~?+Qij8Y^ z%pIN;5~}|uq0@-qU~mo&vbv00i4ygmQ` delta 706 zcmbVK&ubGw6eg?vfeoR^=Eo*dr;XcYOE=7Jc0;l`R-r`&DR?c+{>lz)I?L|Hw#FRW zV=26o)Poj02_ojKS8x6sda-vsx!b5DdML%{u7(!IElf-e%u0qz+nF1foW%fXtp`N_ diff --git a/dist/view.js b/dist/view.js index 8927bd8e4e90f2ba040e662de16aabc7c436e34f..494d917edd593b48d8bf7bb0c24d34dd97b809e8 100644 GIT binary patch delta 19 bcmbRJg>~i^)`l&NSCSbGw_i_YbP)ppTlxqQ delta 21 dcmbRFg?089)`l&NSCW~P43)NDO=ffv0|04v2vq<8 diff --git a/src/styles/_content.scss b/src/styles/_content.scss index 9b476c4..4e6b7e7 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -4,18 +4,18 @@ #content { position: absolute; - padding: 50px 0px 33px 0px; + padding: 50px 0 33px; width: 100%; - min-height: calc(100% - 90px); + min-height: calc(100% - 83px); -webkit-overflow-scrolling: touch; } - /* Photo ------------------------------------------------*/ - .photo { + /* Albums and Photos ------------------------------------------------*/ + .album, + .photo { float: left; - display: inline-block; - width: 206px; - height: 206px; + width: 202px; + height: 202px; margin: 30px 0 0 30px; cursor: pointer; @@ -24,74 +24,52 @@ width: 200px; height: 200px; background-color: #222; - border-radius: 2px; - border: 2px solid #ccc; + box-shadow: 0 2px 5px rgba(0, 0, 0, .5); + border: 1px solid rgba(255, 255, 255, .5); + transition: opacity .3s ease-out, transform .3s ease-out, border-color .3s ease-out; } &:hover img, &.active img { - box-shadow: 0 0 5px #005ecc; - } - - &:active { - transition-duration: .1s; - transform: scale(.98); + border-color: #2293EC; } } /* Album ------------------------------------------------*/ .album { - float: left; - display: inline-block; - width: 204px; - height: 204px; - margin: 30px 0px 0px 30px; - cursor: pointer; - - img { - position: absolute; - width: 200px; - height: 200px; - background-color: #222; - border-radius: 2px; - border: 2px solid #bbb; - - &:first-child, - &:nth-child(2) { - transform: rotate(0) translateY(0) translateX(0); - opacity: 0; - } + img:first-child, + img:nth-child(2) { + transform: rotate(0) translateY(0) translateX(0); + opacity: 0; } - &:hover img:first-child { - transform: rotate(-2deg) translateY(10px) translateX(-12px); - opacity: 1; - } + &:hover img:nth-child(1), + &:hover img:nth-child(2) { opacity: 1; } - &:hover img:nth-child(2) { - transform: rotate(5deg) translateY(-8px) translateX(12px); - opacity: 1; - } + &:hover img:nth-child(1) { transform: rotate(-2deg) translateY(10px) translateX(-12px); } - &:hover img, - &.active img { - box-shadow: 0 0 3px #2293EC; - } + &:hover img:nth-child(2) { transform: rotate(5deg) translateY(-8px) translateX(12px); } + } + + /* Photo ------------------------------------------------*/ + .photo:active { + transition-duration: .1s; + transform: scale(.98); } /* Album/Photo Overlay ------------------------------------------------*/ .album .overlay, .photo .overlay { position: absolute; + margin: 0 1px; width: 200px; - height: 200px; - margin: 2px; - background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 60%, rgba(0,0,0,0.5) 80%, rgba(0,0,0,0.9) 100%); + background: rgba(0, 0, 0, .6); + bottom: 1px; } // No overlay for empty albums .album img[data-type^='nonretina'] + .overlay { - background: rgba(0, 0, 0, 0.2); + background: none; } .photo .overlay { @@ -107,7 +85,7 @@ .photo .overlay h1 { min-height: 19px; width: 185px; - margin: 152px 0 3px 15px; + margin: 12px 0 5px 15px; color: #fff; font-size: 16px; font-weight: bold; @@ -116,19 +94,13 @@ .album .overlay a, .photo .overlay a { + display: block; + margin: 0 0 12px 15px; font-size: 11px; - color: #aaa; + color: #bbb; } - .album .overlay a { - margin-left: 15px; - } - - .photo .overlay a { - margin: 155px 0 5px 15px; - - span { margin: 0 5px 0 0; } - } + .photo .overlay a span { margin: 0 6px 0 0; } /* Badges ------------------------------------------------*/ .album .badge, @@ -159,14 +131,16 @@ .divider { float: left; margin: 50px 0 0; - padding: 10px 0; + padding: 10px 0 0; width: 100%; opacity: 0; - background: rgba(0, 0, 0, .15); + border-top: 1px solid rgba(255, 255, 255, .02); + box-shadow: 0 -1px 0 0 rgba(0, 0, 0, .2); &:first-child { - margin-top: 0; - border-top: none; + margin-top: 10px; + border-top: 0; + box-shadow: none; } h1 { @@ -175,6 +149,7 @@ color: rgba(255, 255, 255, .6); font-size: 14px; font-weight: bold; + text-shadow: 0 -1px 0 rgba(0, 0, 0, .1); } } @@ -189,7 +164,7 @@ margin-left: -90px; padding-top: 20px; color: rgba(15, 15, 15, 1); - text-shadow: 0px 1px 0px rgba(255, 255, 255, .01); + text-shadow: 0 1px 0 rgba(255, 255, 255, .01); text-align: center; .icon { diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index a4c140e..9f404e0 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -29,7 +29,7 @@ border-radius: 0; transition: none; - &:hover { background: linear-gradient(to bottom, #2293EC, darken(#2293EC, 2%)); } + &:hover { background: linear-gradient(to bottom, #2293EC, darken(#2293EC, 5%)); } } tr td .albumCover { @@ -48,7 +48,7 @@ width: 100%; margin: -2px 0 -1px -2px; padding: 5px 7px 6px 7px; - background-color: #444; + background-color: #333; color: #fff; border: 1px solid rgba(0, 0, 0, .4); box-shadow: 0px 1px 0px rgba(255, 255, 255, .05); From 7fd78e2cc026f8187995e94b23fc5c26e97e5249 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 29 Dec 2014 23:19:48 +0100 Subject: [PATCH 006/190] Fixed a bug not showing camera next photo date --- src/scripts/build.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index 0aa0489..6be120a 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -87,7 +87,7 @@ build.photo = (data) ->

#{ title }

""" - if data.cameraDate is '1' + if data.cameraDate is 1 html += "#{ data.sysdate }" else html += "#{ data.sysdate }" From 19a37ddebf3defa759f649eb731fd86678907837 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 2 Jan 2015 00:46:23 +0100 Subject: [PATCH 007/190] button--left and --right, content::before, new back and forward photo navigation --- dist/main.css | Bin 33435 -> 34198 bytes dist/main.js | Bin 169542 -> 170009 bytes dist/view.js | Bin 96793 -> 96805 bytes index.html | 34 +++++++++++++++--------------- src/scripts/build.coffee | 4 ++-- src/scripts/view.js | 26 +++++++++++++++++++++-- src/styles/_content.scss | 13 +++++++++--- src/styles/_header.scss | 4 ++-- src/styles/_imageview.scss | 42 ++++++++++++++++++++++++++----------- 9 files changed, 85 insertions(+), 38 deletions(-) diff --git a/dist/main.css b/dist/main.css index a2d4ad9d8837f7e84ed8d05529f7d420dc3fabb4..666e7cfa9cf4f24783318cf443f1c8699ef0d24c 100644 GIT binary patch delta 561 zcmZuu&u`N(7!}pDA4scOHAQqPQCOMUY)zC@>y$Z~;7Zj2rzISa=B8d_t;Ck&mO>A^ zj1yd@PvQaxxN|`2i9drISN;>6vLH>GEZgsU&(HGn_xXL{(}%*3CtAG`u|$$YA~Yap zOptkAH=90u*X~1eeY3!4a7W*R$J$nzvy@885+ukNOFAWsP&@SsmIXiiy4n`M`(HLz z-0qHl^-F_~Czo&@=zV0lhkRx@hU0TQ9MWWjJXO0LKJ(wup^TAxpkPesD3+*`(E}Wv zj|7_}Lo2242yz`~$H*2aRUg$o(~l-1WddX>z+~9&tDVwD5s#k~jrI+1Z zGVnirp2zxjQr|Xgs+vcm`57ILkr)kdtJCea^J#k~+&$LssUWHmOWA2>!`?SdA5I@s MtG7yvXW{YgUo2X#SpWb4 delta 199 zcmbQ%%{04}X@i5vy=SA`X)j>HE!xgx6OY#e>bPYj5_o~G#Oo0sRlGKV4 z-QtYIl>Bll0|mo^3I!t|RyHs&uud*5D$XymD#*{wD@iS~&M!zz&Mc|4GMH=|Avf73 ffRo9nc(Or&D2M`CCl|%RT@6#DXSCTf+E)tzS1&@J diff --git a/dist/main.js b/dist/main.js index b578539cd042eaed4f08cfa36d940d36dcb728e5..3850ab1d12f55b44d3745ad8180c377fd1b5dac7 100644 GIT binary patch delta 523 zcmb`E%}T>S5XZ@C4~j*E9_mHIddSA4p@Ih?RG&aRd6FJB$uwEnY|3U+KU(nv&w7%@ zi%-yl2cd7^3kbfBrd0$#dK2a{e||IbgLxj#-#^Y@TpLg5CExRVRGQG@Ct(8Mv6RNp zV{qhkn1~3bYXXiHwp}%y=*n^;EAo;OE!|bptrcF&KQ_7_Z;W zBCx?rSOmoOf#=X4doaE6X4G_3p*nKqq?u)HAM|bCsGnP$381nOOByi{im1#CGNrQA zHDw%7(sa#_@;2>1qB1KaC)jeNr;;KK_9b^LY+LqODVY5hRNn+EV?+97xOn$~s>sbJ z!3=Ht`lfFzAN-$W{!?Na+Qg7L^>VJ28ea7ZPn28T}hCO3Z1Eu7j4ic-rm^Gl22TDRXQV_L(bs*s$MSX^wY zo|&AVr<~r{)`l&N{i*VHO4>=KnK>zXnaTNinaLVT$%#d&CAvAOX(dXU+Dg+`q%vA4 T;80YQnVtbwwf$Erqr3~i^)`l&N{i%`)$vKI|#kT61$@zJ@$%#d&CAvAOX(j4*)7PakT1a7$F3L>L N0LpJ?OJkH50RTUj8nOTY diff --git a/index.html b/index.html index 34d5dfc..36d3c2f 100644 --- a/index.html +++ b/index.html @@ -34,66 +34,66 @@ diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index 6be120a..3fdfa8b 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -106,8 +106,8 @@ build.imageview = (data, size, visibleControls) -> return '' if not data? html = """ - - + + """ if size is 'big' diff --git a/src/scripts/view.js b/src/scripts/view.js index 15b74ae..044dc76 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -488,8 +488,30 @@ view.photo = { lychee.imageview.html(build.imageview(photo.json, photo.getSize(), visible.controls())); - if ((album.json&&album.json.content&&album.json.content[photo.getID()]&&album.json.content[photo.getID()].nextPhoto==='')||lychee.viewMode) $('a#next').hide(); - if ((album.json&&album.json.content&&album.json.content[photo.getID()]&&album.json.content[photo.getID()].previousPhoto==='')||lychee.viewMode) $('a#previous').hide(); + var nextArrow = lychee.imageview.find('a#next'), + previousArrow = lychee.imageview.find('a#previous'), + hasNext = album.json&&album.json.content&&album.json.content[photo.getID()]&&album.json.content[photo.getID()].nextPhoto==='', + hasPrevious = album.json&&album.json.content&&album.json.content[photo.getID()]&&album.json.content[photo.getID()].previousPhoto===''; + + if (hasNext||lychee.viewMode) { nextArrow.hide(); } + else { + + var nextPhotoID = album.json.content[photo.getID()].nextPhoto, + nextPhoto = album.json.content[nextPhotoID]; + + nextArrow.css('background-image', 'linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url("' + nextPhoto.thumbUrl + '")'); + + } + + if (hasPrevious||lychee.viewMode) { previousArrow.hide(); } + else { + + var previousPhotoID = album.json.content[photo.getID()].previousPhoto, + previousPhoto = album.json.content[previousPhotoID]; + + previousArrow.css('background-image', 'linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url("' + previousPhoto.thumbUrl + '")'); + + }; }, diff --git a/src/styles/_content.scss b/src/styles/_content.scss index 4e6b7e7..8d72e76 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -8,12 +8,21 @@ width: 100%; min-height: calc(100% - 83px); -webkit-overflow-scrolling: touch; + + &::before { + content: ''; + position: absolute; + width: 100%; + height: 1px; + border-top: 1px solid rgba(255, 255, 255, .02); + } } /* Albums and Photos ------------------------------------------------*/ .album, .photo { float: left; + position: relative; width: 202px; height: 202px; margin: 30px 0 0 30px; @@ -167,9 +176,7 @@ text-shadow: 0 1px 0 rgba(255, 255, 255, .01); text-align: center; - .icon { - font-size: 80px; - } + .icon { font-size: 80px; } p { font-size: 18px; diff --git a/src/styles/_header.scss b/src/styles/_header.scss index d4faa07..89ae2ef 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -64,9 +64,9 @@ header { width: 15px; cursor: pointer; - &.left { float: left; } + &--left { float: left; } - &.right { float: right; } + &--right { float: right; } .iconic { fill: #aaa; diff --git a/src/styles/_imageview.scss b/src/styles/_imageview.scss index d30962c..8233862 100644 --- a/src/styles/_imageview.scss +++ b/src/styles/_imageview.scss @@ -49,7 +49,7 @@ /* Previous/Next Buttons ------------------------------------------------*/ .arrow_wrapper { position: fixed; - width: 20%; + width: 15%; height: calc(100% - 60px); top: 60px; z-index: 1; @@ -58,24 +58,42 @@ &.next { right: 0; } - a#previous { left: 20px; } - - a#next { right: 20px; } - a { position: fixed; top: 50%; - margin-top: -10px; - color: #fff; - font-size: 50px; - text-shadow: 0 1px 2px #000; + margin: -19px 0 0; + padding: 8px 12px; + width: 16px; + height: 22px; + // The background-image will be styled dynamically via JS + // background-image: linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url(''); + background-size: 100% 100%; + border: 1px solid rgba(255, 255, 255, .8); cursor: pointer; - opacity: 0; + opacity: .6; z-index: 2; - transition: opacity .2s; + transition: transform .2s ease-out, opacity .2s ease-out; + + &#previous { + left: -1px; + transform: translateX(-100%); + } + + &#next { + right: -1px; + transform: translateX(100%); + } } - &:hover a { opacity: .2; } + &:hover a#previous, + &:hover a#next { transform: translateX(0); } + + a:hover { opacity: 1; } + + .iconic { + fill: rgba(255, 255, 255, .8); + filter: drop-shadow( 0 1px 0 rgba(0, 0, 0, .4) ); + } } } \ No newline at end of file From a7ec8c7349c2e7b94f1bb9e7ad297d489faf220e Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 2 Jan 2015 01:42:28 +0100 Subject: [PATCH 008/190] Infobox now uses the same separators as the content --- src/styles/_infobox.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index 12caaab..057b2b5 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -88,9 +88,10 @@ /* Seperator ------------------------------------------------*/ .separator { float: left; - padding: 8px 0; + padding: 12px 0 8px; width: 100%; - background: rgba(0, 0, 0, .15); + border-top: 1px solid rgba(255, 255, 255, .02); + box-shadow: 0 -1px 0 0 rgba(0, 0, 0, .2); h1 { margin: 0 0 0 20px; From e684d7142db579c1c2daf8e5ce2fb5377e2cd284 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 2 Jan 2015 01:43:07 +0100 Subject: [PATCH 009/190] New separators for the context menu --- src/styles/_contextmenu.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index 9f404e0..74ce2d9 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -19,7 +19,10 @@ font-size: 14px; text-shadow: 0 -1px 0px rgba(0, 0, 0, .1); - &.separator { background-color: rgba(0, 0, 0, .3); } + &.separator { + background-color: rgba(0, 0, 0, .2); + border-bottom: 1px solid rgba(255, 255, 255, .06); + } } tr td { From 1eadb1c501bd8966d89661c56d0216804c8d57ad Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 2 Jan 2015 01:44:06 +0100 Subject: [PATCH 010/190] New caret down icon for the editable title --- src/styles/_header.scss | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/styles/_header.scss b/src/styles/_header.scss index 89ae2ef..8e82ec8 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -43,8 +43,22 @@ header { font-weight: bold; text-align: center; text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + z-index: 1; + + .iconic { + display: none; + margin: 0 0 0 10px; + width: 10px; + fill: rgba(255, 255, 255, .5); + filter: drop-shadow( 0 -1px 0 rgba(0, 0, 0, .2) ); + transition: fill .2s ease; + } + + &:hover .iconic { fill: rgba(255, 255, 255, 1); } &.editable { cursor: pointer; } + + &.editable .iconic { display: inline-block; } } /* Toolbars ------------------------------------------------*/ @@ -69,12 +83,12 @@ header { &--right { float: right; } .iconic { - fill: #aaa; + fill: rgba(255, 255, 255, .5); filter: drop-shadow( 0 -1px 0 rgba(0, 0, 0, .2) ); transition: fill .2s ease; } - &:hover .iconic { fill: #fff; } + &:hover .iconic { fill: rgba(255, 255, 255, 1); } &--star.active .iconic { fill: #f0ef77; } From 3465c961806af15bb9f9dd0a4b09e32f71174239 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 2 Jan 2015 01:45:57 +0100 Subject: [PATCH 011/190] Several changes - New classes for previous and forward photo - Improved setTitle - Use document.title for lychee.title as default - Updated jQuery and other deps --- dist/main.css | Bin 34198 -> 34664 bytes dist/main.js | Bin 170009 -> 171049 bytes dist/view.js | Bin 96805 -> 96911 bytes src/bower.json | 2 +- src/package.json | 2 +- src/scripts/build.coffee | 4 +-- src/scripts/contextMenu.js | 32 ++++++++++++++++++ src/scripts/init.js | 65 ++++++++++++++++++------------------- src/scripts/lychee.js | 25 +++++++------- src/scripts/view.js | 12 +++---- src/styles/_imageview.scss | 4 +-- 11 files changed, 87 insertions(+), 59 deletions(-) diff --git a/dist/main.css b/dist/main.css index 666e7cfa9cf4f24783318cf443f1c8699ef0d24c..5a5961f4e74159bddf2d998f14c9f1b60bc860d0 100644 GIT binary patch delta 240 zcmbQ%&Ge#=X+x0`lac0R-E_Ih^F;U<%{CV+UDEWouF}oSOG&M;GOW!=O-xBGQcy0* zEXhe#(92BD&&y1%PRT4T$VsfU%FEA7wa!f}O3%!*GEe|PLxX|}>+;N$k_;;_Gc7YG zXY#yyvB^aVvv^Sqn{4K%Fxl5fO&nsjUTR8aNn#ShlF8?j#Wv^o$TCj89wo$NsyVqZ zVfJPXKM77IUERr!;hI2db9VR-PEkXnf(oF`7DyHws7`Jc(Vo0kPHpnLc&^Pe6aOj$ E0JzdrH~;_u delta 72 zcmV-O0Js0>jslj80t diff --git a/dist/main.js b/dist/main.js index 3850ab1d12f55b44d3745ad8180c377fd1b5dac7..f01cd21d4b2489f6689ac26f0ffdf8eb4806bae9 100644 GIT binary patch delta 5204 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 G-v0-eUCs{x delta 4292 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 delta 3163 zcmZuzeQaA-71zl}({5`?*QQC+cC}v;_r3V#B~H3*we#YoNt(Ego{qgZgh-kLi<2h@U%Y|8telEVx5dI(*U(F1Y6NI2?-FO3O0s7L%_raVjn8! zIZitU?~i-WJ@Ppu6Zh{8rVDqh+L+lO*4gx+pG5Yhm6qe4!~MkIEBrP(C6DgRa zL~wWTSBJy*2st#K)G0{_@~rCV>+A8zBkJm!l8Tw3Je@EySz@pic~Xr;<)iAPlFel0 zWA>agQ*wBNAPgxpt;dPXY*M#>DU>V}tc%-Vm#<5vDog36k|uPXrF^uX`Iy@+VK8lW zghf?VC6#bHm~TDq9iBCr@)wWX+pIHHh-lh!cbBFyO*1r&YFaWX$OfMtX&cEf)nJN2 zvgufyh(cbFg?x)3$uShuw20u=nOkTV1-F5-B>KG@oJjjzYr%Ow>Q^OX@k=A>zKji# z3ijF-(loSUq8_g;&YMTW_r`2QyHrrxB~7!Da*nB#P!{P1#C6z0}t-31X%%@rbZ z8h%mRu1zQ?TLHA9qx0xz`v1ze%M~9G5x;@pTLX1N>pv9fcb|_I)=?V{BRFvbY`ddY z)QGkt(F2+gZTFXd_f%kSqsb&W``>tUKf^y4*bfH(M!wokBTUA>#^G#*F`Ww z9f*?rIFy6L=Z?K{lfCCJVEA?3J@&=zK4z?}Zlv6#N*I58On^zgE!ehgkV&gyb+w$1 z-bp?X+_mdiB{_*q)>BDjlC;LZ?Ags92>xh9C4Qo0@{|}unRsrIP*x}q?{QgIse*|S z%ca>#o#ZPw(m^pZ&ti4J>q@Ve3zv)XPmk{$pmNBTs^}R`6I-1;syfezRFZX;AQL62 z8zvh}>FI=0mKu*O5>?Ozx!X=r)Z5gEE2)ynYm%H-<_SBz5=iiY&@LrphnvtuS%XL< zMNg=$vXk1NN<_@VE4I=?!Abf36T`PLthkw^gMAEQtFvpM%QedXHt_*>l7`LWSe$Jh zuRp%9#jzn|7u-!Y+rM6We|h}ny2_qifa^B2JUP{mQTg3etAk*1!f2092gg*Q&m?IQ zXO2Y^i)S&XrGikO8$hdXv; zc>Qb>A3yae2o>i}9R}3?>xfJuW~kK;03l%#wX>J95qvVl8L(HOJ)pFSD6js&qo^3&dZTeJb+uZufb^XMeP{C z2(O!S!zk~WlaY1L-0@A@>^Nh2Aa0?Y?UxeM_Q|hz!(LJg#be1QuD8VE+Y38^Z%OM` z_8@HGkEDNyY9<$Nh0UQgIf+SVa_46oiuci9Y{re5ybjnvFE881{<{1^RW+t2zxH^8 z^%#LI#h3zN6-*wtqK z#MSLUidU{aUQ^7y*|psUzk8}0r)&QbtLj9oBTg#u$DV2|9(lh5P_g+zaGxM&shpx} zXN%I_+9}T?B}V+NsC2g)nR7+kJLN^|w@t7gmaGq(px?2AfH^FSBg4~$(cyt1358DE zJgrmf?39jikYQqI)fanEK15C$u*?o zDe(-IRxF;1z9)8&|KQPgc8JLV$vFI1_pzr?>EC`Xvkwlj4i~Lr}0T=W-|u!PKeVb zz87k1V6pVL1NK+7WU1s9u+(fc_7s&rzC2Ckr1cvC9))G=ObgucsU(efqApi1(jCRS zoV1>AfsP%>?1>hzeWV!6dWG`FJ1wvXdF$?0Xtpl2LL64CKeod1uK9|uhU7P{Tb(bl zHh2zT&}uyZZ^CqGvk32jb)g>~E`21y8`Z)T9!OhvSLeJuj+7SBqIgQfHfi`ZitHf^ z6ljNqlB~c(08^#!bi#IMUZ|KWzl`j+r(G8D?dcq{e%}Sp!m#y_2gQc1Z+qbM zqkkLvD==1i@OJon6--#mcfxBpjUIw5 zPA?q7&54rcg>V%Ftx_MTHwWp)8!%Y9)(4*ftKJU@I8w^_;czV+vA#P5Gq|iDhLbg0 z15_o-!eovZD{`x42EYfc)^h>44FaWC1MrVM*6RfBF7+qj=IvI$0nXByJp8i?Zn9$M GK=}{V;SB)* diff --git a/src/bower.json b/src/bower.json index 963742b..12cfb2d 100644 --- a/src/bower.json +++ b/src/bower.json @@ -2,7 +2,7 @@ "name": "Lychee", "private": true, "dependencies": { - "jQuery": "~2.1.1", + "jQuery": "~2.1.3", "js-md5": "~1.1.0", "mousetrap": "~1.4.6", "basicContext": "~2.0.2" diff --git a/src/package.json b/src/package.json index e6ebb18..6c8aa7f 100644 --- a/src/package.json +++ b/src/package.json @@ -13,7 +13,7 @@ "gulp": "^3.8.10", "gulp-autoprefixer": "2.0.0", "gulp-coffee": "^2.2.0", - "gulp-concat": "^2.4.2", + "gulp-concat": "^2.4.3", "gulp-load-plugins": "^0.8.0", "gulp-minify-css": "^0.3.11", "gulp-rimraf": "^0.1.1", diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index 3fdfa8b..7c33ef3 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -106,8 +106,8 @@ build.imageview = (data, size, visibleControls) -> return '' if not data? html = """ - - + + """ if size is 'big' diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index 35be5d7..c4415c1 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -69,6 +69,38 @@ contextMenu.albumMulti = function(albumIDs, e) { } +contextMenu.albumTitle = function(albumID, e) { + + var items = [ + { type: 'item', title: 'Rename', icon: 'icon-edit', fn: function() { album.setTitle([albumID]) } } + ]; + + lychee.api('getAlbums', function(data) { + + if (data.num!==0) { + + items.push({ type: 'separator' }); + + // Generate list of albums + $.each(data.content, function(index) { + + var that = this; + + if (!that.thumb0) that.thumb0 = 'src/images/no_cover.svg'; + that.title = "
" + that.title + "
"; + + if (that.id!=album.getID()) items.push({ type: 'item', title: that.title, fn: function() { lychee.goto(that.id) } }); + + }); + + } + + basicContext.show(items, e, contextMenu.close); + + }); + +} + contextMenu.photo = function(photoID, e) { // Notice for 'Move': diff --git a/src/scripts/init.js b/src/scripts/init.js index c50b5b0..72a6d7e 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -16,48 +16,53 @@ $(document).ready(function() { $(document) .on('mouseup', multiselect.getSelection); /* Header */ - $('#button_share').on(event_name, function(e) { + lychee.header.find('#title').on(event_name, function(e) { + if (!$(this).hasClass('editable')) return false; + if (visible.photo()) photo.setTitle([photo.getID()]); + else contextMenu.albumTitle([album.getID()], e); + }); + lychee.header.find('#button_share').on(event_name, function(e) { if (photo.json.public==1||photo.json.public==2) contextMenu.sharePhoto(photo.getID(), e); else photo.setPublic(photo.getID(), e); }); - $('#button_share_album').on(event_name, function(e) { + lychee.header.find('#button_share_album').on(event_name, function(e) { if (album.json.public==1) contextMenu.shareAlbum(album.getID(), e); else album.setPublic(album.getID(), e); }); - $('#button_signin') .on(event_name, lychee.loginDialog); - $('#button_settings') .on(event_name, contextMenu.settings); - $('#button_info_album') .on(event_name, view.infobox.show); - $('#button_info') .on(event_name, view.infobox.show); - $('.button_add') .on(event_name, contextMenu.add); - $('#button_more') .on(event_name, function(e) { contextMenu.photoMore(photo.getID(), e) }); - $('#button_move') .on(event_name, function(e) { contextMenu.move([photo.getID()], e) }); - $('#hostedwith') .on(event_name, function() { window.open(lychee.website) }); - $('#button_trash_album') .on(event_name, function() { album.delete([album.getID()]) }); - $('#button_trash') .on(event_name, function() { photo.delete([photo.getID()]) }); - $('#button_archive') .on(event_name, function() { album.getArchive(album.getID()) }); - $('#button_star') .on(event_name, function() { photo.setStar([photo.getID()]) }); - $('#button_back_home') .on(event_name, function() { lychee.goto('') }); - $('#button_back') .on(event_name, function() { lychee.goto(album.getID()) }); + lychee.header.find('#button_signin') .on(event_name, lychee.loginDialog); + lychee.header.find('#button_settings') .on(event_name, contextMenu.settings); + lychee.header.find('#button_info_album') .on(event_name, view.infobox.show); + lychee.header.find('#button_info') .on(event_name, view.infobox.show); + lychee.header.find('.button_add') .on(event_name, contextMenu.add); + lychee.header.find('#button_more') .on(event_name, function(e) { contextMenu.photoMore(photo.getID(), e) }); + lychee.header.find('#button_move') .on(event_name, function(e) { contextMenu.move([photo.getID()], e) }); + lychee.header.find('#hostedwith') .on(event_name, function() { window.open(lychee.website) }); + lychee.header.find('#button_trash_album') .on(event_name, function() { album.delete([album.getID()]) }); + lychee.header.find('#button_trash') .on(event_name, function() { photo.delete([photo.getID()]) }); + lychee.header.find('#button_archive') .on(event_name, function() { album.getArchive(album.getID()) }); + lychee.header.find('#button_star') .on(event_name, function() { photo.setStar([photo.getID()]) }); + lychee.header.find('#button_back_home') .on(event_name, function() { lychee.goto('') }); + lychee.header.find('#button_back') .on(event_name, function() { lychee.goto(album.getID()) }); /* Search */ - $('#search').on('keyup click', function() { search.find($(this).val()) }); - - /* Infobox */ - $('#infobox .header .close').on(event_name, view.infobox.hide); + lychee.header.find('#search').on('keyup click', function() { search.find($(this).val()) }); /* Clear Search */ - $('#clearSearch').on(event_name, function () { - $('#search').focus(); + lychee.header.find('#clearSearch').on(event_name, function () { + lychee.header.find('#search').focus(); search.reset(); }); + /* Infobox */ + lychee.infobox.find('.header .close').on(event_name, view.infobox.hide); + /* Image View */ lychee.imageview - .on(event_name, '.arrow_wrapper.previous', photo.previous) - .on(event_name, '.arrow_wrapper.next', photo.next); + .on(event_name, '.arrow_wrapper--previous', photo.previous) + .on(event_name, '.arrow_wrapper--next', photo.next); /* Infobox */ - $('#infobox') + lychee.infobox .on(event_name, '#edit_title_album', function() { album.setTitle([album.getID()]) }) .on(event_name, '#edit_description_album', function() { album.setDescription(album.getID()) }) .on(event_name, '#edit_title', function() { photo.setTitle([photo.getID()]) }) @@ -72,10 +77,10 @@ $(document).ready(function() { .bind(['u', 'ctrl+u'], function() { $('#upload_files').click() }) .bind(['s', 'ctrl+s', 'f', 'ctrl+f'], function(e) { if (visible.photo()) { - $('#button_star').click(); + lychee.header.find('#button_star').click(); } else if (visible.albums()) { e.preventDefault(); - $('#search').focus(); + lychee.header.find('#search').focus(); } }) .bind(['r', 'ctrl+r'], function(e) { @@ -148,12 +153,6 @@ $(document).ready(function() { /* Login */ .on('keyup', '#password', function() { if ($(this).val().length>0) $(this).removeClass('error') }) - /* Header */ - .on(event_name, '#title.editable', function() { - if (visible.photo()) photo.setTitle([photo.getID()]); - else album.setTitle([album.getID()]); - }) - /* Navigation */ .on('click', '.album', function() { lychee.goto($(this).attr('data-id')) }) .on('click', '.photo', function() { lychee.goto(album.getID() + '/' + $(this).attr('data-id')) }) diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 239e4c8..1cfb7c0 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -5,7 +5,7 @@ lychee = { - title: '', + title: document.title, version: '2.7.0', version_code: '020700', @@ -77,10 +77,10 @@ lychee.api = function(params, callback) { loadingBar.show(); $.ajax({ - type: 'POST', - url: lychee.api_path, - data: 'function=' + params, - dataType: 'text', + type: 'POST', + url: lychee.api_path, + data: 'function=' + params, + dataType: 'text', success: function(data) { setTimeout(function() { loadingBar.hide() }, 100); @@ -168,9 +168,7 @@ lychee.loginDialog = function() { lychee.logout = function() { - lychee.api('logout', function() { - window.location.reload(); - }); + lychee.api('logout', window.location.reload); } @@ -252,15 +250,14 @@ lychee.getUpdate = function() { lychee.setTitle = function(title, editable) { - if (lychee.title==='') lychee.title = document.title; + var $title = lychee.header.find('#title'); - if (title==='Albums') document.title = lychee.title; - else document.title = lychee.title + ' - ' + title; + document.title = lychee.title + ' - ' + title; - if (editable) $('#title').addClass('editable'); - else $('#title').removeClass('editable'); + if (editable) $title.addClass('editable'); + else $title.removeClass('editable'); - $('#title').html(title); + $title.html(title + build.iconic('caret-bottom')); } diff --git a/src/scripts/view.js b/src/scripts/view.js index 044dc76..41afed2 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -488,28 +488,28 @@ view.photo = { lychee.imageview.html(build.imageview(photo.json, photo.getSize(), visible.controls())); - var nextArrow = lychee.imageview.find('a#next'), - previousArrow = lychee.imageview.find('a#previous'), + var $nextArrow = lychee.imageview.find('a#next'), + $previousArrow = lychee.imageview.find('a#previous'), hasNext = album.json&&album.json.content&&album.json.content[photo.getID()]&&album.json.content[photo.getID()].nextPhoto==='', hasPrevious = album.json&&album.json.content&&album.json.content[photo.getID()]&&album.json.content[photo.getID()].previousPhoto===''; - if (hasNext||lychee.viewMode) { nextArrow.hide(); } + if (hasNext||lychee.viewMode) { $nextArrow.hide(); } else { var nextPhotoID = album.json.content[photo.getID()].nextPhoto, nextPhoto = album.json.content[nextPhotoID]; - nextArrow.css('background-image', 'linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url("' + nextPhoto.thumbUrl + '")'); + $nextArrow.css('background-image', 'linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url("' + nextPhoto.thumbUrl + '")'); } - if (hasPrevious||lychee.viewMode) { previousArrow.hide(); } + if (hasPrevious||lychee.viewMode) { $previousArrow.hide(); } else { var previousPhotoID = album.json.content[photo.getID()].previousPhoto, previousPhoto = album.json.content[previousPhotoID]; - previousArrow.css('background-image', 'linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url("' + previousPhoto.thumbUrl + '")'); + $previousArrow.css('background-image', 'linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url("' + previousPhoto.thumbUrl + '")'); }; diff --git a/src/styles/_imageview.scss b/src/styles/_imageview.scss index 8233862..367e6e5 100644 --- a/src/styles/_imageview.scss +++ b/src/styles/_imageview.scss @@ -54,9 +54,9 @@ top: 60px; z-index: 1; - &.previous { left: 0; } + &--previous { left: 0; } - &.next { right: 0; } + &--next { right: 0; } a { position: fixed; From 03e7113bb90c11a43021b76d06c2ae210ccf0a69 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 4 Jan 2015 20:27:07 +0100 Subject: [PATCH 012/190] Style adjustments - black() and white() functions - Added vars --- dist/main.css | Bin 34664 -> 34695 bytes src/styles/_animations.scss | 10 +++++----- src/styles/_content.scss | 28 +++++++++++++-------------- src/styles/_contextmenu.scss | 22 ++++++++++----------- src/styles/_etc.scss | 21 ++++++++++++++++++++ src/styles/_header.scss | 24 +++++++++++------------ src/styles/_imageview.scss | 12 ++++++------ src/styles/_infobox.scss | 22 ++++++++++----------- src/styles/_loading.scss | 6 +++--- src/styles/_mediaquery.scss | 20 +++++++++---------- src/styles/_message.scss | 36 +++++++++++++++++------------------ src/styles/_upload.scss | 22 ++++++++++----------- src/styles/main.scss | 1 + 13 files changed, 123 insertions(+), 101 deletions(-) create mode 100644 src/styles/_etc.scss diff --git a/dist/main.css b/dist/main.css index 5a5961f4e74159bddf2d998f14c9f1b60bc860d0..df0acb5aa50a68d189202f5ad3b945eefff23259 100644 GIT binary patch delta 142 zcmaFS$JE}>v>{$;a-|gS|+G8FWTCi988ObX)Rgv)H^391u7(K`8lqQvIiN!8q}NjZth Q*_-ofco;Xk{$;az=>o<{Tv#CN|yV{G9xv%^OtaXiN_9mE4@`Ys>^@9Q6OjIQc+e lB%4loW=cuM Date: Sun, 4 Jan 2015 20:41:09 +0100 Subject: [PATCH 013/190] event_name to eventName --- src/scripts/init.js | 66 ++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/scripts/init.js b/src/scripts/init.js index 72a6d7e..ddb544a 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -6,7 +6,7 @@ $(document).ready(function() { /* Event Name */ - var event_name = (mobileBrowser()) ? 'touchend' : 'click'; + var eventName = (mobileBrowser()) ? 'touchend' : 'click'; /* Disable ContextMenu */ $(document).bind('contextmenu', function(e) { e.preventDefault() }); @@ -16,59 +16,59 @@ $(document).ready(function() { $(document) .on('mouseup', multiselect.getSelection); /* Header */ - lychee.header.find('#title').on(event_name, function(e) { + lychee.header.find('#title').on(eventName, function(e) { if (!$(this).hasClass('editable')) return false; if (visible.photo()) photo.setTitle([photo.getID()]); else contextMenu.albumTitle([album.getID()], e); }); - lychee.header.find('#button_share').on(event_name, function(e) { + lychee.header.find('#button_share').on(eventName, function(e) { if (photo.json.public==1||photo.json.public==2) contextMenu.sharePhoto(photo.getID(), e); else photo.setPublic(photo.getID(), e); }); - lychee.header.find('#button_share_album').on(event_name, function(e) { + lychee.header.find('#button_share_album').on(eventName, function(e) { if (album.json.public==1) contextMenu.shareAlbum(album.getID(), e); else album.setPublic(album.getID(), e); }); - lychee.header.find('#button_signin') .on(event_name, lychee.loginDialog); - lychee.header.find('#button_settings') .on(event_name, contextMenu.settings); - lychee.header.find('#button_info_album') .on(event_name, view.infobox.show); - lychee.header.find('#button_info') .on(event_name, view.infobox.show); - lychee.header.find('.button_add') .on(event_name, contextMenu.add); - lychee.header.find('#button_more') .on(event_name, function(e) { contextMenu.photoMore(photo.getID(), e) }); - lychee.header.find('#button_move') .on(event_name, function(e) { contextMenu.move([photo.getID()], e) }); - lychee.header.find('#hostedwith') .on(event_name, function() { window.open(lychee.website) }); - lychee.header.find('#button_trash_album') .on(event_name, function() { album.delete([album.getID()]) }); - lychee.header.find('#button_trash') .on(event_name, function() { photo.delete([photo.getID()]) }); - lychee.header.find('#button_archive') .on(event_name, function() { album.getArchive(album.getID()) }); - lychee.header.find('#button_star') .on(event_name, function() { photo.setStar([photo.getID()]) }); - lychee.header.find('#button_back_home') .on(event_name, function() { lychee.goto('') }); - lychee.header.find('#button_back') .on(event_name, function() { lychee.goto(album.getID()) }); + lychee.header.find('#button_signin') .on(eventName, lychee.loginDialog); + lychee.header.find('#button_settings') .on(eventName, contextMenu.settings); + lychee.header.find('#button_info_album') .on(eventName, view.infobox.show); + lychee.header.find('#button_info') .on(eventName, view.infobox.show); + lychee.header.find('.button_add') .on(eventName, contextMenu.add); + lychee.header.find('#button_more') .on(eventName, function(e) { contextMenu.photoMore(photo.getID(), e) }); + lychee.header.find('#button_move') .on(eventName, function(e) { contextMenu.move([photo.getID()], e) }); + lychee.header.find('#hostedwith') .on(eventName, function() { window.open(lychee.website) }); + lychee.header.find('#button_trash_album') .on(eventName, function() { album.delete([album.getID()]) }); + lychee.header.find('#button_trash') .on(eventName, function() { photo.delete([photo.getID()]) }); + lychee.header.find('#button_archive') .on(eventName, function() { album.getArchive(album.getID()) }); + lychee.header.find('#button_star') .on(eventName, function() { photo.setStar([photo.getID()]) }); + lychee.header.find('#button_back_home') .on(eventName, function() { lychee.goto('') }); + lychee.header.find('#button_back') .on(eventName, function() { lychee.goto(album.getID()) }); /* Search */ lychee.header.find('#search').on('keyup click', function() { search.find($(this).val()) }); /* Clear Search */ - lychee.header.find('#clearSearch').on(event_name, function () { + lychee.header.find('#clearSearch').on(eventName, function () { lychee.header.find('#search').focus(); search.reset(); }); /* Infobox */ - lychee.infobox.find('.header .close').on(event_name, view.infobox.hide); + lychee.infobox.find('.header .close').on(eventName, view.infobox.hide); /* Image View */ lychee.imageview - .on(event_name, '.arrow_wrapper--previous', photo.previous) - .on(event_name, '.arrow_wrapper--next', photo.next); + .on(eventName, '.arrow_wrapper--previous', photo.previous) + .on(eventName, '.arrow_wrapper--next', photo.next); /* Infobox */ lychee.infobox - .on(event_name, '#edit_title_album', function() { album.setTitle([album.getID()]) }) - .on(event_name, '#edit_description_album', function() { album.setDescription(album.getID()) }) - .on(event_name, '#edit_title', function() { photo.setTitle([photo.getID()]) }) - .on(event_name, '#edit_description', function() { photo.setDescription(photo.getID()) }) - .on(event_name, '#edit_tags', function() { photo.editTags([photo.getID()]) }) - .on(event_name, '#tags .tag span', function() { photo.deleteTag(photo.getID(), $(this).data('index')) }); + .on(eventName, '#edit_title_album', function() { album.setTitle([album.getID()]) }) + .on(eventName, '#edit_description_album', function() { album.setDescription(album.getID()) }) + .on(eventName, '#edit_title', function() { photo.setTitle([photo.getID()]) }) + .on(eventName, '#edit_description', function() { photo.setDescription(photo.getID()) }) + .on(eventName, '#edit_tags', function() { photo.editTags([photo.getID()]) }) + .on(eventName, '#tags .tag span', function() { photo.deleteTag(photo.getID(), $(this).data('index')) }); /* Keyboard */ Mousetrap @@ -158,20 +158,20 @@ $(document).ready(function() { .on('click', '.photo', function() { lychee.goto(album.getID() + '/' + $(this).attr('data-id')) }) /* Modal */ - .on(event_name, '.message .close', modal.close) - .on(event_name, '.message .button:first', function() { if (modal.fns!==null) modal.fns[0](); if (!visible.signin()) modal.close() }) - .on(event_name, '.message .button:last', function() { if (modal.fns!==null) modal.fns[1](); if (!visible.signin()) modal.close() }) + .on(eventName, '.message .close', modal.close) + .on(eventName, '.message .button:first', function() { if (modal.fns!==null) modal.fns[0](); if (!visible.signin()) modal.close() }) + .on(eventName, '.message .button:last', function() { if (modal.fns!==null) modal.fns[1](); if (!visible.signin()) modal.close() }) /* Context Menu */ .on('contextmenu', '.photo', function(e) { contextMenu.photo(photo.getID(), e) }) .on('contextmenu', '.album', function(e) { contextMenu.album(album.getID(), e) }) /* Infobox */ - .on(event_name, '#infobox_overlay', view.infobox.hide) + .on(eventName, '#infobox_overlay', view.infobox.hide) /* Upload */ .on('change', '#upload_files', function() { modal.close(); upload.start.local(this.files) }) - .on(event_name, '.upload_message a.close', upload.close) + .on(eventName, '.upload_message a.close', upload.close) .on('dragover', function(e) { e.preventDefault(); }, false) .on('drop', function(e) { From 4f7c1511f02799f9f610130789c640926d75283e Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 4 Jan 2015 20:46:52 +0100 Subject: [PATCH 014/190] Version push --- dist/main.js | Bin 171049 -> 171049 bytes src/package.json | 4 ++-- src/scripts/lychee.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/main.js b/dist/main.js index f01cd21d4b2489f6689ac26f0ffdf8eb4806bae9..5c175f1f37bc90de9839cf6dcf58d95903fcd19d 100644 GIT binary patch delta 43 zcmZ3vgKOmuu7)j)({D%`>lx@7DCv}?78Pga=fx-Ir=(gb85kQFY~OH$vGOngYQzw1 delta 43 zcmZ3vgKOmuu7)j)({D%`>6z;pDCv}?78Pga=fx-Ir=(gb85kLuZ{Ki(vGOngYnTvt diff --git a/src/package.json b/src/package.json index 6c8aa7f..58603e8 100644 --- a/src/package.json +++ b/src/package.json @@ -1,8 +1,8 @@ { "name": "Lychee", - "version": "2.7.0", + "version": "3.0.0", "description": "Self-hosted photo-management done right.", - "authors": "Tobias Reich ", + "authors": "Tobias Reich ", "license": "MIT", "private": true, "repository": { diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 1cfb7c0..ee63adb 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -6,8 +6,8 @@ lychee = { title: document.title, - version: '2.7.0', - version_code: '020700', + version: '3.0.0', + version_code: '030000', api_path: 'php/api.php', update_path: 'http://lychee.electerious.com/version/index.php', From 1f3b164d596d8b683570b15fe31510fdcbaf2387 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 4 Jan 2015 20:55:13 +0100 Subject: [PATCH 015/190] Separator to Divider --- dist/main.css | Bin 34695 -> 35033 bytes dist/main.js | Bin 171049 -> 171043 bytes dist/view.js | Bin 96911 -> 96905 bytes src/scripts/build.coffee | 10 +++++----- src/styles/_content.scss | 6 ++++-- src/styles/_infobox.scss | 4 ++-- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/dist/main.css b/dist/main.css index df0acb5aa50a68d189202f5ad3b945eefff23259..80826358ba70b5b730019960d4aeeffcfbdf2c22 100644 GIT binary patch delta 788 zcmZqgXSz9&X~TLEN#*4Hypq(s5(T})oTSoR9XNmTHjzYiI1eJLkeQo~P@z|lkzbMz z5}Q1+N_exqs5WCHng+eZy4r%k>iwvQ98dh!EtSuP~W2jbFVMw-?61&PU-C6!i&wa6-Oqv(^Kd`)5( zlE?(fDN1nF&_K}xc_b&X63GS=sRSfVQ=}}BcxR=gG!aIi_!x^x|D+UD5vsu2`y)9=NJc{eLt9c}N_r|n%VrN5c19#U{<1Piylh!r4eTZ; z=w$+vS7tK8q{-`KyOFe7%FROJU6ykaK^T;hS(cdsOd%PDlO5%RCmYLWA}O6Cf6N%6 xG%r6Mo{T{@R;K|IwQg}{RjQSRK|uu~em6HOR64OiOrFe=+zMrGo|ybi82~;!8FK&t delta 421 zcmcaPk*U3(X~TLEcD=-$q|#iS$tOe-MImg3%-nPxy@HJVl6(+za-gj6FxgDn(h%xY zm_&7cL1J=dNu`xREkp+95|{#=$-AW$gwc#s$S~BIB-0>-E}W<{d5MhwH z#FX?@SODn(d6OU3h)#Yl#XdP(_5mA2)#Q3PQAVA~m2$e1*UO1bJ}1{bIWR?Ja+!SF xWL5>I$pH%OlOHG?o4j68aq~^ZN~g&NjG~iMQz|%$QwtJ{5=-(oKTi3k3;;9$nxp^# diff --git a/dist/main.js b/dist/main.js index 5c175f1f37bc90de9839cf6dcf58d95903fcd19d..4e4eec14ff8ce02de266da08205dfe5cbff1b282 100644 GIT binary patch delta 55 xcmZ3vgKO~)u7(!IElk1F*-|pgGE-8gM^9%ehO)O`o6aT77J)J2KF0}p9bfziHa4ty2b^!Cy B7xwP6e6j#7@|)PlsK#FG5!`$`#$;k@nUWsFmq;arfU()2Htj8g&a8yIE) diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index 7c33ef3..f86432a 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -321,10 +321,10 @@ build.infoboxPhoto = (data, forView) -> when '' - # Separator + # Divider html += """ -

#{ info[1] }

+

#{ info[1] }

""" @@ -335,7 +335,7 @@ build.infoboxPhoto = (data, forView) -> html += """
-

#{ info[0] }

+

#{ info[0] }

#{ info[1] }
""" @@ -398,10 +398,10 @@ build.infoboxAlbum = (data, forView) -> if info[0] is '' - # Separator + # Divider html += """ -

#{ info[1] }

+

#{ info[1] }

""" diff --git a/src/styles/_content.scss b/src/styles/_content.scss index 5d6d99a..501e865 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -3,6 +3,7 @@ */ #content { + position: absolute; padding: 50px 0 33px; width: 100%; @@ -16,7 +17,6 @@ height: 1px; border-top: 1px solid white(.02); } -} /* Albums and Photos ------------------------------------------------*/ .album, @@ -182,4 +182,6 @@ font-size: 18px; font-weight: bold; } - } \ No newline at end of file + } + +} \ No newline at end of file diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index a523e59..f1bf493 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -85,8 +85,8 @@ } - /* Seperator ------------------------------------------------*/ - .separator { + /* Divider ------------------------------------------------*/ + .divider { float: left; padding: 12px 0 8px; width: 100%; From 522d31d33d7a5379c07982a41cebc79a21ac716b Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 4 Jan 2015 22:27:34 +0100 Subject: [PATCH 016/190] Added new JS module: header --- dist/main.css | Bin 35033 -> 35270 bytes dist/main.js | Bin 171043 -> 170918 bytes dist/view.js | Bin 96905 -> 96904 bytes src/scripts/album.js | 2 +- src/scripts/albums.js | 4 +- src/scripts/build.coffee | 2 +- src/scripts/header.js | 108 ++++++++++++++++++++++++++++++++++++++ src/scripts/init.js | 52 +++++++++--------- src/scripts/loadingBar.js | 6 +-- src/scripts/lychee.js | 7 ++- src/scripts/view.js | 105 ++---------------------------------- src/styles/_infobox.scss | 22 ++++---- 12 files changed, 161 insertions(+), 147 deletions(-) create mode 100644 src/scripts/header.js diff --git a/dist/main.css b/dist/main.css index 80826358ba70b5b730019960d4aeeffcfbdf2c22..ef8f49aa81608a7278ac0c01339fdf5c231691b3 100644 GIT binary patch delta 133 zcmcaPk?GiErVT=glLIRG1anf;O00|vDy+*hQ%W+d3=Jk*CCjj+reu~(J{zkrS>A6c zpK@kiT7FV~g@PVf_@bZWW{<>Etme6iMd_J&x+VDqR%QhiwQyz1C5h?9K*hNQC6y38 O)ksPWHV3A6C;|ZQI5A)V delta 90 zcmX>$nd#<4rVT=gD%QD)Md_J&x;d$7C051-71rgMDJ2>E+(p=mzt7UQk{}nT#%DkX_c9mlbM&g*)F3)5diTmA!Gmm diff --git a/dist/main.js b/dist/main.js index 4e4eec14ff8ce02de266da08205dfe5cbff1b282..3ca47e1fd192b50ce0d81f0ad8612987887b310d 100644 GIT binary patch delta 1294 zcmZXTTSyd97{~d}=B8%0meOi=akAXSVc81FtSyNQNoKUHwA6KVcg%rx#`cntD+Q6% zV+?gn3Nq7(5{!k8UA(P?4<;3aMLqZ==!;o&F$(I~DxS5c@BIG%Z~ot$IcM5?VmnD} z_rqimw65guAhzF4(dh(}Q|nGm3O--ovKGYPu`Gu{C-7phCvQBOHnxb@sA?(901C&8 zS}1%fdW1mK+KQbZ1fz~_)Wr#wx+P^tCxo?P$t^j3s)u?O^?yzC zmV{`u;e=5WOIOiEdujPHI^|h;1JEfu>^udBeI}lk!*#16T4>^HRHxsor8Or7FDPTt z)F^4VPMd?%XIqcZtScj_6go#P#nCwaeSp4g@cxJ2$#de@QXMUSet2@13yQ6*f*0}G zY$yf+zs!b45OMx4sHf%0F1Q0CDbE2T-8u2^hV+6JwNjN!@>sl*PavJmkd?wJc=9$V zONCz@`CkgNw$#Xq%OowPd27`M8}^+`FUI$MJS_AVMZoHlY9WKUbjj z_?83hz@cX_6}vbe_dbUXmVLc&gXL}&8S&0OIL(Sr`+#S8whyc-4ej{z*) zZ+cx#c+)FLB(L8Ahe*^1xEk3`+CM^T3_HDW0z}=q#gjI1o2&gkpQ==PV!Z delta 1464 zcmZvbYe-Z<6vz4BTV|rQhUOc!q*c0YR!C;KMif}FH_K8(GuPd#yRdt2?ylLxw1}dJ zKGarYeY1x>C@8iV%eUo=G>9NditIxa1Qiih5Y?0xU7JsH&hMQ0pEGA>nrO(m=8)@G zV<7vl#f-vo?tH8$%BeR0_4vp@YeGX5EP+iKWd>1}EP>`#FM?TOgM5-v(>f!VQ;^rd zocDP*1X%oy`8LRb$r}^JP}$_R`fLuxTU#sp(+i{LGNA3UjIn&hrPzF$hs8|V|IF_# z>}Jx2&C!0jXgX6YEh?GBs?Cq1cU-3BfXe~bAAKNX2=`SIDae2T1Q7jKa) zWJf0QA(O#O?1qKpF2Odo++KpSu+Wk$M6;9A>ZM3o8@Ao4)R-KK)vkC3LtbRK`-gZVt3+KV(EFYd)09zW8HwLCu3i(DRG*atI@4|XA%9Pi^dJJ^R6yiJBK zL=dST3wc3DKY!EBeq{3UNBjAmnFp|nmw$8s$sA6b2XIZ~1c)|-91f?=Lr4pX`}dVO zoOUHuk7Ee%JdDTCvx`rkVFIGBo+CprjJ@8hl+;;c7L6Lgi3zEs z)FVXE2QRUIDzD4pw~)o8zY0mS%d34pP2K8sR;o@_N*Wiw_YUe*VUI+@A0m>j`GU11t5MGHwvU^@Xi=J27{{Nb0(gMk~vN&~W{a zCUsSUJo)#fkijY;aol`cCFG8qi#$R>)W3J>*4SOnvbxHv-DE^V0&VdKS3={KS(9uo etJj-tblNm^-Zn+GIbBBcviVjst*;l1@jn6T@*I5t diff --git a/dist/view.js b/dist/view.js index 57ad5e06d441301aa395720020c18381c1c6c9c5..f362756d1a108755751f337a70176251af0b1323 100644 GIT binary patch delta 44 zcmeDD%G&XjwP6dRTbz`Vc2a3(PKsV;a(-TBvW8MYYF=_?j*_Of()PqSMhzJNb#4z4 delta 45 zcmeD9%G&vrwP6dRTb#5_qC#>`VsWvpdS-Hdo^C;EUUFuRx}A-FqTTj{I7ST_0Em build.editIcon = (id) -> - "
" + "
#{ build.iconic('pencil') }
" build.multiselect = (top, left) -> diff --git a/src/scripts/header.js b/src/scripts/header.js new file mode 100644 index 0000000..21ae81e --- /dev/null +++ b/src/scripts/header.js @@ -0,0 +1,108 @@ +/** + * @description This module takes care of the header. + * @copyright 2014 by Tobias Reich + */ + +header = { + + _dom: $('header') + +} + +header.dom = function(selector) { + + if (selector===undefined||selector===null||selector==='') return header._dom; + return header._dom.find(selector); + +} + +header.show = function() { + + var newMargin = -1*($('#imageview #image').height()/2)+20; + + clearTimeout($(window).data('timeout')); + + lychee.imageview.removeClass('full'); + header.dom().removeClass('hidden'); + lychee.loadingBar.css('opacity', 1); + + // Adjust position or size of photo + if ($('#imageview #image.small').length>0) $('#imageview #image').css('margin-top', newMargin); + else $('#imageview #image').removeClass('full'); + +} + +header.hide = function(e, delay) { + + var newMargin = -1*($('#imageview #image').height()/2); + + if (delay===undefined) delay = 500; + + if (visible.photo()&&!visible.infobox()&&!visible.contextMenu()&&!visible.message()) { + + clearTimeout($(window).data('timeout')); + + $(window).data('timeout', setTimeout(function() { + + lychee.imageview.addClass('full'); + header.dom().addClass('hidden'); + lychee.loadingBar.css('opacity', 0); + + // Adjust position or size of photo + if ($('#imageview #image.small').length>0) $('#imageview #image').css('margin-top', newMargin); + else $('#imageview #image').addClass('full'); + + }, delay)); + + } + +} + +header.setMode = function(mode) { + + var albumID = album.getID(); + + switch (mode) { + + case 'albums': + + header.dom().removeClass('view'); + $('#tools_album, #tools_photo').hide(); + $('#tools_albums').show(); + + break; + + case 'album': + + header.dom().removeClass('view'); + $('#tools_albums, #tools_photo').hide(); + $('#tools_album').show(); + + // Hide download button when album empty + album.json.content === false ? $('#button_archive').hide() : $('#button_archive').show(); + + // Hide download button when not logged in and album not downloadable + if (lychee.publicMode&&album.json.downloadable==='0') $('#button_archive').hide(); + + if (albumID==='s'||albumID==='f'||albumID==='r') { + $('#button_info_album, #button_trash_album, #button_share_album').hide(); + } else if (albumID==='0') { + $('#button_info_album, #button_share_album').hide(); + $('#button_trash_album').show(); + } else { + $('#button_info_album, #button_trash_album, #button_share_album').show(); + } + + break; + + case 'photo': + + header.dom().addClass('view'); + $('#tools_albums, #tools_album').hide(); + $('#tools_photo').show(); + + break; + + } + +} \ No newline at end of file diff --git a/src/scripts/init.js b/src/scripts/init.js index ddb544a..145773b 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -16,40 +16,40 @@ $(document).ready(function() { $(document) .on('mouseup', multiselect.getSelection); /* Header */ - lychee.header.find('#title').on(eventName, function(e) { + header.dom('#title').on(eventName, function(e) { if (!$(this).hasClass('editable')) return false; if (visible.photo()) photo.setTitle([photo.getID()]); else contextMenu.albumTitle([album.getID()], e); }); - lychee.header.find('#button_share').on(eventName, function(e) { + header.dom('#button_share').on(eventName, function(e) { if (photo.json.public==1||photo.json.public==2) contextMenu.sharePhoto(photo.getID(), e); else photo.setPublic(photo.getID(), e); }); - lychee.header.find('#button_share_album').on(eventName, function(e) { + header.dom('#button_share_album').on(eventName, function(e) { if (album.json.public==1) contextMenu.shareAlbum(album.getID(), e); else album.setPublic(album.getID(), e); }); - lychee.header.find('#button_signin') .on(eventName, lychee.loginDialog); - lychee.header.find('#button_settings') .on(eventName, contextMenu.settings); - lychee.header.find('#button_info_album') .on(eventName, view.infobox.show); - lychee.header.find('#button_info') .on(eventName, view.infobox.show); - lychee.header.find('.button_add') .on(eventName, contextMenu.add); - lychee.header.find('#button_more') .on(eventName, function(e) { contextMenu.photoMore(photo.getID(), e) }); - lychee.header.find('#button_move') .on(eventName, function(e) { contextMenu.move([photo.getID()], e) }); - lychee.header.find('#hostedwith') .on(eventName, function() { window.open(lychee.website) }); - lychee.header.find('#button_trash_album') .on(eventName, function() { album.delete([album.getID()]) }); - lychee.header.find('#button_trash') .on(eventName, function() { photo.delete([photo.getID()]) }); - lychee.header.find('#button_archive') .on(eventName, function() { album.getArchive(album.getID()) }); - lychee.header.find('#button_star') .on(eventName, function() { photo.setStar([photo.getID()]) }); - lychee.header.find('#button_back_home') .on(eventName, function() { lychee.goto('') }); - lychee.header.find('#button_back') .on(eventName, function() { lychee.goto(album.getID()) }); + header.dom('#button_signin') .on(eventName, lychee.loginDialog); + header.dom('#button_settings') .on(eventName, contextMenu.settings); + header.dom('#button_info_album') .on(eventName, view.infobox.show); + header.dom('#button_info') .on(eventName, view.infobox.show); + header.dom('.button_add') .on(eventName, contextMenu.add); + header.dom('#button_more') .on(eventName, function(e) { contextMenu.photoMore(photo.getID(), e) }); + header.dom('#button_move') .on(eventName, function(e) { contextMenu.move([photo.getID()], e) }); + header.dom('#hostedwith') .on(eventName, function() { window.open(lychee.website) }); + header.dom('#button_trash_album') .on(eventName, function() { album.delete([album.getID()]) }); + header.dom('#button_trash') .on(eventName, function() { photo.delete([photo.getID()]) }); + header.dom('#button_archive') .on(eventName, function() { album.getArchive(album.getID()) }); + header.dom('#button_star') .on(eventName, function() { photo.setStar([photo.getID()]) }); + header.dom('#button_back_home') .on(eventName, function() { lychee.goto('') }); + header.dom('#button_back') .on(eventName, function() { lychee.goto(album.getID()) }); /* Search */ - lychee.header.find('#search').on('keyup click', function() { search.find($(this).val()) }); + header.dom('#search').on('keyup click', function() { search.find($(this).val()) }); /* Clear Search */ - lychee.header.find('#clearSearch').on(eventName, function () { - lychee.header.find('#search').focus(); + header.dom('#clearSearch').on(eventName, function () { + header.dom('#search').focus(); search.reset(); }); @@ -63,10 +63,10 @@ $(document).ready(function() { /* Infobox */ lychee.infobox - .on(eventName, '#edit_title_album', function() { album.setTitle([album.getID()]) }) + .on(eventName, '#edit_title_album', function() { album.setTitle([album.getID()]) }) .on(eventName, '#edit_description_album', function() { album.setDescription(album.getID()) }) .on(eventName, '#edit_title', function() { photo.setTitle([photo.getID()]) }) - .on(eventName, '#edit_description', function() { photo.setDescription(photo.getID()) }) + .on(eventName, '#edit_description', function() { photo.setDescription(photo.getID()) }) .on(eventName, '#edit_tags', function() { photo.editTags([photo.getID()]) }) .on(eventName, '#tags .tag span', function() { photo.deleteTag(photo.getID(), $(this).data('index')) }); @@ -77,10 +77,10 @@ $(document).ready(function() { .bind(['u', 'ctrl+u'], function() { $('#upload_files').click() }) .bind(['s', 'ctrl+s', 'f', 'ctrl+f'], function(e) { if (visible.photo()) { - lychee.header.find('#button_star').click(); + header.dom('#button_star').click(); } else if (visible.albums()) { e.preventDefault(); - lychee.header.find('#search').focus(); + header.dom('#search').focus(); } }) .bind(['r', 'ctrl+r'], function(e) { @@ -135,8 +135,8 @@ $(document).ready(function() { /* Fullscreen on mobile */ .on('touchend', '#image', function(e) { if (swipe.obj===null||(swipe.offset>=-5&&swipe.offset<=5)) { - if (visible.controls()) view.header.hide(e, 0); - else view.header.show(); + if (visible.controls()) header.hide(e, 0); + else header.show(); } }) diff --git a/src/scripts/loadingBar.js b/src/scripts/loadingBar.js index 3eff788..0fcfac2 100755 --- a/src/scripts/loadingBar.js +++ b/src/scripts/loadingBar.js @@ -21,7 +21,7 @@ loadingBar.show = function(status, errorText) { if (!errorText) errorText = 'Whoops, it looks like something went wrong. Please reload the site and try again!'; // Move header down - if (visible.controls()) lychee.header.addClass('error'); + if (visible.controls()) header.dom().addClass('error'); // Modify loading lychee.loadingBar @@ -49,7 +49,7 @@ loadingBar.show = function(status, errorText) { lychee.loadingBar.data('timeout', setTimeout(function() { // Move header down - if (visible.controls()) lychee.header.addClass('loading'); + if (visible.controls()) header.dom().addClass('loading'); // Modify loading lychee.loadingBar @@ -73,7 +73,7 @@ loadingBar.hide = function(force) { loadingBar.status = null; // Move header up - if (visible.controls()) lychee.header.removeClass('error loading'); + if (visible.controls()) header.dom().removeClass('error loading'); // Modify loading lychee.loadingBar diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index ee63adb..bbbbb0e 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -27,7 +27,6 @@ lychee = { dropboxKey: '', loadingBar: $('#loading'), - header: $('header'), content: $('#content'), imageview: $('#imageview'), infobox: $('#infobox') @@ -52,7 +51,7 @@ lychee.init = function() { // No configuration if (data==='Warning: No configuration!') { - lychee.header.hide(); + header.dom().hide(); lychee.content.hide(); $('body').append(build.no_content('cog')); settings.createConfig(); @@ -250,7 +249,7 @@ lychee.getUpdate = function() { lychee.setTitle = function(title, editable) { - var $title = lychee.header.find('#title'); + var $title = header.dom('#title'); document.title = lychee.title + ' - ' + title; @@ -286,7 +285,7 @@ lychee.setMode = function(mode) { if (mode==='public') { - $('header #button_signin, header #hostedwith').show(); + header.dom('#button_signin, #hostedwith').show(); lychee.publicMode = true; } else if (mode==='view') { diff --git a/src/scripts/view.js b/src/scripts/view.js index 41afed2..c3dce58 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -5,101 +5,6 @@ view = {} -view.header = { - - show: function() { - - var newMargin = -1*($('#imageview #image').height()/2)+20; - - clearTimeout($(window).data('timeout')); - - lychee.imageview.removeClass('full'); - lychee.header.removeClass('hidden'); - lychee.loadingBar.css('opacity', 1); - - // Adjust position or size of photo - if ($('#imageview #image.small').length>0) $('#imageview #image').css('margin-top', newMargin); - else $('#imageview #image').removeClass('full'); - - }, - - hide: function(e, delay) { - - var newMargin = -1*($('#imageview #image').height()/2); - - if (delay===undefined) delay = 500; - - if (visible.photo()&&!visible.infobox()&&!visible.contextMenu()&&!visible.message()) { - - clearTimeout($(window).data('timeout')); - - $(window).data('timeout', setTimeout(function() { - - lychee.imageview.addClass('full'); - lychee.header.addClass('hidden'); - lychee.loadingBar.css('opacity', 0); - - // Adjust position or size of photo - if ($('#imageview #image.small').length>0) $('#imageview #image').css('margin-top', newMargin); - else $('#imageview #image').addClass('full'); - - }, delay)); - - } - - }, - - mode: function(mode) { - - var albumID = album.getID(); - - switch (mode) { - - case 'albums': - - lychee.header.removeClass('view'); - $('#tools_album, #tools_photo').hide(); - $('#tools_albums').show(); - - break; - - case 'album': - - lychee.header.removeClass('view'); - $('#tools_albums, #tools_photo').hide(); - $('#tools_album').show(); - - // Hide download button when album empty - album.json.content === false ? $('#button_archive').hide() : $('#button_archive').show(); - - // Hide download button when not logged in and album not downloadable - if (lychee.publicMode&&album.json.downloadable==='0') $('#button_archive').hide(); - - if (albumID==='s'||albumID==='f'||albumID==='r') { - $('#button_info_album, #button_trash_album, #button_share_album').hide(); - } else if (albumID==='0') { - $('#button_info_album, #button_share_album').hide(); - $('#button_trash_album').show(); - } else { - $('#button_info_album, #button_trash_album, #button_share_album').show(); - } - - break; - - case 'photo': - - lychee.header.addClass('view'); - $('#tools_albums, #tools_album').hide(); - $('#tools_photo').show(); - - break; - - } - - } - -} - view.infobox = { show: function() { @@ -393,15 +298,15 @@ view.photo = { // Change header lychee.content.addClass('view'); - view.header.mode('photo'); + header.setMode('photo'); // Make body not scrollable $('body').css('overflow', 'hidden'); // Fullscreen $(document) - .bind('mouseenter', view.header.show) - .bind('mouseleave', view.header.hide); + .bind('mouseenter', header.show) + .bind('mouseleave', header.hide); lychee.animate(lychee.imageview, 'fadeIn'); @@ -409,11 +314,11 @@ view.photo = { hide: function() { - view.header.show(); + header.show(); if (visible.infobox) view.infobox.hide(); lychee.content.removeClass('view'); - view.header.mode('album'); + header.setMode('album'); // Make body scrollable $('body').css('overflow', 'auto'); diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index f1bf493..b3d8f0f 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -36,11 +36,18 @@ } .edit { - display: inline; + display: inline-block; margin-left: 3px; - width: 20px; - height: 5px; + width: 10px; cursor: pointer; + + .iconic { + fill: white(.5); + filter: drop-shadow(0 -1px 0 black(.2)); + transition: fill .2s ease-out; + } + + &:hover .iconic { fill: white(1); } } .bumper { @@ -82,7 +89,6 @@ } &:hover .iconic { fill: #fff; } - } /* Divider ------------------------------------------------*/ @@ -135,13 +141,9 @@ margin-bottom: 8px; } - #tags .edit { - display: inline-block; - } + #tags .edit { margin-top: 6px; } - #tags .empty .edit { - display: inline; - } + #tags .empty .edit { margin-top: 0; } #tags .tag { float: left; From b240e2dbaaf92aa64d4742fe45e48283bcec5565 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 6 Jan 2015 22:54:32 +0100 Subject: [PATCH 017/190] Changed overlay back to gradient --- dist/main.css | Bin 35270 -> 35604 bytes src/styles/_content.scss | 10 +++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/dist/main.css b/dist/main.css index ef8f49aa81608a7278ac0c01339fdf5c231691b3..2c174bd5a592874d359279157429938a6446e860 100644 GIT binary patch delta 209 zcmX>$nQ6*2rVYx{llxTEWQx+05;Y8Tz)({MiKl0#Ir)H>I$i~v6{HOrRZ3DTN_2}e z5>xWatqc?l3n~16Qw#&T5>YCtmb4}X{E_CWOyf=OKXTI TWEfT>YtGBhOWmw2yEq2`$ Date: Thu, 8 Jan 2015 20:11:04 +0100 Subject: [PATCH 018/190] Do not disable right-click #213 --- src/scripts/init.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/scripts/init.js b/src/scripts/init.js index 145773b..64d09d8 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -8,12 +8,9 @@ $(document).ready(function() { /* Event Name */ var eventName = (mobileBrowser()) ? 'touchend' : 'click'; - /* Disable ContextMenu */ - $(document).bind('contextmenu', function(e) { e.preventDefault() }); - /* Multiselect */ - $('#content') .on('mousedown', multiselect.show); - $(document) .on('mouseup', multiselect.getSelection); + $('#content') .on('mousedown', function(e) { if (e.which===1) multiselect.show(e) }); + $(document) .on('mouseup', function(e) { if (e.which===1) multiselect.getSelection(e) }); /* Header */ header.dom('#title').on(eventName, function(e) { From 287917ebc9f0296df378f3d2b9dd3e6d0eddd9d0 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 9 Jan 2015 14:34:38 +0100 Subject: [PATCH 019/190] New dialog system (WIP) + Added vars for shadows + Removed ctrl-modifer (#288) --- dist/main.css | Bin 35604 -> 45308 bytes dist/main.js | Bin 170918 -> 175352 bytes src/bower.json | 3 +- src/gulpfile.js | 2 + src/scripts/album.js | 216 +++++++++++++++++++++-------------- src/scripts/init.js | 16 +-- src/scripts/lychee.js | 14 +-- src/scripts/upload.js | 172 +++++++++++++++------------- src/styles/_content.scss | 6 +- src/styles/_contextmenu.scss | 6 +- src/styles/_etc.scss | 6 +- src/styles/_header.scss | 8 +- src/styles/_infobox.scss | 8 +- src/styles/_message.scss | 76 +++++++++++- 14 files changed, 335 insertions(+), 198 deletions(-) diff --git a/dist/main.css b/dist/main.css index 2c174bd5a592874d359279157429938a6446e860..e2ed91e99072e00a36a856fe41054e9c9f3e82b0 100644 GIT binary patch delta 6791 zcmb_g+i%;}8Hc^PiM!abE%}l(cIa5jtW8uXO15RHyQJMR1j{-X-H>`1;!@H+mQH_>bdL$;HRxQgY$5 z@!AYeXV=+7KXPxWI>H~0Ek0M1+yh)5pFK~06pqRg{_~iCrSZ#4M@Qet!T&&kXL6UJAHS;~I21Lo1_;=_#~AX&`kW;^!H%ZAtwdCay^c6@zXHTn z(?*`~)iyi5F~D(AG$6ol+ihkv)i!t4z;tXS_T|H#_kqCyq=pvRu2r}HWqmgx#5 z!-Kkk-?^8;?@o<1@oPvT<2Mp6MR>- z+cX?R;$_-Io5!LE`7Ys)e=>%bHm~-qFUn8%W)zKWCOv-i`ZWIU z)`bnJ2EJrn7DP2v4T*cEZ#GPe#A4Ibb!69x7Jar(uSl}&4=kOcs0Jx&8`*_U;JAuR za?}f55@H;hu2MZxLSh9vbRd)`!FMcE7s3#9RS)n0J3)z@dW0~H53G6H4Ru*6lE2bQ zVPF-oeLvSJR|dGC7^de3qGO1`p^KP*qQVQpgki~gj~sU+vK6Ys?Ip$Q@CBU(qGG9i zxiuWih&%~xkv;n%c=1#AxP#B=9CXpT`fa?YP#GE%t3|J;O(GLzSG+^5UIRwj0B9KHK zs}Pf(OyN%05TWk)w4$3KYV9r#WB_1H>ns~b8kVE&)T1UWl4JuF34dk~sq5V9-JZ-R zVzrQvU6$~~{h2RFRGJ`K)3o$Ncc9^a0{z7m{Y4myIk$t>B_BcgQ3J=r!uf3IUMRI4 zXkd}<&^rW)Sv~4DgPK%n!szTVk4mVzrVh}}Ar9_>Wb`uCk3t^aysL?nELjeKrMBz% z)cGE=V0PIWje7rEP799miey77G;tZkQ5|+d;2SI0d~F|HED$) zYXU=E$gY%I4CB{8S{9@O4CYx#KS z?t;+MiB25Ff3@d2p)LDX<`Z|4jf;&6XYW`Y7BQR#e6wO4K6jUjG~q%uoLc~D*lF`d zA+tfx4R_3ohG9g|Lm?<7F{?xy-S%Bijl5nd(}e`M zG1pnDO0_C7Qo?sIBBDqptUZ*HuY(X6h35=P0KaxF^UZQ)bq&?dAPgNn@k4)hO@z#f zfM58NWlc8+S)(BJhrz+B1om4xekdJ zCQ^my5yy(MM1%{`s#t*?f@xA~NODH#JEp_a!pZ8)LacW33ZCH1}1SQD`R;@67QQxh{%eLEY#p*;56hNf5vHKqgdC z<@kHUA6^+*m$gduc;aed7(dQkz~5c`2>y*7-?+9vjDP=NYG@rxznD4xQ|{KwWdAs` zeQ$Is#+B>=693)Kz|=N&F*%X6@u%AI`D(RVT!IG-Jb8WjT=aoo`)L+`yi~($xjV&B z0eH4b!ZFs?ssw0~t|){}{n3Lz>% delta 69 zcmV-L0J{JD;R2MF0C*??M%`3qoxIlTxBJ bv%N$rLbK(DYzebjmYfKa&zlLe{+|93pOPGm diff --git a/dist/main.js b/dist/main.js index 3ca47e1fd192b50ce0d81f0ad8612987887b310d..124f86cc880c69bfd1aa4fcc40b04492af70c1a0 100644 GIT binary patch delta 19483 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 F{u`DTn3Mnj delta 14966 zcmaKTd3+ny+3xR*?JUk_Cw4YFi6uMEC>kr06K9b!R-D+`oy`eJP#k9@kL8JFjTnt% zhuBbh3m-J0g$(6{B_Wi3D`{OY?S=lD(hGbaWhu8Uv=j)?vV1IEpoNyUxzBqf+0NJY z{xh06`+3j1KJU@zzbw3asPN46d}cW_@^>=LN#rYIHN_S1D7ur%pFTEWYVB@C8+<(f zNFIwi%g2@DxocddbM^R%;}lad6id;ZW8>y*irT(TE#0Wunyh=Ot7S_?i583L=`;!y zjXu-5E!&FaQF>I%rytUjcG}}P(yk|TTd&a2KiQtpG2W-+ZgBd>O>}M;|0+A^qzZ4x z`ur1SJIaJT%o@CMLLSSbX^&2HVaX3oT#%>r_dAb2H>bS6U)I!(zO;Qfq072rdpyc& z+h^-(Th^SSNeeK}@<|KxG<4P{c}p$SA2N;h3cpKLwXo)OyMvl@*Q75n>+O?wOz)yG zlqBubbELzx>)KeVLY3RzyY*5mHhthkYMtE!sB)-^BI5Tku7N$*ZO zVznwRKZfuqW>|K|%%qK-4>xwMm@=bmq)BcptVoPi<4h?kEwx&`?%hVa-RaH_od3e5DvZXDD5-g*30%W2$;YYgNq5ff3W-Q;j+=7JKvX>ina4^_XnY+NllTysM`! zE+)!fFo5%usXIh-*EH9xmeEI+-Dy(qt!Qx~)2djT^QCF4Sc7wR+Er|Wv%bVX&%(+y z)yS<(6G!Ux7#*^y8WGFkB^4!2nK3;_==gIy|7=Meiw?5VBMd(S(_LUm)pBm1@jEQ@ z`k6C9x%+2cgm*S89MaSca!0s3VzvhTV5W93LWPm6=msgNP}M*H&9apaVjiEKY#%Ps zoFlUWCCwSa()3xPf`NZHYr*9f2$*bDHu{WogJo%lWs5}5P_0Oy6_lq+y!%@{N)lXQ zqE4szEF~**)PQ7Du`J3r(W}e z;z!4xGSfO=o?TlY$m@J>whq$ID_dD-seu|(utP%a@!7q)o=oRxpU84Wt{lAJvwD)U z202zB_Nrcqj}j($gB&ocfC8V=VQ^04UmDQHko)72gxuWuNOYe3iOG^_FUc zqL!|84WJtojNuu;S@-vA16c;M!mV&T+neH??Y@!t{HLN;#DCV(4Qlck@SR< z!APqoI9$Fhp&7}o(Sv%-mPIWw0s2E4^ggKQcDV=E&GdMJ!#08>NHjs|h#rOfWjh?n zNQoJA9~^wo`?I_(|DRptS_B3~XG4WiOr;WsAtcb;rbjV|b^(kAeV8E>iIn9O`%6Kf z1%B7ok)AOvk;rtk6zczPdkZe3^Pu_uN3TKd{|^Q#klxE_WDwJp9F`$db-@tO`oO^^ z)|alXHhig`bSITMdukVC_w|+9imAhbr{?-NkJeTcTiGQHmkz#L`|FI^erie0vmH@?}p7>eRxAVSU_<>_*|ARrCBK4 zVz%p^oTd+9&z8?<#{k-JVP@$hjRS%c(Z=?fy-D3_G-Ew9Fir-<{J?}= z__Gy1U<;v>W!S@HR_DP(!6{fd4XD-BggnUz>2J+>JoFLz-oMg?=TBA!piKsXIg5?; zB^4-UvIuD<0e>p8R=DjOF8V^ zKzN?4uNHW>^n)^!FQ{aHKV;1rHHbpbC=mA?0wUrQxCd_NZ}Z%BszU=%Z(t&Cypa z0nu(=6(E|gDx0anMyTx`&p?K84y$qbFtL_%e$}j5Rv4zQCy`JzjGOQTFV0G~<^&pQ zFhE;{WGVo4z|Meuh7f|QNYpSM1$5X9t``2|g?iK$O) zIf1&s*0;wa7!gr{>6}?Q!&$P;#hM2%+IGK$Wv~_>p8gi%foMw)i2q89g6e{urFqkH z{kE#jzHZHqb?WK<{$|I&d!`o!=B3SaX3UWVuNjw(Du9W~=bXA*@}N8?OObte%&VF2Bi#(H(xuPlc8b$-%uSpki!Ia}kd zqBzz$Vpx=@^QE|FY&@$U&cs9DhY#Z${aQHg>oBaey{6Mhvw;XQRzB<#Q^w0 z2#of_xWd1zF^rXqM7MTo069xWjsS!;1 z;2p`|F>Lf~s$}q!i|s0PE} zf@PpLG7hBAL5!^HtH9`!8v?_Z=+T3wVjoWF2-&ah*wPI;oT=eQez2 z(1@10C!&*=E6k${t}iKnxE->sBBX_-Nup;qGEEY-E%gwnOW}q%9y4e0f>|fX0{^Oe zK<&d|W_W^FRXQv1sy-YO3@BBqbL@~y?ETE4`Jluv4*9U0c7zGykz+#|ATxh`Ekdsi zjU)^3&LPRYOXg54=c9dQd?QRmQJH%7>)sUbTJC&B>m zFv|F(!Q#HY3K0H^-m>wBvntSX(tTBPumuug9XlfMM>Vr6s;*AK8U1db0&aS4Q&@Yrye(28l*=qt{}R#IZD<=Z=+Nsy`k3##pVMq6y8p{@N6_AbssUX+CBr)l0$i zr~rim5V%S76C(Uz%JtLp5z=Tks%(a{>iP&qz4iKPjQZsDM;8naVMS_%TM${?8Zskv z;;jg|f#)c2y^E+YKa2xU}ifo+Stp zAPonYY}NH;nEkkOf16ex5Pp!Yl9A2e2XL;F7k-)-d?H3LLI!9@%#{hR*5+a}D)OZ) zv)f4Pp0MTIas#dRksH?F?EiAZr#O4(;~VMhCUXTEBE;tk(b&h^#P1KdZ-Rys5^e@K z`!n8#w!2TPLiZCVjxy)@TP8XFn`z9AH_ye>xLKKDkrE_Ln6oI>fP#2|2VAVwIeYW@ za+sY?Bkk+b5pfYk#8*s%;l|2!KX&_T9P|i@5IA zJE67fP9DPZ!INLcbI~a;o{>|bqRa%uJCHaqpmX=Bx@N>00kTWJB!ZKjkXxDHqu zyjyn`CvAW=OuIcmKuIAbap0qskOl=rejv_QzOBAQIN;bPnujnFA*q&g>23Q!$d_-c zDaXv2AQiLP!dNBML)i(Piqm8en@$7H8`Mv)2VmuV>vlJuKfV2m=@$664KmiF3;YLK zjbaj~^PAmsp%ZK~r5M==5`HcLrsM&NjehdYrpeh&kY3 zM%sHk#afO(q>7=Ro&mm6Q#szS$Uw!^6zEz0 zt;3k|#&4~{WG{cq2TmCCunSN5;b>uQ>F{4}czCIhujd}t(Qxq@FKZcWJM%}Twqy-J z!rPhIAws*6h&lv_7A!fcB$cs)P!VKEzV@B0kgf42<0UHHgN*zTQ=$ap^Y2y~EB{Aeql=A&ivfu8u< zk*NSj&=162mVx0=LIP$`j~QA5TYC6W@+qHr^hbhx*A6|5{gPWCxM%HSgcTlqZ2M$* z10%)~aKK{(Z+-q4;_ktU@BI)#&fuHhU&_iTGSz*(okpxv4OCn3%xm#n99#mGQTzDX z#fa{5>Z!x%%V4oa2Kyt_QRuBv6{@CIIS)KO8)o^b$LE&epe!?$4vS{ul`us3!lUub!DfIz3`RW>VHfA_Z{2bK>cH zXd%ylelUvDrwsuAkM{twvBVGdY7Jid%ykl?h`G;hp0@$oV5J<{*Bfm0dKM{7^x0os z8Q$0H4J}fd2d{ayOcImc^W0^?kfLxT;bQ@N0D=JX4@u97j!|!hOqi}iNHY-1P1=;y zg-wn?Qs@i;>x#bMeJC^Tx~4T{#S>1jFc6epc;p2+UsL4`&YLeREY=WMTw?p$ z+Vu_%q5$8e{KeUz+OiibmZI@UL=xHv|Hz8#ayuN&7{x1unF%_@Mg=h#;Mx}*q%opS z4TAiw{2kQi>9h;a@Drv+oyQ z#WU~ad!Y3mc==0Ho3kXN1f=T{I|4$fuPg>hE_r1W8b0yL^LQTn@+Jr*;fmS{qlLv={cAZZA+IxWMZq5vpd z+KRzHZqw0ZmjzZDdCydOf*XC=Q3}uo>w4_hFS|yzR}&B?XVt5jTpaul5lNqUZ5A}w zf4$}=f9<2!ADyfDj3l7a^*ft4Q($h8!UZ@k;$HY5XWt-y^0haXE(1WB!6J|%Q@8ut zv)F1jQUqnU`(ntV*tytIcDEac+#V-zZq~#QrNEH1rL8&Uxhf2K!?_K3n&(O-Fy^1m zwN0@um|1gTZ{CRp<@Z!M%3Cw>_R;H=&Mj|EbnLgjg0H{4MOv@y?X~$}WTboFUhc=K z!?b78DFjd39t|Kj!2vWi;oT#z(Dat`+}pEC1(0ofM%AFx;1_R4Gg{}sJA?s0_>QNH zvSx5x@0#=bcc#yP@xW=D9Z2E1)3!yKT0!tR?*_5ZJ?|3tU-_;s#({fx z!8mA04x&@=-g2SqR=u}Q%sO}Kg|mvu9(%6^Lrr|Y5<7<*zWDuzCN`2=hfo!vexvi@ z`@!)CQGirpxNC6HfBOlDJMckp3aLfPis%@lywAOGP=jCb`P zuSKjo{gcg@H}**-QejYO*yWabP$S?;5cX`e?L*0Db_<2N8gk;h1I7|2!zq! zFG5}~u-QPU-Km5eYOGn z0?m|j!>ON8e+DFslsG-H2{Tn)4U`xkqf%W4iK6z;4fSLOqBWrJa-Aqp8g0>QYSsd- zp}~o0AUe$qCSPiT`GEiVt%bE4pKG=rie_b?j^oE@0 z{@Su{*nzMGIE2Vv%m#YVY%~c4rqnNJb)~Yy>=FD7Yh&$^3wG5r~PVipJ*` zu$r-%eiq+bz#=TpA1Poz#Vpq`rp!juEM(y#fMrkfW+dy#tFwll8^f-V#t5%Tb*{U- zgr~-{FK~T@ycDQyZWl6m{rqGhn^g>Xl#{*~(Ao4Bty@<${&XQ*OiFaJA;?-`gOV5BeBAGbszKBqpF0nut%eZ1A5K6rrJ&a_gz3CG$s$%iq zOk+qK3{5RzazSZ4iTGO%2iG<2>|fv1(CDdJq(q0d&SG786SFzT1j6qqf2y1X;4W%I ze=TS8*|ey7$fsMDX<;L-DAML~l-JH>J*80~sePow?4I-*c%BH*l{kNVE(?NMpUq__ z=s5WCdF+~!xY|CdA;pQ9XHf;)w@eevC=9r*c0lhDXbi0e#bFDC^ujw7HV`$OjmCde z!FGfCvt10garh-JHZV30{#7G!{wEiEi$#ZCakEJhix0h1#gMLu4&5fRRR!*Ypu+rG z|Dw3kg|~f?eXSrvBfVPTeMuBoapnU9wG1gfb`2nmp+^_7Vm7-atG0yhB>0Eej{LhS z{-&Rmv4i~Yes+{K@@oR<-N?TiV9|=UBtn&jB-zysc>062e!mi^tzC?lB?C$mUs}s{ z*Eb|R4M~_B8FpMjs?M~Kws$oFm~{673tVIA?TBCzyr#){XiB1uc2Mh6n}CVBn)tJ| zY%y!%=WCfF__(jrl3^ZHueU8J#GkKP%v$P5MS{ywo4r?pC=^T&6;BZ%)Sb`7-4zRp zsd=P~KeLzt4(1I@SkvWLBzO*j;WLwTfl#~%&QL|Z)U8ELOI(1{!*J^8L-qvSq6PUx zI#P**JrTc<<`geGamB(DH02GrQj;wrC*@x>;{|nW+H`C9dJOdpAF=U-WcljYbc_i{ zts#-vk-b2(Uf0@Tz+`}H0|ThdE*qkiZ~_wrPB;?t^JF z>BhWMLTozJQFREiW%11+CVQKc89jiIkS=Lm06f#pFAKJnE_*@C@Y_P{7`iJf*(XB0 z+$y+ElEmxyGz$+)ZlBSknbGFot#C?S{IM}?8G$g~>}{@g}3 zJD3?{qzPs5XnN5EV;sp@PuZ?E`jgd{A%9A%LjS*SWHZFsZrQ|U{L?^m{q$cCl-!T> z*JTFMJeh%pZrjA3L57BRZeh41z^~cDT>QyxY#M)J3!8$1=e96l$NZyA_2jMM%eR%e zQMi388kg>1#YJ^W-O}YtmMmSecsVWx;AkDR;Qx0!o64Ww%8JnT6>58&3MOo0#eC@w zHkmKn#-^f5-Nq2F@wRQOa-JsVfL)|Iy>+e15~XJGvgLJkVqA^iz6~>L{KuJ}cd4hw z$8Q%u-po&P=EvO5DscsE^l$-q<4csK%LBE`Rs@zUp_OWKcNR*f)T$B)V7j{Hb&HqP z*4FZGZ)MZ@Z?|Lp8vpZl>|Ep1cYsV9U$#RmSPBBu@s z8ouKq7J^>IWy}@+6?L_>OO`L)ZxE759IOWFmaM1)>1vmY!km1VY68;qql?5OzrBck z3O@bSZm=J0=5A>6DEICW{>HXFtOVvu-@}$N{_VYN`ow4?i!`=|qx^}zaBD37x4mpx zWfxsF8{suv)fOxw?zHB_>!OQU1H>H8>B?Rhn;d%P^=gEZrBy17X#BB@+1+$t5wX56 zN7x{199p^$bb?V^2c&f-UH!{(Z%zVa&ygSOc~7(6fYhr?>Vdx54Yh#md8o zUf}q3MB*YY)%dA4P|V^lwZSvA_!n(#<2-WZDCY^KUg7qH0xNTVez+ZEv3UCdhCCfV zdVt*w%2#XbefS1NQTAF_Ud&wg2YEH8xGQIjW_N*c!Ts-Uk4Y@Os%A z`b`SVH8kaav68W@aH#UDtX7gNl`BW3ncO_aX3j$PC*#w@pr?DH84yEW0=0Ph7~4@W z2io43GSg&|E!)>ullek`>g$8HnsS`UxOs2!;Bn@eVkxyAFK)(kqDQZ+aqBqyZGoj6 z4r)XD9QFuQ^w89AuvbY{e|#f6Z;OxRYz2NAIQtTQe#8MytXepRpWQ1>(#hi@cZdfH9uD^`S}MovBC*%K&1nUChBYE zN$aPIwYZg0Y|mf4nf;!BbFEa`PH3s@_6t`B#@4Bjk5c~K74Maw19_hWy|=BZfOknxTU$A-^!+q$qdEM+{$KQ zhYh!}3dvOYfzzzy#*?gY=I9|C5i<-E69ZOq|4B9pz3NZ0H8k!Fe$z=-GVOxZ2`Z(z z=9WqeG8CIrDb@4vH`y3I?i6dFeg*u6Q_OQ?H_PXPm6FPTa4Xw92{M4-9$+Y;CH!l* zv6*~Vl~k4ot;4t7!IqcWsKhba;gPco+I-S!$f?bjoQ4Bo@{3Qi*@Y%9Owie?HoxpN z1kdKro@RUbW%H#|{7=&*SLWoptEKIxH;{Pbzv=oHF0GioD1URDRGQb5 za`P99q*+4?f6ij#Cr8{pxZ@PFt%SG7-O8_foh>O9UuhI~z3KoWK1#OQDaI ztFTa^z0cxB>*<(#=+pCT-gxN5Y2&3o zBT2>!i=|_mE%JkF;NQ}{+77#(GA{Vdl%UF6>tDJOh4hNdvu?yYZSQdNTrG9+T0?IY zOPUY*PYYQ?>sLt?WGjpY>1+6L-3do*!fFW!Brj@`TKOZZrL%Z{zEP6-ZEK`yx$>e$ z>4{8v1NatAn^-XrLZA)e4_&bQK{ym*h$q)dC(%Y*C%r{1-?&lgnTDGTbPr^$X?0Vw z1^~%_wo31kBz(I~nuDJg+N9FT90)JFZ7oiR0dXBJquXcD^kWZ5xMa$!4@kAe;;$`; z;}D|;NO-ZW1Jc{5ZPujOaGN?cNoPg5R$jLYa43d&Eh@p@zzMNd=CroBArD;upq@{T zNwCdBbulT$#-TH83=G&q?a~lyBwQOBL?~m5^KeZHON3trbci5MXn))bqI)hd7aO`$ z6pD^k)R@BL+wWi%`$g=MW!l9en`OhoWqk%87&--r&7-&vrgZVIDqbc#u=f$O66X`0CdL#*qAZYRv2c_yUyLN1*@bBAkX+58ll4kSSx3fvr zUU#+F(S}CV?KPCdVccNRkr1JXV%W;qye%bJ`8WidpY4=p<-xts?YCnWco}#n-`vRE3|fC#2djpa5b&L5+NR=bP?i-qO*O$V^ML$m^D#8Ky-s|D;>m zJIRec14=vG%Ba~#gm4YLn3R4c4Lxv)^jQfj=y>x<$iK$__eqH& z)b~zGD<IsPU#)Y`siJtNglG={I$EK?~0cj?vdtWg74oW?Zm88?v)6@!OueeoqMIGJlw7^Fis6 K%*bMd;{OLsfr!}v diff --git a/src/bower.json b/src/bower.json index 12cfb2d..708452c 100644 --- a/src/bower.json +++ b/src/bower.json @@ -5,6 +5,7 @@ "jQuery": "~2.1.3", "js-md5": "~1.1.0", "mousetrap": "~1.4.6", - "basicContext": "~2.0.2" + "basicContext": "~2.0.2", + "basicModal": "~2.0.0" } } diff --git a/src/gulpfile.js b/src/gulpfile.js index 79d1444..b2a4411 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -74,6 +74,7 @@ paths.main = { 'bower_components/mousetrap/mousetrap.min.js', 'bower_components/mousetrap/plugins/global-bind/mousetrap-global-bind.min.js', 'bower_components/basicContext/dist/basicContext.min.js', + 'bower_components/basicModal/dist/basicModal.min.js', '../src/scripts/*.js' ], coffee: [ @@ -88,6 +89,7 @@ paths.main = { ], styles: [ 'bower_components/basicContext/src/styles/main.scss', + 'bower_components/basicModal/src/styles/main.scss', '../src/styles/main.scss' ] } diff --git a/src/scripts/album.js b/src/scripts/album.js index cd4a161..3b28656 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -99,116 +99,138 @@ album.parse = function() { album.add = function() { - var title, - params, - buttons, - isNumber = function(n) { return !isNaN(parseFloat(n)) && isFinite(n) }; + var action; - buttons = [ - ['Create Album', function() { + action = function(data) { - title = $('.message input.text').val(); + var params, + isNumber = function(n) { return !isNaN(parseFloat(n)) && isFinite(n) }; - if (title.length===0) title = 'Untitled'; + basicModal.close(); - modal.close(); + if (data.title.length===0) data.title = 'Untitled'; - params = 'addAlbum&title=' + escape(encodeURI(title)); - lychee.api(params, function(data) { + params = 'addAlbum&title=' + escape(encodeURI(data.title)); + lychee.api(params, function(data) { - // Avoid first album to be true - if (data===true) data = 1; + // Avoid first album to be true + if (data===true) data = 1; - if (data!==false&&isNumber(data)) { - albums.refresh(); - lychee.goto(data); - } else { - lychee.error(null, params, data); - } + if (data!==false&&isNumber(data)) { + albums.refresh(); + lychee.goto(data); + } else { + lychee.error(null, params, data); + } - }); + }); - }], - ['Cancel', function() {}] - ]; + } - modal.show('New Album', "Enter a title for this album: ", buttons); + basicModal.show({ + body: "

Enter a title for the new album:

", + buttons: { + action: { + title: 'Create Album', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); } album.delete = function(albumIDs) { - var params, - buttons, - albumTitle; + var action = {}, + cancel = {}, + msg = '', + albumTitle = ''; if (!albumIDs) return false; if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; - buttons = [ - ['', function() { + action.fn = function() { - params = 'deleteAlbum&albumIDs=' + albumIDs; - lychee.api(params, function(data) { + var params; - if (visible.albums()) { + basicModal.close(); - albumIDs.forEach(function(id) { - albums.json.num--; - view.albums.content.delete(id); - delete albums.json.content[id]; - }); + params = 'deleteAlbum&albumIDs=' + albumIDs; + lychee.api(params, function(data) { - } else { + if (visible.albums()) { - albums.refresh(); - lychee.goto(''); + albumIDs.forEach(function(id) { + albums.json.num--; + view.albums.content.delete(id); + delete albums.json.content[id]; + }); - } + } else { - if (data!==true) lychee.error(null, params, data); + albums.refresh(); + lychee.goto(''); - }); + } - }], - ['', function() {}] - ]; + if (data!==true) lychee.error(null, params, data); + + }); + + } if (albumIDs.toString()==='0') { - buttons[0][0] = 'Clear Unsorted'; - buttons[1][0] = 'Keep Unsorted'; + action.title = 'Clear Unsorted'; + cancel.title = 'Keep Unsorted'; - modal.show('Clear Unsorted', "Are you sure you want to delete all photos from 'Unsorted'?
This action can't be undone!", buttons); + msg = "

Are you sure you want to delete all photos from 'Unsorted'?
This action can't be undone!

"; } else if (albumIDs.length===1) { - buttons[0][0] = 'Delete Album and Photos'; - buttons[1][0] = 'Keep Album'; + action.title = 'Delete Album and Photos'; + cancel.title = 'Keep Album'; // Get title if (album.json) albumTitle = album.json.title; else if (albums.json) albumTitle = albums.json.content[albumIDs].title; - modal.show('Delete Album', "Are you sure you want to delete the album '" + albumTitle + "' and all of the photos it contains? This action can't be undone!", buttons); + msg = "

Are you sure you want to delete the album '" + albumTitle + "' and all of the photos it contains? This action can't be undone!

"; } else { - buttons[0][0] = 'Delete Albums and Photos'; - buttons[1][0] = 'Keep Albums'; + action.title = 'Delete Albums and Photos'; + cancel.title = 'Keep Albums'; - modal.show('Delete Albums', "Are you sure you want to delete all " + albumIDs.length + " selected albums and all of the photos they contain? This action can't be undone!", buttons); + msg = "

Are you sure you want to delete all " + albumIDs.length + " selected albums and all of the photos they contain? This action can't be undone!

"; } + basicModal.show({ + body: msg, + buttons: { + action: { + title: action.title, + fn: action.fn, + class: 'red' + }, + cancel: { + title: cancel.title, + fn: basicModal.close + } + } + }); + } album.setTitle = function(albumIDs) { var oldTitle = '', - newTitle, - params, - buttons; + input; if (!albumIDs) return false; if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; @@ -224,50 +246,68 @@ album.setTitle = function(albumIDs) { } - buttons = [ - ['Set Title', function() { + action = function(data) { - // Get input - newTitle = $('.message input.text').val(); + var params, + newTitle; - // Remove html from input - newTitle = lychee.removeHTML(newTitle); + basicModal.close(); - // Set to Untitled when empty - newTitle = (newTitle==='') ? 'Untitled' : newTitle; + // Get input + newTitle = data.title; - if (visible.album()) { + // Remove html from input + newTitle = lychee.removeHTML(newTitle); - album.json.title = newTitle; - view.album.title(); + // Set to Untitled when empty + newTitle = (newTitle==='') ? 'Untitled' : newTitle; - if (albums.json) { - var id = albumIDs[0]; - albums.json.content[id].title = newTitle; - } + if (visible.album()) { - } else if (visible.albums()) { - - albumIDs.forEach(function(id) { - albums.json.content[id].title = newTitle; - view.albums.content.title(id); - }); + album.json.title = newTitle; + view.album.title(); + if (albums.json) { + var id = albumIDs[0]; + albums.json.content[id].title = newTitle; } - params = 'setAlbumTitle&albumIDs=' + albumIDs + '&title=' + escape(encodeURI(newTitle)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); + } else if (visible.albums()) { + albumIDs.forEach(function(id) { + albums.json.content[id].title = newTitle; + view.albums.content.title(id); }); - }], - ['Cancel', function() {}] - ]; + } - if (albumIDs.length===1) modal.show('Set Title', "Enter a new title for this album: ", buttons); - else modal.show('Set Titles', "Enter a title for all " + albumIDs.length + " selected album: ", buttons); + params = 'setAlbumTitle&albumIDs=' + albumIDs + '&title=' + escape(encodeURI(newTitle)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + } + + input = ""; + + if (albumIDs.length===1) msg = "

Enter a new title for this album: " + msg + "

"; + else msg = "

Enter a title for all " + albumIDs.length + " selected albums: " + msg +"

"; + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Set title', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); } diff --git a/src/scripts/init.js b/src/scripts/init.js index 64d09d8..611e752 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -71,8 +71,8 @@ $(document).ready(function() { Mousetrap .bind('left', function() { if (visible.photo()) $('#imageview a#previous').click() }) .bind('right', function() { if (visible.photo()) $('#imageview a#next').click() }) - .bind(['u', 'ctrl+u'], function() { $('#upload_files').click() }) - .bind(['s', 'ctrl+s', 'f', 'ctrl+f'], function(e) { + .bind('u', function() { $('#upload_files').click() }) + .bind(['s', 'f'], function(e) { if (visible.photo()) { header.dom('#button_star').click(); } else if (visible.albums()) { @@ -80,23 +80,23 @@ $(document).ready(function() { header.dom('#search').focus(); } }) - .bind(['r', 'ctrl+r'], function(e) { + .bind('r', function(e) { e.preventDefault(); if (visible.album()) album.setTitle(album.getID()); else if (visible.photo()) photo.setTitle([photo.getID()]); }) - .bind(['d', 'ctrl+d'], function(e) { + .bind('d', function(e) { e.preventDefault(); if (visible.photo()) photo.setDescription(photo.getID()); else if (visible.album()) album.setDescription(album.getID()); }) - .bind(['t', 'ctrl+t'], function(e) { + .bind('t', function(e) { if (visible.photo()) { e.preventDefault(); photo.editTags([photo.getID()]); } }) - .bind(['i', 'ctrl+i'], function() { + .bind('i', function() { if (visible.infobox()) view.infobox.hide(); else if (visible.multiselect()) return false; else if (visible.infoboxbutton()) view.infobox.show(); @@ -111,12 +111,12 @@ $(document).ready(function() { }); Mousetrap.bindGlobal('enter', function() { - if ($('.message .button.active').length) $('.message .button.active').addClass('pressed').click() + if (basicModal.visible()===true) basicModal.action(); }); Mousetrap.bindGlobal(['esc', 'command+up'], function(e) { e.preventDefault(); - if (visible.message()&&$('.message .close').length>0) modal.close(); + if (basicModal.visible()===true) basicModal.cancel(); else if (visible.contextMenu()) contextMenu.close(); else if (visible.infobox()) view.infobox.hide(); else if (visible.photo()) lychee.goto(album.getID()); diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index bbbbb0e..4349ccf 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -274,12 +274,12 @@ lychee.setMode = function(mode) { .off('drop'); Mousetrap - .unbind(['u', 'ctrl+u']) - .unbind(['s', 'ctrl+s']) - .unbind(['f', 'ctrl+f']) - .unbind(['r', 'ctrl+r']) - .unbind(['d', 'ctrl+d']) - .unbind(['t', 'ctrl+t']) + .unbind('u') + .unbind('s') + .unbind('f') + .unbind('r') + .unbind('d') + .unbind('t') .unbind(['command+backspace', 'ctrl+backspace']) .unbind(['command+a', 'ctrl+a']); @@ -290,7 +290,7 @@ lychee.setMode = function(mode) { } else if (mode==='view') { - Mousetrap.unbind('esc'); + Mousetrap.unbind(['esc', 'command+up']); $('#button_back, a#next, a#previous').remove(); $('.no_content').remove(); diff --git a/src/scripts/upload.js b/src/scripts/upload.js index fbed445..2f8b1e4 100755 --- a/src/scripts/upload.js +++ b/src/scripts/upload.js @@ -229,86 +229,36 @@ upload.start = { url: function() { var albumID = album.getID(), - params, - extension, - buttons, - link, - files = []; + action; if (albumID===false) albumID = 0; - buttons = [ - ['Import', function() { + action = function(data) { - link = $('.message input.text').val(); + var params, + extension, + files = []; - if (link&&link.length>3) { + basicModal.close(); - extension = link.split('.').pop(); - if (extension!=='jpeg'&&extension!=='jpg'&&extension!=='png'&&extension!=='gif'&&extension!=='webp') { - loadingBar.show('error', 'The file format of this link is not supported.'); - return false; - } + if (data.link&&data.link.length>3) { - files[0] = { - name: link, - supported: true - } - - upload.show('Importing URL', files, function() { - $('.upload_message .rows .row .status').html('Importing'); - }); - - params = 'importUrl&url=' + escape(encodeURI(link)) + '&albumID=' + albumID; - lychee.api(params, function(data) { - - upload.close(); - upload.notify('Import complete'); - - albums.refresh(); - - if (album.getID()===false) lychee.goto('0'); - else album.load(albumID); - - if (data!==true) lychee.error(null, params, data); - - }); - - } else loadingBar.show('error', 'Link to short or too long. Please try another one!'); - - }], - ['Cancel', function() {}] - ]; - - modal.show('Import from Link', "Please enter the direct link to a photo to import it: ", buttons); - - }, - - server: function() { - - var albumID = album.getID(), - params, - buttons, - files = [], - path; - - if (albumID===false) albumID = 0; - - buttons = [ - ['Import', function() { - - path = $('.message input.text').val(); + extension = data.link.split('.').pop(); + if (extension!=='jpeg'&&extension!=='jpg'&&extension!=='png'&&extension!=='gif'&&extension!=='webp') { + loadingBar.show('error', 'The file format of this link is not supported.'); + return false; + } files[0] = { - name: path, + name: data.link, supported: true - }; + } - upload.show('Importing from server', files, function() { + upload.show('Importing URL', files, function() { $('.upload_message .rows .row .status').html('Importing'); }); - params = 'importServer&albumID=' + albumID + '&path=' + escape(encodeURI(path)); + params = 'importUrl&url=' + escape(encodeURI(data.link)) + '&albumID=' + albumID; lychee.api(params, function(data) { upload.close(); @@ -316,24 +266,90 @@ upload.start = { albums.refresh(); - if (data==='Notice: Import only contains albums!') { - if (visible.albums()) lychee.load(); - else lychee.goto(''); - } - else if (album.getID()===false) lychee.goto('0'); + if (album.getID()===false) lychee.goto('0'); else album.load(albumID); - if (data==='Notice: Import only contains albums!') return true; - else if (data==='Warning: Folder empty!') lychee.error('Folder empty. No photos imported!', params, data); - else if (data!==true) lychee.error(null, params, data); + if (data!==true) lychee.error(null, params, data); }); - }], - ['Cancel', function() {}] - ]; + } else loadingBar.show('error', 'Link to short or too long. Please try another one!'); - modal.show('Import from Server', "This action will import all photos, folders and sub-folders which are located in the following directory. The original files will be deleted after the import when possible. ", buttons); + } + + basicModal.show({ + body: "

Please enter the direct link to a photo to import it:

", + buttons: { + action: { + title: 'Import', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); + + }, + + server: function() { + + var albumID = album.getID(), + action; + + if (albumID===false) albumID = 0; + + action = function(data) { + + var params, + files = []; + + files[0] = { + name: data.path, + supported: true + }; + + upload.show('Importing from server', files, function() { + $('.upload_message .rows .row .status').html('Importing'); + }); + + params = 'importServer&albumID=' + albumID + '&path=' + escape(encodeURI(data.path)); + lychee.api(params, function(data) { + + upload.close(); + upload.notify('Import complete'); + + albums.refresh(); + + if (data==='Notice: Import only contains albums!') { + if (visible.albums()) lychee.load(); + else lychee.goto(''); + } + else if (album.getID()===false) lychee.goto('0'); + else album.load(albumID); + + if (data==='Notice: Import only contains albums!') return true; + else if (data==='Warning: Folder empty!') lychee.error('Folder empty. No photos imported!', params, data); + else if (data!==true) lychee.error(null, params, data); + + }); + + } + + basicModal.show({ + body: "

This action will import all photos, folders and sub-folders which are located in the following directory. The original files will be deleted after the import when possible.

", + buttons: { + action: { + title: 'Import', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); }, diff --git a/src/styles/_content.scss b/src/styles/_content.scss index 185717b..b33ab7d 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -136,7 +136,7 @@ .iconic { fill: #fff; width: 21px; - filter: drop-shadow( 0 -1px 0 black(.1) ); + filter: drop-shadow($shadowLight); } } @@ -148,7 +148,7 @@ width: 100%; opacity: 0; border-top: 1px solid white(.02); - box-shadow: 0 -1px 0 0 black(.2); + box-shadow: $shadow; &:first-child { margin-top: 10px; @@ -162,7 +162,7 @@ color: white(.6); font-size: 14px; font-weight: bold; - text-shadow: 0 -1px 0 black(.1); + text-shadow: $shadow; } } diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index ce1e003..3c1d705 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -15,9 +15,9 @@ /* Item ------------------------------------------------*/ tr { margin-bottom: 2px; - color: #eee; + color: white(.9); font-size: 14px; - text-shadow: 0 -1px 0px black(.1); + text-shadow: $shadowLight; &.separator { background: black(.2); @@ -28,7 +28,7 @@ tr td { padding: 7px 25px 6px 12px; min-width: auto; - color: #fff; + color: white(1); border-radius: 0; transition: none; diff --git a/src/styles/_etc.scss b/src/styles/_etc.scss index fffa722..7b0fbb9 100644 --- a/src/styles/_etc.scss +++ b/src/styles/_etc.scss @@ -12,9 +12,13 @@ } /* Vars ------------------------------------------------*/ +// Properties +$shadowLight: 0 -1px 0 black(.1); +$shadow: 0 -1px 0 black(.2); + // Colors $colorBlue: #2293EC; -$colorRed: #d02a32; +$colorRed: #d92c34; // Animations $timing: cubic-bezier(.51, .92, .24, 1); diff --git a/src/styles/_header.scss b/src/styles/_header.scss index bd15322..7c0508f 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -42,7 +42,7 @@ header { font-size: 16px; font-weight: bold; text-align: center; - text-shadow: 0 -1px 0 black(.2); + text-shadow: $shadow; z-index: 1; .iconic { @@ -50,7 +50,7 @@ header { margin: 0 0 0 10px; width: 10px; fill: white(.5); - filter: drop-shadow(0 -1px 0 black(.2)); + filter: drop-shadow($shadow); transition: fill .2s ease-out; } @@ -84,7 +84,7 @@ header { .iconic { fill: white(.5); - filter: drop-shadow(0 -1px 0 black(.2)); + filter: drop-shadow($shadow); transition: fill .2s ease-out; } @@ -149,7 +149,7 @@ header { margin: 13px 9px; color: #888; font-size: 13px; - text-shadow: 0 -1px 0 black(.2); + text-shadow: $shadow; border-radius: 100px; display: none; cursor: pointer; diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index b3d8f0f..ece2eb7 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -43,7 +43,7 @@ .iconic { fill: white(.5); - filter: drop-shadow(0 -1px 0 black(.2)); + filter: drop-shadow($shadow); transition: fill .2s ease-out; } @@ -73,7 +73,7 @@ font-size: 16px; font-weight: bold; text-align: center; - text-shadow: 0 -1px 0 black(.2); + text-shadow: $shadow; } .header .close { @@ -84,7 +84,7 @@ .iconic { fill: #888; - filter: drop-shadow(0 -1px 0 black(.2)); + filter: drop-shadow($shadow); transition: fill .2s ease-out; } @@ -97,7 +97,7 @@ padding: 12px 0 8px; width: 100%; border-top: 1px solid white(.02); - box-shadow: 0 -1px 0 0 black(.2); + box-shadow: $shadow; h1 { margin: 0 0 0 20px; diff --git a/src/styles/_message.scss b/src/styles/_message.scss index a5b0695..26076d7 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -2,6 +2,80 @@ * @copyright 2014 by Tobias Reich */ +.basicModalContainer { + background-color: black(.85); +} + +.basicModal { + + background: linear-gradient(to bottom, #444, #333); + + border: 1px solid black(.7); + border-bottom: 1px solid black(.8); + box-shadow: 0 1px 4px black(.2), inset 0 1px 0 white(.05); + + p { + display: block; + padding: 42px 30px 40px; + color: white(.9); + font-size: 14px; + text-align: left; + text-shadow: $shadow; + line-height: 20px; + + b { + font-weight: bold; + color: white(1); + } + + a { + color: white(.9); + text-decoration: none; + border-bottom: 1px dashed #888; + } + } + + .basicModal__button { + padding: 13px 0 15px; + background: black(.02); + color: white(.5); + text-shadow: $shadow; + border-top: 1px solid black(.2); + box-shadow: inset 0 1px 0 white(.02); + + &:hover { background: white(.02); } + + &:active, + &--active { background: black(.1); } + + &#basicModal__action { + color: $colorBlue; + box-shadow: inset 0 1px 0 white(.02), inset 1px 0 0 black(.2); + } + + &#basicModal__action.red { color: $colorRed; } + + } + + /* Input ------------------------------------------------*/ + input.text { + width: calc(100% - 4px); + padding: 9px 2px; + margin: 10px 0; + background-color: transparent; + color: #fff; + text-shadow: $shadow; + border: none; + border-bottom: 1px solid black(.4); + border-radius: 0; + box-shadow: 0 1px 0 white(.08); + outline: none; + + &:focus { border-bottom-color: $colorBlue; } + } + +} + .message_overlay { position: fixed; width: 100%; @@ -112,7 +186,7 @@ margin-top: 10px; background-color: transparent; color: #fff; - text-shadow: 0 -1px 0 black(.3); + text-shadow: $shadow; border: none; box-shadow: 0 1px 0 white(.1); border-bottom: 1px solid #222; From 7a500fb9542b0a311b159dd16dd0a965fda6f19f Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 10 Jan 2015 18:42:40 +0100 Subject: [PATCH 020/190] Updated keyboard shortcut docs --- docs/Keyboard Shortcuts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Keyboard Shortcuts.md b/docs/Keyboard Shortcuts.md index 1d51c3e..6e7a4a9 100644 --- a/docs/Keyboard Shortcuts.md +++ b/docs/Keyboard Shortcuts.md @@ -1,6 +1,6 @@ ### About -The following keys and shortcuts can be used in Lychee. Single char-shortcuts are also working, when using them with together the `ctrl`-key. +The following keys and shortcuts can be used in Lychee. ### Everywhere | Key | Action | From f155e9c69579117d2ebd026f3f5373a20d37102a Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 10 Jan 2015 18:42:52 +0100 Subject: [PATCH 021/190] Fixed logout --- src/scripts/lychee.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 4349ccf..702da25 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -167,7 +167,9 @@ lychee.loginDialog = function() { lychee.logout = function() { - lychee.api('logout', window.location.reload); + lychee.api('logout', function() { + window.location.reload(); + }); } From 5c8f2fe036ed8c29c97c6b727e7a77580f46c21d Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 16 Jan 2015 19:52:34 +0100 Subject: [PATCH 022/190] New dialogs --- dist/main.css | Bin 45308 -> 46833 bytes dist/main.js | Bin 175352 -> 175821 bytes src/scripts/album.js | 117 ++++++++++++++++++++++++++------------- src/styles/_message.scss | 80 +++++++++++++++++++++++++- 4 files changed, 157 insertions(+), 40 deletions(-) diff --git a/dist/main.css b/dist/main.css index e2ed91e99072e00a36a856fe41054e9c9f3e82b0..f84690973fe1d54475e7673925bd652b029b279d 100644 GIT binary patch delta 1026 zcmah|F>ljA6jsARC5njJiZ-f>)c~qdY}s)!?Rn@xVdD=l0O#}BKIP&w_7zgBk`)vX zA}6tAU}IuH>c)SlkeHExAHdKZRh*remL@H_<#hMn``-7y_x=7^Irvri^trzf>lCMH z7DLY?QJ}eubJhlyA(WYwz5V{Hb6ppv1l?mEq>7G0Mi4HefuUGN+)>P%amRT|JRSlB zDOxoRx=w)|5a#3)NZ-S_=neY_N)Fy$Hw3H8dVWe;mIU8byz!7CKHm}Wj@kOPW+ zE?!5M#f!nB`1WR69KM|w@2^~#E1MlgDP~&Kq6p>FBccKhJ;2jk{(7a zmvxTSc07{C6z%|*GSnKeG;K*Z#3TqgFm3U@UlaQ;t5cS^fA{KxTk0gDCm|G_AQlmn zNjNPf&*bod%MuSKl7GkX38kRkY;IV0ZaX7!KvSX$)2xe`-lkZxr^VOm@{}qb_2$Hf z;&#cN&)+I)Lkz0w=2?vt^8f{5>^(nX?n2ZG61E+AKzy8CYWy>xQ<6$9;z#qkIPBf% zP7wOI3;-fdp5V!-N#Md&qmduo`agq{rSe|7#b8+s5#c*PUq4Ha;VzXsp&0U*>&4=Y z?_HcBieVyk;^ALW)}#UQEGsv`uucsa6YP)&sN(U~V%Jt3pG7>E9Rt%k1+5si&T)rl o@c;k- delta 23 fcmezPmg&z!rVYC$P443s+5B}uZhd%lMt!PXiOzNEhWY=oKLtp0H zd(Qd3^PPL|nR`E0efLY%N>6Qr!W*I|S|S#aFyR>9h-0yqF~%zSf!Z*H3sbcp?4zdn zP!gyaXk2aurBK=PD}a)}`{GHu=|0xwZ>Ek%Ly8zKe002`ZhyGT@c6K32#0-}zj@}; zzgz`<;O7v8^WB5zDedZD_$5klYtgUx*W#PBR6czpQCM4kgQ1@E4K_pz4X$j`LWNgW zdy}-1l7D~wNecR8{R{dX+vuR*<&Ecq^;7x#8=G{sd8d_EB-_Cr_Qq{PLKgCNw{l5H zR0>^pEvOG%b}z=muHf5or55Wufb(tQ zS-3e&Cf|cj(l!lK;1#b=LlHt)=Eysj;cOKbwW3@k&54M7{~;U!O!mz{4>f%=@H8ND z8!-*!?HSk)9+{qjvjk>AI-_bH!j?QVVg(D{6DCGghqaO!)kT_ub=8zK6T1d4h@PYy zR5!8%h&irh4MTE_93C}#Pb+MXqeXelE(HOw>;X%1RQ|7AEt zP9o+pa%m1a$hSGBy1Imk9E>qXLtd04KOu&#={G#~*se12?hGVJ%{+8Q(GahinUS1J zWez!po26Z}lyo+VT$C|sZ*6U4>M9&~ZmWAobY+f9ZogP(_jH7b67bHkkc}UpsooPN zeN@V3HB)t6Ibs^F8%Yyw5qelobfYw;qtTtHmc>XjBI%T=W(Jrkhg*2WE(m5f@rD8sy92U?=(ywkcx|0zL-075^ z?h9(N9%e^L?Gm)?QL2u|EEB7`N>7hA@$iHmD1=+9hWRFLC2n?M$Ct)?i9V* zG3@B9KlX-3Z>wA*>0X9tC}yYqk!&V+rkR6;t!G#<6{B}gXES&Pu_5f_=%(Z?xmi5M zPh_w@o^XRneY`)bItF{xf4!VIWF;JbXyY|vn2$)iK=ScCtuuZNUbtB5W~Ht7#Ujfd z@dk9&Qx98e&X75Ky94gEh#&=3g+w{!9FU3=wjF9^@zfo1l)ITY%b@Eta-69?30nLHxhm&laGeax1rZ zYXRDU)XhPnSa}^jKLJ(b>)&CmVp436$MY){2Z~qzfa*u8|M?vX6Xf=v&`?~v2S+Z@ P>`j~bw0P}2qa^==vb_UN-ST_gm_3-$3y2Hp{A`h z0n}uknB5J0b@SkF0DSq*&_Q|`*q5qb#`nhqyp*n9-rvylSUQC~F)g9kp1LhBzV_h* zp{kzwIRNSM!0=lX_R28-Jcamirq1}+%)6AToSg5gUYmWJp^@Y~8=yqP3(J(Kdg#i5 z1ZCpOXK#gR(Py{5pl4~Ri=MMfy}rMz{P)r_^_Fk%7J1oru!p@d8_9-cc>iA2b$>~G zHFd{=7C&Skz<9)!-JF9>^9Z(8zWn9g>y-Mv1c3}qK@Yik4jv~zOu{a5b33ysAQ>w8paRV#Sb-MuMhByjcPhYbkwy(v zk~K41ERdxRrkQ+KffP9+Ft3u-L1rtts4&~f=mi@4RAgF6V<*#1PEJ90VRiC;r7Jt= zn1kHB7^8Tuku{NAK(4DDM`G;MDJ7!%Y4V#cwq(1QHH}$kl0xMk!PgslrN|0-MXD+z8T>{rRrs(G|`5JMvxR z*^8iT1oC9>`mP0b74p8I54dmL<9t+M29g`1lJ6&&ZTy<_f{*a>>LA$qw}5g~Ssy3- z3B<{_VP^0Z*7e3r`X1eIZBrZTV=Zi<1TF5c>5qy)&tuprB>U}+QaLG;xnDyP`5bnT z_Gt){GXm4PZBJ(}oz(-2&_)i=!qbPiwdG*t6`fhbvWuSVp%We#TbWR-j~D+ZFK_5{ zNl(Y5h*JA%9u}V?@Ba?hHV02jor+RkXxLH9{sCJyHJ1#F>MWZ$r+EflV+Yl@r*`HZ S^qe3!9OfznYvV4HPW%J&1;!l! diff --git a/src/scripts/album.js b/src/scripts/album.js index 3b28656..7760237 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -230,7 +230,9 @@ album.delete = function(albumIDs) { album.setTitle = function(albumIDs) { var oldTitle = '', - input; + input = '', + msg = '', + action; if (!albumIDs) return false; if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; @@ -292,8 +294,8 @@ album.setTitle = function(albumIDs) { input = ""; - if (albumIDs.length===1) msg = "

Enter a new title for this album: " + msg + "

"; - else msg = "

Enter a title for all " + albumIDs.length + " selected albums: " + msg +"

"; + if (albumIDs.length===1) msg = "

Enter a new title for this album: " + input + "

"; + else msg = "

Enter a title for all " + albumIDs.length + " selected albums: " + input +"

"; basicModal.show({ body: msg, @@ -313,37 +315,44 @@ album.setTitle = function(albumIDs) { album.setDescription = function(photoID) { - var oldDescription = album.json.description.replace("'", '''), - description, - params, - buttons; + var oldDescription = album.json.description.replace("'", '''); - buttons = [ - ['Set Description', function() { + action = function(data) { - // Get input - description = $('.message input.text').val(); + var params; - // Remove html from input - description = lychee.removeHTML(description); + basicModal.close(); - if (visible.album()) { - album.json.description = description; - view.album.description(); + // Remove html from input + data.description = lychee.removeHTML(data.description); + + if (visible.album()) { + album.json.description = data.description; + view.album.description(); + } + + params = 'setAlbumDescription&albumID=' + photoID + '&description=' + escape(encodeURI(data.description)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + } + + basicModal.show({ + body: "

Please enter a description for this album:

", + buttons: { + action: { + title: 'Set Description', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close } - - params = 'setAlbumDescription&albumID=' + photoID + '&description=' + escape(encodeURI(description)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ['Cancel', function() {}] - ]; - - modal.show('Set Description', "Please enter a description for this album: ", buttons); + } + }); } @@ -356,14 +365,44 @@ album.setPublic = function(albumID, e) { albums.refresh(); - if (!visible.message()&&album.json.public==0) { + if (!basicModal.visible()&&album.json.public==0) { - modal.show('Share Album', "This album will be shared with the following properties:

Visible

Listed to visitors of your Lychee.

Downloadable

Visitors of your Lychee can download this album.

Password protected

Only accessible with a valid password.

", [['Share Album', function() { album.setPublic(album.getID(), e) }], ['Cancel', function() {}]], -170); + var msg = '', + action; - $('.message .choice input[name="password"]').on('change', function() { + action = function() { - if ($(this).prop('checked')===true) $('.message .choice input.text').show(); - else $('.message .choice input.text').hide(); + basicModal.close(); + album.setPublic(album.getID(), e); + + }; + + msg = "

This album will be shared with the following properties:

"; + + msg += "

Listed to visitors of your Lychee.

"; + msg += "

Visitors of your Lychee can download this album.

"; + msg += "

Only accessible with a valid password.

"; + + msg += "" + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Share Album', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); + + $('.basicModal .choice input[name="password"]').on('change', function() { + + if ($(this).prop('checked')===true) $('.basicModal .choice input[data-name="password"]').show(); + else $('.basicModal .choice input[data-name="password"]').hide(); }); @@ -371,18 +410,18 @@ album.setPublic = function(albumID, e) { } - if (visible.message()) { + if (basicModal.visible()) { - if ($('.message .choice input[name="password"]:checked').val()==='password') { - password = md5($('.message input.text').val()); + if ($('.basicModal .choice input[name="password"]:checked').length===1) { + password = md5($('.basicModal .choice input[name="password"]').val()); album.json.password = 1; } else { password = ''; album.json.password = 0; } - if ($('.message .choice input[name="listed"]:checked').val()==='listed') listed = true; - if ($('.message .choice input[name="downloadable"]:checked').val()==='downloadable') downloadable = true; + if ($('.basicModal .choice input[name="listed"]:checked').length===1) listed = true; + if ($('.basicModal .choice input[name="downloadable"]:checked').length===1) downloadable = true; } diff --git a/src/styles/_message.scss b/src/styles/_message.scss index 26076d7..958d7df 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -33,8 +33,11 @@ text-decoration: none; border-bottom: 1px dashed #888; } + + &.less { padding-bottom: 30px; } } + /* Buttons ------------------------------------------------*/ .basicModal__button { padding: 13px 0 15px; background: black(.02); @@ -57,7 +60,7 @@ } - /* Input ------------------------------------------------*/ + /* Inputs ------------------------------------------------*/ input.text { width: calc(100% - 4px); padding: 9px 2px; @@ -74,6 +77,81 @@ &:focus { border-bottom-color: $colorBlue; } } + /* Radio Buttons ------------------------------------------------*/ + .choice { + padding: 0 30px 15px; + width: calc(100% - 60px); + color: #fff; + + &:last-child { padding-bottom: 40px; } + + label { + float: left; + color: white(1); + font-size: 14px; + font-weight: 700; + text-shadow: $shadow; + } + + label input { + position: absolute; + margin: 0; + opacity: 0; + } + + label .checkbox { + float: left; + display: block; + width: 16px; + height: 16px; + background: black(.5); + border-radius: 3px; + box-shadow: 0 0 0 1px black(.7); + + .iconic { + box-sizing: border-box; + fill: $colorBlue; + padding: 2px; + opacity: 0; + transform: scale(0); + transition: opacity .2s $timing, transform .2s $timing; + } + } + + /* Checked */ + label input:checked ~ .checkbox { + background: black(.5); + .iconic { + opacity: 1; + transform: scale(1); + } + } + + /* Active */ + label input:active ~ .checkbox { + background: black(.3); + .iconic { opacity: .8; } + } + + label .label { margin: 0 0 0 18px; } + + p { + clear: both; + padding: 4px 0 0 35px; + margin: 0; + width: calc(100% - 35px); + color: white(.6); + font-size: 13px; + } + + input.text { + display: none; + margin-top: 5px; + margin-left: 35px; + width: calc(100% - 39px); + } + } + } .message_overlay { From 17d96ef3d23814044946461401f380419c4da325 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 16 Jan 2015 19:52:54 +0100 Subject: [PATCH 023/190] Updated order of diagnostics --- plugins/check/index.php | 90 +++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/plugins/check/index.php b/plugins/check/index.php index 27e9c65..062d0fe 100644 --- a/plugins/check/index.php +++ b/plugins/check/index.php @@ -21,59 +21,60 @@ header('content-type: text/plain'); # Declare $error = ''; +# Show separator +echo('Diagnostics' . PHP_EOL); +echo('-----------' . PHP_EOL); + +# PHP Version +if (floatval(phpversion())<5.2) $error .= ('Error: Upgrade to PHP 5.2 or higher!' . PHP_EOL); + +# Extensions +if (!extension_loaded('session')) $error .= ('Error: PHP session extension not activated' . PHP_EOL); +if (!extension_loaded('exif')) $error .= ('Error: PHP exif extension not activated' . PHP_EOL); +if (!extension_loaded('mbstring')) $error .= ('Error: PHP mbstring extension not activated' . PHP_EOL); +if (!extension_loaded('gd')) $error .= ('Error: PHP gd extension not activated' . PHP_EOL); +if (!extension_loaded('mysqli')) $error .= ('Error: PHP mysqli extension not activated' . PHP_EOL); +if (!extension_loaded('json')) $error .= ('Error: PHP json extension not activated' . PHP_EOL); +if (!extension_loaded('zip')) $error .= ('Error: PHP zip extension not activated' . PHP_EOL); + +# Permissions +if (hasPermissions(LYCHEE_UPLOADS_BIG)===false) $error .= ('Error: \'uploads/big\' missing or not readable and writable (777 required)' . PHP_EOL); +if (hasPermissions(LYCHEE_UPLOADS_MEDIUM)===false) $error .= ('Error: \'uploads/medium\' missing or not readable and writable (777 required)' . PHP_EOL); +if (hasPermissions(LYCHEE_UPLOADS_THUMB)===false) $error .= ('Error: \'uploads/thumb\' missing or not readable and writable (777 required)' . PHP_EOL); +if (hasPermissions(LYCHEE_UPLOADS_IMPORT)===false) $error .= ('Error: \'uploads/import\' missing or not readable and writable (777 required)' . PHP_EOL); +if (hasPermissions(LYCHEE_UPLOADS)===false) $error .= ('Error: \'uploads/\' missing or not readable and writable (777 required)' . PHP_EOL); +if (hasPermissions(LYCHEE_DATA)===false) $error .= ('Error: \'data/\' missing or not readable and writable (777 required)' . PHP_EOL); + # Load config -if (!file_exists(LYCHEE_CONFIG_FILE)) exit('Error 001: Configuration not found. Please install Lychee first.'); -require(LYCHEE_CONFIG_FILE); +if (!file_exists(LYCHEE_CONFIG_FILE)) exit('Error: Configuration not found. Please install Lychee for additional tests.'); +else require(LYCHEE_CONFIG_FILE); # Define the table prefix if (!isset($dbTablePrefix)) $dbTablePrefix = ''; defineTablePrefix($dbTablePrefix); -# Show separator -echo('Diagnostics' . PHP_EOL); -echo('-----------' . PHP_EOL); - # Database $database = new mysqli($dbHost, $dbUser, $dbPassword, $dbName); -if (mysqli_connect_errno()!=0) $error .= ('Error 100: ' . mysqli_connect_errno() . ': ' . mysqli_connect_error() . '' . PHP_EOL); +if (mysqli_connect_errno()!=0) $error .= ('Error: ' . mysqli_connect_errno() . ': ' . mysqli_connect_error() . '' . PHP_EOL); # Load settings $settings = new Settings($database); $settings = $settings->get(); -# PHP Version -if (floatval(phpversion())<5.2) $error .= ('Error 200: Please upgrade to PHP 5.2 or higher!' . PHP_EOL); - -# Extensions -if (!extension_loaded('exif')) $error .= ('Error 300: PHP exif extension not activated' . PHP_EOL); -if (!extension_loaded('mbstring')) $error .= ('Error 301: PHP mbstring extension not activated' . PHP_EOL); -if (!extension_loaded('gd')) $error .= ('Error 302: PHP gd extension not activated' . PHP_EOL); -if (!extension_loaded('mysqli')) $error .= ('Error 303: PHP mysqli extension not activated' . PHP_EOL); -if (!extension_loaded('json')) $error .= ('Error 304: PHP json extension not activated' . PHP_EOL); -if (!extension_loaded('zip')) $error .= ('Error 305: PHP zip extension not activated' . PHP_EOL); - # Config -if (!isset($dbName)||$dbName==='') $error .= ('Error 400: No property for $dbName in config.php' . PHP_EOL); -if (!isset($dbUser)||$dbUser==='') $error .= ('Error 401: No property for $dbUser in config.php' . PHP_EOL); -if (!isset($dbPassword)) $error .= ('Error 402: No property for $dbPassword in config.php' . PHP_EOL); -if (!isset($dbHost)||$dbHost==='') $error .= ('Error 403: No property for $dbHost in config.php' . PHP_EOL); +if (!isset($dbName)||$dbName==='') $error .= ('Error: No property for $dbName in config.php' . PHP_EOL); +if (!isset($dbUser)||$dbUser==='') $error .= ('Error: No property for $dbUser in config.php' . PHP_EOL); +if (!isset($dbPassword)) $error .= ('Error: No property for $dbPassword in config.php' . PHP_EOL); +if (!isset($dbHost)||$dbHost==='') $error .= ('Error: No property for $dbHost in config.php' . PHP_EOL); # Settings -if (!isset($settings['username'])||$settings['username']=='') $error .= ('Error 404: Username empty or not set in database' . PHP_EOL); -if (!isset($settings['password'])||$settings['password']=='') $error .= ('Error 405: Password empty or not set in database' . PHP_EOL); -if (!isset($settings['thumbQuality'])||$settings['thumbQuality']=='') $error .= ('Error 406: No or wrong property for thumbQuality in database' . PHP_EOL); -if (!isset($settings['sorting'])||$settings['sorting']=='') $error .= ('Error 407: Wrong property for sorting in database' . PHP_EOL); -if (!isset($settings['plugins'])) $error .= ('Error 408: No property for plugins in database' . PHP_EOL); -if (!isset($settings['imagick'])||$settings['imagick']=='') $error .= ('Error 409: No or wrong property for imagick in database' . PHP_EOL); -if (!isset($settings['checkForUpdates'])||($settings['checkForUpdates']!='0'&&$settings['checkForUpdates']!='1')) $error .= ('Error 410: No or wrong property for checkForUpdates in database' . PHP_EOL); - -# Permissions -if (hasPermissions(LYCHEE_UPLOADS_BIG)===false) $error .= ('Error 500: \'uploads/big\' missing or not readable and writable (777 required)' . PHP_EOL); -if (hasPermissions(LYCHEE_UPLOADS_MEDIUM)===false) $error .= ('Error 500: \'uploads/medium\' missing or not readable and writable (777 required)' . PHP_EOL); -if (hasPermissions(LYCHEE_UPLOADS_THUMB)===false) $error .= ('Error 501: \'uploads/thumb\' missing or not readable and writable (777 required)' . PHP_EOL); -if (hasPermissions(LYCHEE_UPLOADS_IMPORT)===false) $error .= ('Error 502: \'uploads/import\' missing or not readable and writable (777 required)' . PHP_EOL); -if (hasPermissions(LYCHEE_UPLOADS)===false) $error .= ('Error 503: \'uploads/\' missing or not readable and writable (777 required)' . PHP_EOL); -if (hasPermissions(LYCHEE_DATA)===false) $error .= ('Error 504: \'data/\' missing or not readable and writable (777 required)' . PHP_EOL); +if (!isset($settings['username'])||$settings['username']=='') $error .= ('Error: Username empty or not set in database' . PHP_EOL); +if (!isset($settings['password'])||$settings['password']=='') $error .= ('Error: Password empty or not set in database' . PHP_EOL); +if (!isset($settings['thumbQuality'])||$settings['thumbQuality']=='') $error .= ('Error: No or wrong property for thumbQuality in database' . PHP_EOL); +if (!isset($settings['sorting'])||$settings['sorting']=='') $error .= ('Error: Wrong property for sorting in database' . PHP_EOL); +if (!isset($settings['plugins'])) $error .= ('Error: No property for plugins in database' . PHP_EOL); +if (!isset($settings['imagick'])||$settings['imagick']=='') $error .= ('Error: No or wrong property for imagick in database' . PHP_EOL); +if (!isset($settings['checkForUpdates'])||($settings['checkForUpdates']!='0'&&$settings['checkForUpdates']!='1')) $error .= ('Error: No or wrong property for checkForUpdates in database' . PHP_EOL); # Check dropboxKey if (!$settings['dropboxKey']) echo('Warning: Dropbox import not working. No property for dropboxKey.' . PHP_EOL); @@ -85,8 +86,8 @@ if (ini_get('max_execution_time')<200&&ini_set('upload_max_filesize', '20M')===f if ($database->server_version<50500) echo('Warning: Lychee uses the GBK charset to avoid sql injections on your MySQL version. Please update to MySQL 5.5 or higher to enable UTF-8 support.' . PHP_EOL); # Output -if ($error=='') echo('No critical problems found. Lychee should work without problems!' . PHP_EOL); -else echo $error; +if ($error==='') echo('No critical problems found. Lychee should work without problems!' . PHP_EOL); +else echo $error; # Show separator echo(PHP_EOL . PHP_EOL . 'System Information' . PHP_EOL); @@ -96,13 +97,14 @@ echo('------------------' . PHP_EOL); $json = file_get_contents(LYCHEE_SRC . 'package.json'); $json = json_decode($json, true); +# About imagick $imagick = extension_loaded('imagick'); -if ($imagick===false) $imagick = '-'; - -if ($imagick===true) $imagickVersion = @Imagick::getVersion(); -if (!isset($imagickVersion, $imagickVersion['versionNumber'])||$imagickVersion==='') $imagickVersion = '-'; -else $imagickVersion = $imagickVersion['versionNumber']; +if ($imagick===true) $imagickVersion = @Imagick::getVersion(); +else $imagick = '-'; +if (!isset($imagickVersion, $imagickVersion['versionNumber'])||$imagickVersion==='') $imagickVersion = '-'; +else $imagickVersion = $imagickVersion['versionNumber']; +# About GD $gdVersion = gd_info(); # Output system information From 53c1366e7ef8c75a23829dd963172969725f7634 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 16 Jan 2015 21:39:32 +0100 Subject: [PATCH 024/190] New dialogs --- dist/main.js | Bin 175821 -> 176016 bytes src/scripts/album.js | 21 ++-- src/scripts/photo.js | 282 +++++++++++++++++++++++++++---------------- 3 files changed, 187 insertions(+), 116 deletions(-) diff --git a/dist/main.js b/dist/main.js index 00a4fb3dab3807e62eb5ef7d394068fbaf96b7e5..8afc117e30408690f345fb6884668ae8a3aec680 100644 GIT binary patch delta 4902 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 Fe*iKLdK3Tv delta 5218 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 diff --git a/src/scripts/album.js b/src/scripts/album.js index 7760237..8a68b68 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -251,13 +251,10 @@ album.setTitle = function(albumIDs) { action = function(data) { var params, - newTitle; + newTitle = data.title; basicModal.close(); - // Get input - newTitle = data.title; - // Remove html from input newTitle = lychee.removeHTML(newTitle); @@ -301,7 +298,7 @@ album.setTitle = function(albumIDs) { body: msg, buttons: { action: { - title: 'Set title', + title: 'Set Title', fn: action }, cancel: { @@ -315,23 +312,25 @@ album.setTitle = function(albumIDs) { album.setDescription = function(photoID) { - var oldDescription = album.json.description.replace("'", '''); + var oldDescription = album.json.description.replace("'", '''), + action; action = function(data) { - var params; + var params, + description = data.description; basicModal.close(); // Remove html from input - data.description = lychee.removeHTML(data.description); + description = lychee.removeHTML(description); if (visible.album()) { - album.json.description = data.description; + album.json.description = description; view.album.description(); } - params = 'setAlbumDescription&albumID=' + photoID + '&description=' + escape(encodeURI(data.description)); + params = 'setAlbumDescription&albumID=' + photoID + '&description=' + escape(encodeURI(description)); lychee.api(params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -378,11 +377,9 @@ album.setPublic = function(albumID, e) { }; msg = "

This album will be shared with the following properties:

"; - msg += "

Listed to visitors of your Lychee.

"; msg += "

Visitors of your Lychee can download this album.

"; msg += "

Only accessible with a valid password.

"; - msg += "" basicModal.show({ diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 6a6ae3c..53b1c57 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -168,9 +168,10 @@ photo.duplicate = function(photoIDs) { photo.delete = function(photoIDs) { - var params, - buttons, - photoTitle; + var action = {}, + cancel = {}, + msg = '', + photoTitle = ''; if (!photoIDs) return false; if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; @@ -186,72 +187,87 @@ photo.delete = function(photoIDs) { } - buttons = [ - ['', function() { + action.fn = function() { - var nextPhoto = '', - previousPhoto = ''; + var params = '', + nextPhoto = '', + previousPhoto = ''; - photoIDs.forEach(function(id, index, array) { + basicModal.close(); - // Change reference for the next and previous photo - if (album.json.content[id].nextPhoto!==''||album.json.content[id].previousPhoto!=='') { + photoIDs.forEach(function(id, index, array) { - nextPhoto = album.json.content[id].nextPhoto; - previousPhoto = album.json.content[id].previousPhoto; + // Change reference for the next and previous photo + if (album.json.content[id].nextPhoto!==''||album.json.content[id].previousPhoto!=='') { - album.json.content[previousPhoto].nextPhoto = nextPhoto; - album.json.content[nextPhoto].previousPhoto = previousPhoto; + nextPhoto = album.json.content[id].nextPhoto; + previousPhoto = album.json.content[id].previousPhoto; - } + album.json.content[previousPhoto].nextPhoto = nextPhoto; + album.json.content[nextPhoto].previousPhoto = previousPhoto; - album.json.content[id] = null; - view.album.content.delete(id); + } - }); + album.json.content[id] = null; + view.album.content.delete(id); - albums.refresh(); + }); - // Go to next photo if there is a next photo and - // next photo is not the current one. Show album otherwise. - if (visible.photo()&&nextPhoto!==''&&nextPhoto!==photo.getID()) lychee.goto(album.getID() + '/' + nextPhoto); - else if (!visible.albums()) lychee.goto(album.getID()); + albums.refresh(); - params = 'deletePhoto&photoIDs=' + photoIDs; - lychee.api(params, function(data) { + // Go to next photo if there is a next photo and + // next photo is not the current one. Show album otherwise. + if (visible.photo()&&nextPhoto!==''&&nextPhoto!==photo.getID()) lychee.goto(album.getID() + '/' + nextPhoto); + else if (!visible.albums()) lychee.goto(album.getID()); - if (data!==true) lychee.error(null, params, data); + params = 'deletePhoto&photoIDs=' + photoIDs; + lychee.api(params, function(data) { - }); + if (data!==true) lychee.error(null, params, data); - }], - ['', function() {}] - ]; + }); + + } if (photoIDs.length===1) { - buttons[0][0] = 'Delete Photo'; - buttons[1][0] = 'Keep Photo'; + action.title = 'Delete Photo'; + cancel.title = 'Keep Photo'; - modal.show('Delete Photo', "Are you sure you want to delete the photo '" + photoTitle + "'?
This action can't be undone!", buttons); + msg = "

Are you sure you want to delete the photo '" + photoTitle + "'?
This action can't be undone!

"; } else { - buttons[0][0] = 'Delete Photos'; - buttons[1][0] = 'Keep Photos'; + action.title = 'Delete Photo'; + cancel.title = 'Keep Photo'; - modal.show('Delete Photos', "Are you sure you want to delete all " + photoIDs.length + " selected photo?
This action can't be undone!", buttons); + msg = "

Are you sure you want to delete all " + photoIDs.length + " selected photo?
This action can't be undone!

"; } + basicModal.show({ + body: msg, + buttons: { + action: { + title: action.title, + fn: action.fn, + class: 'red' + }, + cancel: { + title: cancel.title, + fn: basicModal.close + } + } + }); + } photo.setTitle = function(photoIDs) { var oldTitle = '', - newTitle, - params, - buttons; + input = '', + msg = '', + action; if (!photoIDs) return false; if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; @@ -263,38 +279,53 @@ photo.setTitle = function(photoIDs) { oldTitle = oldTitle.replace("'", '''); } - buttons = [ - ['Set Title', function() { + action = function(data) { - // Get input - newTitle = $('.message input.text').val(); + var params, + newTitle = data.title; - // Remove html from input - newTitle = lychee.removeHTML(newTitle); + basicModal.close(); - if (visible.photo()) { - photo.json.title = (newTitle==='') ? 'Untitled' : newTitle; - view.photo.title(); + // Remove html from input + newTitle = lychee.removeHTML(newTitle); + + if (visible.photo()) { + photo.json.title = (newTitle==='') ? 'Untitled' : newTitle; + view.photo.title(); + } + + photoIDs.forEach(function(id, index, array) { + album.json.content[id].title = newTitle; + view.album.content.title(id); + }); + + params = 'setPhotoTitle&photoIDs=' + photoIDs + '&title=' + escape(encodeURI(newTitle)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + } + + input = ""; + + if (photoIDs.length===1) msg = "

Enter a new title for this photo: " + input + "

"; + else msg = "

Enter a title for all " + photoIDs.length + " selected photos: " + input + "

"; + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Set title', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close } - - photoIDs.forEach(function(id, index, array) { - album.json.content[id].title = newTitle; - view.album.content.title(id); - }); - - params = 'setPhotoTitle&photoIDs=' + photoIDs + '&title=' + escape(encodeURI(newTitle)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ['Cancel', function() {}] - ]; - - if (photoIDs.length===1) modal.show('Set Title', "Enter a new title for this photo: ", buttons); - else modal.show('Set Titles', "Enter a title for all " + photoIDs.length + " selected photos: ", buttons); + } + }); } @@ -369,7 +400,29 @@ photo.setPublic = function(photoID, e) { if (photo.json.public==2) { - modal.show('Public Album', "This photo is located in a public album. To make this photo private or public, edit the visibility of the associated album.", [['Show Album', function() { lychee.goto(photo.json.original_album) }], ['Close', function() {}]]); + var action; + + action = function() { + + basicModal.close(); + lychee.goto(photo.json.original_album); + + } + + basicModal.show({ + body: "

This photo is located in a public album. To make this photo private or public, edit the visibility of the associated album.

", + buttons: { + action: { + title: 'Show Album', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); + return false; } @@ -399,44 +452,53 @@ photo.setPublic = function(photoID, e) { photo.setDescription = function(photoID) { var oldDescription = photo.json.description.replace("'", '''), - description, - params, - buttons; + action; - buttons = [ - ['Set Description', function() { + action = function(data) { - // Get input - description = $('.message input.text').val(); + var params, + description = data.description; - // Remove html from input - description = lychee.removeHTML(description); + basicModal.close(); - if (visible.photo()) { - photo.json.description = description; - view.photo.description(); + // Remove html from input + description = lychee.removeHTML(description); + + if (visible.photo()) { + photo.json.description = description; + view.photo.description(); + } + + params = 'setPhotoDescription&photoID=' + photoID + '&description=' + escape(encodeURI(description)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + } + + basicModal.show({ + body: "

Enter a description for this photo:

", + buttons: { + action: { + title: 'Set Description', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close } - - params = 'setPhotoDescription&photoID=' + photoID + '&description=' + escape(encodeURI(description)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ['Cancel', function() {}] - ]; - - modal.show('Set Description', "Enter a description for this photo: ", buttons); + } + }); } photo.editTags = function(photoIDs) { var oldTags = '', - tags = '', - buttons; + msg = '', + input = ''; if (!photoIDs) return false; if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; @@ -456,19 +518,31 @@ photo.editTags = function(photoIDs) { // Improve tags oldTags = oldTags.replace(/,/g, ', '); - buttons = [ - ['Set Tags', function() { + action = function(data) { - tags = $('.message input.text').val(); + basicModal.close(); + photo.setTags(photoIDs, data.tags); - photo.setTags(photoIDs, tags); + } - }], - ['Cancel', function() {}] - ]; + input = ""; - if (photoIDs.length===1) modal.show('Set Tags', "Enter your tags for this photo. You can add multiple tags by separating them with a comma: ", buttons); - else modal.show('Set Tags', "Enter your tags for all " + photoIDs.length + " selected photos. Existing tags will be overwritten. You can add multiple tags by separating them with a comma: ", buttons); + if (photoIDs.length===1) msg = "

Enter your tags for this photo. You can add multiple tags by separating them with a comma: " + input + "

"; + else msg = "

Enter your tags for all " + photoIDs.length + " selected photos. Existing tags will be overwritten. You can add multiple tags by separating them with a comma: " + input + "

"; + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Set Tags', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); } From 0e703280948fcd2993d98c85d311b89619ca0a27 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 20 Jan 2015 13:20:17 +0100 Subject: [PATCH 025/190] Fixed a problem with the .no_content styling --- src/styles/_content.scss | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/styles/_content.scss b/src/styles/_content.scss index b33ab7d..4034688 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -166,26 +166,24 @@ } } - /* No Content ------------------------------------------------*/ - .no_content { - position: absolute; - top: 50%; - left: 50%; - height: 160px; - width: 180px; - margin-top: -60px; - margin-left: -90px; - padding-top: 20px; - color: rgba(15, 15, 15, 1); - text-shadow: 0 1px 0 white(.01); - text-align: center; +} - .icon { font-size: 80px; } +/* No Content ------------------------------------------------*/ +.no_content { + position: absolute; + top: 50%; + left: 50%; + padding-top: 20px; + color: rgba(10, 10, 10, 1); + color: black(.9); + text-shadow: 0 1px 0 white(.02); + text-align: center; + transform: translateX(-50%) translateY(-50%); - p { - font-size: 18px; - font-weight: bold; - } + .icon { font-size: 80px; } + + p { + font-size: 18px; + font-weight: bold; } - } \ No newline at end of file From 8d42af4d68c96b49cec849abbee8fab4c6fbaa86 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 20 Jan 2015 13:20:45 +0100 Subject: [PATCH 026/190] Improved input margin in dialogs --- src/styles/_message.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/styles/_message.scss b/src/styles/_message.scss index 958d7df..86191fa 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -64,7 +64,6 @@ input.text { width: calc(100% - 4px); padding: 9px 2px; - margin: 10px 0; background-color: transparent; color: #fff; text-shadow: $shadow; @@ -75,6 +74,10 @@ outline: none; &:focus { border-bottom-color: $colorBlue; } + + &:first-child { margin-top: 10px; } + + &:last-child { margin-bottom: 10px; } } /* Radio Buttons ------------------------------------------------*/ From 9d87beeb7528ceff45fdc46130ed7f53f1ba3481 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 20 Jan 2015 13:21:13 +0100 Subject: [PATCH 027/190] Updated createConfig dialog --- src/scripts/settings.js | 174 +++++++++++++++++++++++----------------- 1 file changed, 100 insertions(+), 74 deletions(-) diff --git a/src/scripts/settings.js b/src/scripts/settings.js index 61dd673..5c7aa5e 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -7,94 +7,120 @@ settings = {} settings.createConfig = function() { - var dbName, - dbUser, - dbPassword, - dbHost, - dbTablePrefix, - buttons, - params; + var msg, + action; - buttons = [ - ['Connect', function() { + action = function(data) { - dbHost = $('.message input.text#dbHost').val(); - dbUser = $('.message input.text#dbUser').val(); - dbPassword = $('.message input.text#dbPassword').val(); - dbName = $('.message input.text#dbName').val(); - dbTablePrefix = $('.message input.text#dbTablePrefix').val(); + var dbName = data.dbName || '', + dbUser = data.dbUser || '', + dbPassword = data.dbPassword || '', + dbHost = data.dbHost || '', + dbTablePrefix = data.dbTablePrefix || '', + params; - if (dbHost.length<1) dbHost = 'localhost'; - if (dbName.length<1) dbName = 'lychee'; + if (dbHost.length<1) dbHost = 'localhost'; + if (dbName.length<1) dbName = 'lychee'; - params = 'dbCreateConfig&dbName=' + escape(dbName) + '&dbUser=' + escape(dbUser) + '&dbPassword=' + escape(dbPassword) + '&dbHost=' + escape(dbHost) + '&dbTablePrefix=' + escape(dbTablePrefix); - lychee.api(params, function(data) { + params = 'dbCreateConfig&dbName=' + escape(dbName) + '&dbUser=' + escape(dbUser) + '&dbPassword=' + escape(dbPassword) + '&dbHost=' + escape(dbHost) + '&dbTablePrefix=' + escape(dbTablePrefix); + lychee.api(params, function(data) { - if (data!==true) { + if (data!==true) { - // Configuration failed - setTimeout(function() { - - // Connection failed - if (data.indexOf('Warning: Connection failed!')!==-1) { - - buttons = [ - ['Retry', function() { setTimeout(settings.createConfig, 400) }], - ['', function() {}] - ]; - modal.show('Connection Failed', 'Unable to connect to host database because access was denied. Double-check your host, username and password and ensure that access from your current location is permitted.', buttons, null, false); - return false; + // Connection failed + if (data.indexOf('Warning: Connection failed!')!==-1) { + basicModal.show({ + body: '

Unable to connect to host database because access was denied. Double-check your host, username and password and ensure that access from your current location is permitted.

', + buttons: { + action: { + title: 'Retry', + fn: settings.createConfig + } } + }); - // Creation failed - if (data.indexOf('Warning: Creation failed!')!==-1) { - - buttons = [ - ['Retry', function() { setTimeout(settings.createConfig, 400) }], - ['', function() {}] - ]; - modal.show('Creation Failed', 'Unable to create the database. Double-check your host, username and password and ensure that the specified user has the rights to modify and add content to the database.', buttons, null, false); - return false; - - } - - // Could not create file - if (data.indexOf('Warning: Could not create file!')!==-1) { - - buttons = [ - ['Retry', function() { setTimeout(settings.createConfig, 400) }], - ['', function() {}] - ]; - modal.show('Saving Failed', "Unable to save this configuration. Permission denied in 'data/'. Please set the read, write and execute rights for others in 'data/' and 'uploads/'. Take a look the readme for more information.", buttons, null, false); - return false; - - } - - // Something went wrong - buttons = [ - ['Retry', function() { setTimeout(settings.createConfig, 400) }], - ['', function() {}] - ]; - modal.show('Configuration Failed', 'Something unexpected happened. Please try again and check your installation and server. Take a look the readme for more information.', buttons, null, false); - return false; - - }, 400); - - } else { - - // Configuration successful - window.location.reload(); + return false; } - }); + // Creation failed + if (data.indexOf('Warning: Creation failed!')!==-1) { - }], - ['', function() {}] - ]; + basicModal.show({ + body: '

Unable to create the database. Double-check your host, username and password and ensure that the specified user has the rights to modify and add content to the database.

', + buttons: { + action: { + title: 'Retry', + fn: settings.createConfig + } + } + }); - modal.show('Configuration', "Enter your database connection details below:
Lychee will create its own database. If required, you can enter the name of an existing database instead:", buttons, -235, false); + return false; + + } + + // Could not create file + if (data.indexOf('Warning: Could not create file!')!==-1) { + + basicModal.show({ + body: "

Unable to save this configuration. Permission denied in 'data/'. Please set the read, write and execute rights for others in 'data/' and 'uploads/'. Take a look at the readme for more information.

", + buttons: { + action: { + title: 'Retry', + fn: settings.createConfig + } + } + }); + + return false; + + } + + // Something went wrong + basicModal.show({ + body: '

Something unexpected happened. Please try again and check your installation and server. Take a look at the readme for more information.

', + buttons: { + action: { + title: 'Retry', + fn: settings.createConfig + } + } + }); + + return false; + + } else { + + // Configuration successful + window.location.reload(); + + } + + }); + + } + + msg = "

Enter your database connection details below:"; + msg += ""; + msg += ""; + msg += ""; + msg += "

"; + msg += "

Lychee will create its own database. If required, you can enter the name of an existing database instead:"; + msg += ""; + msg += ""; + msg += "

"; + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Connect', + fn: action + } + } + }); } From a1c65590a4f74d255c51b4d9423c1d06d030811c Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 20 Jan 2015 13:46:33 +0100 Subject: [PATCH 028/190] Improved padding of text in dialogs --- src/styles/_message.scss | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/styles/_message.scss b/src/styles/_message.scss index 86191fa..9600454 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -16,7 +16,7 @@ p { display: block; - padding: 42px 30px 40px; + padding: 10px 30px; color: white(.9); font-size: 14px; text-align: left; @@ -35,6 +35,10 @@ } &.less { padding-bottom: 30px; } + + &:first-of-type { padding-top: 42px; } + + &:last-of-type { padding-bottom: 40px; } } /* Buttons ------------------------------------------------*/ @@ -140,7 +144,7 @@ p { clear: both; - padding: 4px 0 0 35px; + padding: 2px 0 0 35px; margin: 0; width: calc(100% - 35px); color: white(.6); From 3e946590fa7323f9bba59ed9e8bad5db1ba3f8e8 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 20 Jan 2015 13:46:58 +0100 Subject: [PATCH 029/190] Added error styling to dialog input --- src/styles/_message.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/styles/_message.scss b/src/styles/_message.scss index 9600454..a1e5215 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -79,6 +79,8 @@ &:focus { border-bottom-color: $colorBlue; } + &.error { border-bottom-color: $colorRed; } + &:first-child { margin-top: 10px; } &:last-child { margin-bottom: 10px; } From ae468be5bd9ca56529259df7fe926184805f7000 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 20 Jan 2015 13:47:32 +0100 Subject: [PATCH 030/190] Updated setLogin dialog --- src/scripts/settings.js | 103 +++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/src/scripts/settings.js b/src/scripts/settings.js index 5c7aa5e..978d56b 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -7,7 +7,7 @@ settings = {} settings.createConfig = function() { - var msg, + var msg = '', action; action = function(data) { @@ -102,14 +102,14 @@ settings.createConfig = function() { } - msg = "

Enter your database connection details below:"; - msg += ""; - msg += ""; - msg += ""; + msg += "

Enter your database connection details below:"; + msg += ""; + msg += ""; + msg += ""; msg += "

"; msg += "

Lychee will create its own database. If required, you can enter the name of an existing database instead:"; - msg += ""; - msg += ""; + msg += ""; + msg += ""; msg += "

"; basicModal.show({ @@ -184,46 +184,63 @@ settings.createLogin = function() { settings.setLogin = function() { - var old_password, - username, - password, - params, - buttons; + var msg = '', + action; - buttons = [ - ['Change Login', function() { + action = function(data) { - old_password = $('.message input.text#old_password').val(); - username = $('.message input.text#username').val(); - password = $('.message input.text#password').val(); + var oldPassword = data.oldPassword || '', + username = data.username || '', + password = data.password || '', + params; - if (old_password.length<1) { - loadingBar.show('error', 'Your old password was entered incorrectly. Please try again!'); - return false; + if (oldPassword.length<1) { + basicModal.error('oldPassword'); + return false; + } + + if (username.length<1) { + basicModal.error('username'); + return false; + } + + if (password.length<1) { + basicModal.error('password'); + return false; + } + + basicModal.close(); + + params = 'setLogin&oldPassword=' + md5(oldPassword) + '&username=' + escape(username) + '&password=' + md5(password); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + } + + msg += "

Enter your current password:"; + msg += ""; + msg += "

" + msg += "

Your username and password will be changed to the following:"; + msg += ""; + msg += ""; + msg += "

"; + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Change Login', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close } - - if (username.length<1) { - loadingBar.show('error', 'Your new username was entered incorrectly. Please try again!'); - return false; - } - - if (password.length<1) { - loadingBar.show('error', 'Your new password was entered incorrectly. Please try again!'); - return false; - } - - params = 'setLogin&oldPassword=' + md5(old_password) + '&username=' + escape(username) + '&password=' + md5(password); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ['Cancel', function() {}] - ]; - - modal.show('Change Login', "Enter your current password:
Your username and password will be changed to the following: ", buttons, -171); + } + }); } From fab2bb0afe4b7b95657ecb5b5f3b081852fecd71 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 22 Jan 2015 11:23:16 +0100 Subject: [PATCH 031/190] Close import-dialog after clicking Import --- src/scripts/upload.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/scripts/upload.js b/src/scripts/upload.js index 2f8b1e4..b64d813 100755 --- a/src/scripts/upload.js +++ b/src/scripts/upload.js @@ -305,6 +305,8 @@ upload.start = { var params, files = []; + basicModal.close(); + files[0] = { name: data.path, supported: true From 21ddae1040d33a9d46059f9a90d48a3710e93014 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 26 Jan 2015 20:58:20 +0100 Subject: [PATCH 032/190] Updated deps --- src/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/package.json b/src/package.json index 58603e8..73d3cea 100644 --- a/src/package.json +++ b/src/package.json @@ -11,13 +11,13 @@ }, "devDependencies": { "gulp": "^3.8.10", - "gulp-autoprefixer": "2.0.0", + "gulp-autoprefixer": "2.1.0", "gulp-coffee": "^2.2.0", "gulp-concat": "^2.4.3", "gulp-load-plugins": "^0.8.0", - "gulp-minify-css": "^0.3.11", + "gulp-minify-css": "^0.4.2", "gulp-rimraf": "^0.1.1", - "gulp-sass": "^1.2.4", - "gulp-uglify": "^1.0.2" + "gulp-sass": "^1.3.2", + "gulp-uglify": "^1.1.0" } } From 44e82f477784755efbc79a9d90d59b364b764803 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 26 Jan 2015 20:58:27 +0100 Subject: [PATCH 033/190] Rebuild --- dist/main.css | Bin 46833 -> 47430 bytes dist/main.js | Bin 176016 -> 175878 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.css b/dist/main.css index f84690973fe1d54475e7673925bd652b029b279d..4d0fed143d0610f27ef6036d3dd80b66f5de8bf5 100644 GIT binary patch delta 896 zcmZutOH30{6wM5uLJLTtmakC6Pp9-V6v5I4Y^#O^(XiAQ6Q}fJv2-TGh#;v@CAbk| zd-$Xw73(>qYj9N;XCHPo+8S+Sg}RrGq`m@Ya@Ba5 zqruypzy{tY*GBXz3$c*vN^?3Tv%$4*X!0?mERnfgs8$u=#r;C~j~2tOilAXg3ujRd zeUQQOa4p`bUg0&=D6CRoX(kVIs72+N9qSbuB*!e|VcxAwJW|);lG>KevgcgUXRSP^ z83yJ@I-fSIsH z6cy4JEmi;EC?%`(utW=qGx~(u{E-dY&@!SV z9arvbnWjk6GSa0|)U!gLu7L%A#ESQ^b%$X02gM%A#QRNBzu+4XIIlMt4wxifuph7r zeG#*V>j`!qnNKWHl$FG%j5NN^&ZiDWp59!`PZ!C%l=2r!-a^>` delta 897 zcmaJ{B3EnY|SF(4EnS0*ec0&Uemtzd84E-|Udz zK9hIyU@JP{YyXh~T7?1uC`3LkAvh>d416?IVCJS0S{>Fn18Zh0l$q74K)E1quF>_* zeeJv1p=q@cx0Jz@WeQGD9D@so-$D0%8hxS{4A|bZHDg?{1$6GFYJshCKv`u8>MH+W z$HuwlR*VpBwgux0M(5}Y>poP)c>+yAB`Zp~xSZ`3auG2db72wse4TKe zXa3g^hFyNxe((gC_747g?}ovSyuN_Rz3tM6^26;tOtAP zY@$bWag4T_;A~sV-wK*+GaBJa*o0=oBLv+TktHQ2DNc_hUxrnGH7xWSZk*zd2h*{* zBB&%8OC^$uz_)OjfnYurRgwZ9PaK%;!i-VUi+Z|lSsJ#cYF+>^->W!hz z(HTN(bHT$gD`p!*73kI2BSIa9a^u^-r*^^C1dZNKp0`;1UL4$qPv`Wb1~^H8r-}x- zz67n^9V4l|OA&Yu>TlU0xXeKPy-Jv?p~?0|oh`4f zsHhPi38aZ9YNF9-6tQYp;zY#z#@i7#=?}TIMo3~F7d0Pduyy^tLhF5JqEboB+H;N54-?=+UJEU!EYS#!aeEl zHCtgWu(o2g6X}F6iRInyzu(#)FT+i)fiE9*3n+ z)WwD5h^)(8H=T6gdOG|Byi{R1oiZ;>0338+CsxvZPr|}E8A>O|@w}kYmmaJ(jz0;1 z7BaqQqBo)h*?J#54`=i0Er;k4MJdvo7;xPY*Hp{j;%)TMfkRMPJwx2nNMn1kjEYB~ z*tP&I9)WtBZFG#lSEXgP;=AN-KAG%ZMJ2m%0nK?II%)M=FpKCYd}i8E&%pIo@V+xJZUv3K=iq`ZH8Bpy7G=S-stP~NT1N4F{B>5=q$5jk z1wHjBmKd!y*l(3&u)yVZRT@l{mrdD~(JQfv=G39rVr#2ISJpCi)Zri2QbwG|Tc$8F zg0eJYMyPa7z!g^d6%FWtEmk-!+v(<)maQK4GLa^thbd3~}H?$eET8nLnNv3P97S~NPW}2I&-iW**CT~;NCCiv4S439BdS8>5 z-FTA7MYNz4>0>z@JNovRDi(8*oxwg?W)YpB6>Hrpzl^J&C_?0x$?>2Rm7UszGgFEc zP-tT-mM@Ve;X`)7mrp}E>%DptE^aW7Ooq)8 zzIkXedCWZ!TH#c9>KAZzA^R^esh#gO;i82zjfnL`>wQc>=BQgXk58M z!h?mD+1igMfJWIK8IA!QvR(^%M#UNncU;Avb0`(VXR}y^?QU*yl6Nmw8XND$5&LUl%(@?M&HXK^R@VOu)+MML delta 2812 zcmbVOYitzP71ljAYrKABoi!L61G8hg-ofL27-%Yc2UAfDwprLhl6nPXGrN0P4;jyx z*;zlp3k9WBqom5iQm$H5QYuy9QCFmkGHT+cB~n{O`B9+;70D=s1XV@}U?R1ukka(- z&g{d~f7)NW_dDl&_q*qD@BHv%`ztr?m--zjnjLU#K`4}cq2YtZ6%pZBh949nUR~X% zYm$=WpB5t7r2C_)ipc)K>=tjA4Mnm?HeIiv5d+`4idICpPS0`dO{r-uj{B7ao|u}7 zWc}UaH5E}lG<{+FRCPoM1cMs`{9xAC_qQfAn5}wdcOBjM>E~Xt+oOW+jjJQ0l1xql ztRRXPEuXF%%TWFo$DRV}c5C8_uO_MszGt4plRiF_ojLcF6NRQP&bCnNpJspEjv~|P z+d)eFo7-C}mk;W0w?`5NrytH=bwzakP+E!WlB#&PV;a`en!-dqnAdrg%W&P%>=$>w z1j=^v3${Mw(TAlJm*I6anUtp=yxN#;yL)wOT~rZ#2ejS;iZ98B4CF;OX#~0DM{lAi zc_Dx{pr~;fj$4?6FG=_eH?8xR#U>WNq5CkWA)&&B2_owJWm5E}ao<_l1 zGn!>Nj#tQA9nft2^)&idb(MEC9h0TFaqXArj;+;N34TEk=B+ ziDL%2ii@5Z*7V@6jPBTAJTS?-o~t`U%GBKcd>of&e4%0lHkj)>1Gv)g=g{!!&c{ z@_UKj2Tg>zj`U*Knd|6yiPt@cwimV}4L6X7{A>=rx4e)!;<|xa$*CKt+0;n>Jcrhi zb+=Hp@!<`0%~lM(@EHmg7RJJ7=q{=;Ir1qb^`D~V+Fp4wK8$f5H=KV*N5N+LkO%W< zExA08SSu4B&!dNhtbFo0x?6AI*B+uPt(KBAP4J-wA6W%oF0){Ufz8Ix*TMv{j1*Xp z$X8E573m7X<8RVlDII@L2Tjk(HV9bJ@3eu}id$%de_Eu*Jr2HyipQftPD)`m5s^D# zvlVi_6a1*(GUWQ{zY7xR_VZ&B9`~9ilf%RDfhC-Y*9V*IB|7rpC1|Y12MasDOlw<^ zVO;XTFKU*JO9_4080vwQ%bR$GS9ysSd96nj_U~u6sfvQ*I$0P3w=EIdsit(YDg>+} z5qm0yHJ0;^i87UVbtET&T9s+K5PaNa`wcZ(yqh)Q|%L?ZU27?W{W!-u4a zqEYqASV`)`!2rE}RDqS%xF`?Ptyzx80h$R$uU!7|k)o5b-}vx=jVM=RZym^+4Dg5dHK zF$8PK?03M2MDqO*`0b`tev{u%-r57}oo2e}70dLAl8h59&yr=^;bIL-YoerOnRf-q z!gkoWG=Ya~+e4dkM<2ZLXaqz0c0lveVQr3m;uw9R$~K+c0dJG8oxnKDcIN2rT(@Uw z?JM(HPitcCg(zdn?u101sp(OsOzzzDmcIB9ttQz$z&=(^kvsaie&~Fh2};UnT4$t$ z&~CM0M;JQEy#c5u>j$8vVUa_wzNF;v;{kftt6`{VEj4F56PIb93hg?c(3ufc!{jdm z&{GkNX{2=!4%aUt+)X@T@SEFR8-$h(i>zg>umr7Z7xdPOd}r6j&AHrVcycxbjpTM1 zoW@7HpsljSoVXq-KW)RJlElm|H7O}9KYgXnnIDr{RZc`lt-;EVA8~}B0hvQbxpCuXaG|PV8+E1gB2ZXIKfCtT-7u>(ek913CmbaVMf;`88InJii?g> zuE2V6#ul?Gc$`Vo>?(AU|94j9QPw_FYmW8**XmKp=ih}jz4_rTh%3!xe!2_n6dp-z z_9z@brb-E>Y*^YwP4Bdz0kU$ycNrfvP9+AHN!e`XD_U- zqFuFxR)zHLrlT3y2P|m{!zG)$XZg1Kkme6{uerNc0XjH5DStVfA_ zJpyYj<2MwzSAp!rslizjBC{HF8TU1~Usb%`=a0hq%CgUmuTQ`l Date: Thu, 29 Jan 2015 22:54:42 +0100 Subject: [PATCH 034/190] Updated basicModal to auto-select first input in modal --- src/bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bower.json b/src/bower.json index 708452c..c15210b 100644 --- a/src/bower.json +++ b/src/bower.json @@ -6,6 +6,6 @@ "js-md5": "~1.1.0", "mousetrap": "~1.4.6", "basicContext": "~2.0.2", - "basicModal": "~2.0.0" + "basicModal": "~2.0.1" } } From 0d3593fe58dd1ffdec0e40ca36aab6a5114508ce Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 22:57:42 +0100 Subject: [PATCH 035/190] Use new modal for login --- src/scripts/build.coffee | 19 ------------------ src/scripts/lychee.js | 43 ++++++++++++++++++++++++++++------------ src/styles/_message.scss | 22 ++++++++++++++++++-- 3 files changed, 50 insertions(+), 34 deletions(-) diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index 8b53e0c..d052571 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -178,25 +178,6 @@ build.modal = (title, text, button, marginTop, closeButton) -> return html -build.signInModal = -> - - html = """ -
-
-

Sign In

- - -
Version #{ lychee.version }Update available!
- Sign in -
-
- """ - - return html - build.uploadModal = (title, files) -> html = """ diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 702da25..799dc67 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -117,10 +117,10 @@ lychee.api = function(params, callback) { } -lychee.login = function() { +lychee.login = function(data) { - var user = $('input#username').val(), - password = md5($('input#password').val()), + var user = data.username, + password = md5(data.password), params; params = 'login&user=' + user + '&password=' + password; @@ -137,8 +137,7 @@ lychee.login = function() { } else { // Show error and reactive button - $('#password').val('').addClass('error').focus(); - $('.message .button.active').removeClass('pressed'); + basicModal.error('password'); } @@ -148,16 +147,34 @@ lychee.login = function() { lychee.loginDialog = function() { - var local_username; + var localUsername, + msg = ''; - $('body').append(build.signInModal()); - $('#username').focus(); + msg += ""; + msg += "

Lychee " + lychee.version + "Update available!

"; + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Sign In', + fn: lychee.login + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); if (localStorage) { - local_username = localStorage.getItem('lychee_username'); - if (local_username!==null) { - if (local_username.length>0) $('#username').val(local_username); - $('#password').focus(); + localUsername = localStorage.getItem('lychee_username'); + if (localUsername!==null) { + if (localUsername.length>0) $('.basicModal input[data-name="username"]').val(localUsername); + $('.basicModal input[data-name="password"]').focus(); } } @@ -244,7 +261,7 @@ lychee.getUpdate = function() { $.ajax({ url: lychee.update_path, - success: function(data) { if (parseInt(data)>parseInt(lychee.version_code)) $('#version span').show(); } + success: function(data) { if (parseInt(data)>parseInt(lychee.version_code)) $('.version span').show(); } }); } diff --git a/src/styles/_message.scss b/src/styles/_message.scss index a1e5215..59ea9dc 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -39,6 +39,10 @@ &:first-of-type { padding-top: 42px; } &:last-of-type { padding-bottom: 40px; } + + &.signIn:first-of-type { padding-top: 30px; } + + &.signIn:last-of-type { padding-bottom: 30px; } } /* Buttons ------------------------------------------------*/ @@ -72,9 +76,11 @@ color: #fff; text-shadow: $shadow; border: none; - border-bottom: 1px solid black(.4); + // Do not use rgba() for border-bottom + // to avoid a blurry line in Safari on non-retina screens + border-bottom: 1px solid #222; border-radius: 0; - box-shadow: 0 1px 0 white(.08); + box-shadow: 0 1px 0 white(.05); outline: none; &:focus { border-bottom-color: $colorBlue; } @@ -161,6 +167,18 @@ } } + /* Version ------------------------------------------------*/ + .version { + padding: 0px 30px 20px; + color: #888; + font-size: 12px; + text-align: left; + + span { display: none; } + + span a { color: #888; } + } + } .message_overlay { From 206f3ba28d878591ddf7b27e80983f5307577186 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:00:46 +0100 Subject: [PATCH 036/190] New modal for setDropboxKey --- src/scripts/settings.js | 55 ++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/src/scripts/settings.js b/src/scripts/settings.js index 978d56b..db742ea 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -304,29 +304,50 @@ settings.setSorting = function() { settings.setDropboxKey = function(callback) { - var buttons, - params, - key; + var action, + msg = ""; - buttons = [ - ['Set Key', function() { + action = function(data) { - key = $('.message input.text#key').val(); + var params, + key = data.key; - params = 'setDropboxKey&key=' + key; - lychee.api(params, function(data) { + if (data.key.length<1) { + basicModal.error('key'); + return false; + } - if (data===true) { - lychee.dropboxKey = key; - if (callback) lychee.loadDropbox(callback); - } else lychee.error(null, params, data); + basicModal.close(); - }); + params = 'setDropboxKey&key=' + key; + lychee.api(params, function(data) { - }], - ['Cancel', function() {}] - ]; + if (data===true) { + lychee.dropboxKey = key; + if (callback) lychee.loadDropbox(callback); + } else lychee.error(null, params, data); - modal.show('Set Dropbox Key', "In order to import photos from your Dropbox, you need a valid drop-ins app key from their website. Generate yourself a personal key and enter it below: ", buttons); + }); + + } + + msg += "

"; + msg += "In order to import photos from your Dropbox, you need a valid drop-ins app key from their website. Generate yourself a personal key and enter it below:"; + msg += ""; + msg += "

"; + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Set Dropbox Key', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); } \ No newline at end of file From b27ccbe3499435efc5b96ef96dd287cca952ac77 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:07:38 +0100 Subject: [PATCH 037/190] Replaced mobileBrowser() with a better test --- src/scripts/init.js | 4 ++-- src/scripts/multiselect.js | 2 -- src/scripts/photo.js | 2 +- src/scripts/view/main.js | 4 ++-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/scripts/init.js b/src/scripts/init.js index 611e752..478d30d 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -6,7 +6,7 @@ $(document).ready(function() { /* Event Name */ - var eventName = (mobileBrowser()) ? 'touchend' : 'click'; + var eventName = ('ontouchend' in document.documentElement) ? 'touchend' : 'click'; /* Multiselect */ $('#content') .on('mousedown', function(e) { if (e.which===1) multiselect.show(e) }); @@ -125,7 +125,7 @@ $(document).ready(function() { }); - if (mobileBrowser()) { + if ('ontouchend' in document.documentElement) { $(document) diff --git a/src/scripts/multiselect.js b/src/scripts/multiselect.js index 2a3333e..df7cb31 100644 --- a/src/scripts/multiselect.js +++ b/src/scripts/multiselect.js @@ -16,7 +16,6 @@ multiselect.position = { multiselect.show = function(e) { - if (mobileBrowser()) return false; if (lychee.publicMode) return false; if (visible.search()) return false; if (visible.infobox()) return false; @@ -40,7 +39,6 @@ multiselect.selectAll = function() { newWidth, newHeight; - if (mobileBrowser()) return false; if (lychee.publicMode) return false; if (visible.search()) return false; if (visible.infobox()) return false; diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 4c9e605..b0ab8ba 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -61,7 +61,7 @@ photo.preloadNext = function(photoID) { // Never preload on mobile devices with bare RAM and // mostly mobile internet - if (mobileBrowser()) return false; + // {{ code }} if (album.json && album.json.content && diff --git a/src/scripts/view/main.js b/src/scripts/view/main.js index bb44d33..ca2f74a 100644 --- a/src/scripts/view/main.js +++ b/src/scripts/view/main.js @@ -12,8 +12,8 @@ var header = $('header'), $(document).ready(function(){ /* Event Name */ - if (mobileBrowser()) event_name = 'touchend'; - else event_name = 'click'; + if ('ontouchend' in document.documentElement) event_name = 'touchend'; + else event_name = 'click'; /* Window */ $(window).keydown(key); From 4fd41b224aa79bd89c1f49c24f5f9ad7b97e5333 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:08:52 +0100 Subject: [PATCH 038/190] Replaced " with ' --- src/gulpfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gulpfile.js b/src/gulpfile.js index b2a4411..c480210 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -1,6 +1,6 @@ var gulp = require('gulp'), - plugins = require("gulp-load-plugins")(), - paths = {} + plugins = require('gulp-load-plugins')(), + paths = {}; /* Error Handler -------------------------------- */ From 988f41ef1abd55aaf5efb6d337c43f55c5bd4627 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:10:12 +0100 Subject: [PATCH 039/190] Splited _frameworks.js --- src/gulpfile.js | 2 +- src/scripts/_frameworks.js | 8 ------- src/scripts/_gup.js | 12 ++++++++++ src/scripts/_retina.js | 46 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 9 deletions(-) delete mode 100755 src/scripts/_frameworks.js create mode 100644 src/scripts/_gup.js create mode 100755 src/scripts/_retina.js diff --git a/src/gulpfile.js b/src/gulpfile.js index c480210..2b41502 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -16,7 +16,7 @@ var catchError = function(err) { paths.view = { js: [ 'bower_components/jQuery/dist/jquery.min.js', - '../src/scripts/_frameworks.js', + '../src/scripts/_gup.js', '../src/scripts/view/main.js' ], coffee: [ diff --git a/src/scripts/_frameworks.js b/src/scripts/_frameworks.js deleted file mode 100755 index 39ac35a..0000000 --- a/src/scripts/_frameworks.js +++ /dev/null @@ -1,8 +0,0 @@ -/* Browser Detection */ -var BrowserDetect={init:function(){this.browser=this.searchString(this.dataBrowser)||"An unknown browser";this.version=this.searchVersion(navigator.userAgent)||this.searchVersion(navigator.appVersion)||"an unknown version";this.OS=this.searchString(this.dataOS)||"an unknown OS"},searchString:function(d){for(var a=0;a1){this.each(function(){var e=a(this);if(this.tagName.toLowerCase()=="img"&&e.attr("src")){var g=e.attr("src").replace(/\.(?!.*\.)/,d["retina-suffix"]+".");b(g,function(h){e.attr("src",h.src);var i=a("
").append(e.clone()).remove().html();if(!(/(width|height)=["']\d+["']/.test(i))){e.attr("width",h.width/2) -}})}if(d["retina-background"]){var f=e.css("background-image");if(/^url\(.*\)$/.test(f)){var g=f.substring(4,f.length-1).replace(/\.(?!.*\.)/,d["retina-suffix"]+".");b(g,function(h){e.css("background-image","url("+h.src+")");if(e.css("background-size")=="auto auto"){e.css("background-size",(h.width/2)+"px auto")}})}}})}}})(jQuery); \ No newline at end of file diff --git a/src/scripts/_gup.js b/src/scripts/_gup.js new file mode 100644 index 0000000..5ca85c3 --- /dev/null +++ b/src/scripts/_gup.js @@ -0,0 +1,12 @@ +function gup(b) { + + b = b.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + + var a = "[\\?&]" + b + "=([^&#]*)", + d = new RegExp(a), + c = d.exec(window.location.href); + + if (c === null) return ''; + else return c[1]; + +}; \ No newline at end of file diff --git a/src/scripts/_retina.js b/src/scripts/_retina.js new file mode 100755 index 0000000..9252836 --- /dev/null +++ b/src/scripts/_retina.js @@ -0,0 +1,46 @@ +/*! jQuery Retina Plugin */ +(function(a) { + a.fn.retina = function(c) { + var d = { + "retina-background": false, + "retina-suffix": "@2x" + }; + if (c) { + a.extend(d, c) + } + var b = function(f, g) { + var e = new Image(); + e.onload = function() { + g(e) + }; + e.src = f + }; + if (window.devicePixelRatio > 1) { + this.each(function() { + var e = a(this); + if (this.tagName.toLowerCase() == "img" && e.attr("src")) { + var g = e.attr("src").replace(/\.(?!.*\.)/, d["retina-suffix"] + "."); + b(g, function(h) { + e.attr("src", h.src); + var i = a("
").append(e.clone()).remove().html(); + if (!(/(width|height)=["']\d+["']/.test(i))) { + e.attr("width", h.width / 2) + } + }) + } + if (d["retina-background"]) { + var f = e.css("background-image"); + if (/^url\(.*\)$/.test(f)) { + var g = f.substring(4, f.length - 1).replace(/\.(?!.*\.)/, d["retina-suffix"] + "."); + b(g, function(h) { + e.css("background-image", "url(" + h.src + ")"); + if (e.css("background-size") == "auto auto") { + e.css("background-size", (h.width / 2) + "px auto") + } + }) + } + } + }) + } + } +})(jQuery); \ No newline at end of file From c4b61a357d4e179346d18a23d5388112a4c5da32 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:52:52 +0100 Subject: [PATCH 040/190] Updated basicModal --- src/bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bower.json b/src/bower.json index c15210b..3dbdfcc 100644 --- a/src/bower.json +++ b/src/bower.json @@ -6,6 +6,6 @@ "js-md5": "~1.1.0", "mousetrap": "~1.4.6", "basicContext": "~2.0.2", - "basicModal": "~2.0.1" + "basicModal": "~2.0.2" } } From 6bbb46d4bfa1a06d5ad88e2354b91f5259aa2044 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:54:25 +0100 Subject: [PATCH 041/190] Updated deps and added 6to5 --- src/gulpfile.js | 18 +++++++++++------- src/package.json | 3 ++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/gulpfile.js b/src/gulpfile.js index 2b41502..694f9d0 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -15,7 +15,6 @@ var catchError = function(err) { paths.view = { js: [ - 'bower_components/jQuery/dist/jquery.min.js', '../src/scripts/_gup.js', '../src/scripts/view/main.js' ], @@ -23,6 +22,7 @@ paths.view = { '../src/scripts/build.coffee' ], scripts: [ + 'bower_components/jQuery/dist/jquery.min.js', '../dist/_view--javascript.js', '../dist/_view--coffee.js' ] @@ -32,6 +32,8 @@ gulp.task('view--js', function() { var stream = gulp.src(paths.view.js) + .pipe(plugins['6to5']()) + .on('error', catchError) .pipe(plugins.concat('_view--javascript.js', {newLine: "\n"})) .pipe(gulp.dest('../dist/')); @@ -69,18 +71,18 @@ gulp.task('view--scripts', ['view--js', 'view--coffee'], function() { paths.main = { js: [ - 'bower_components/jQuery/dist/jquery.min.js', - 'bower_components/js-md5/js/md5.min.js', - 'bower_components/mousetrap/mousetrap.min.js', - 'bower_components/mousetrap/plugins/global-bind/mousetrap-global-bind.min.js', - 'bower_components/basicContext/dist/basicContext.min.js', - 'bower_components/basicModal/dist/basicModal.min.js', '../src/scripts/*.js' ], coffee: [ '../src/scripts/*.coffee' ], scripts: [ + 'bower_components/jQuery/dist/jquery.min.js', + 'bower_components/js-md5/js/md5.min.js', + 'bower_components/mousetrap/mousetrap.min.js', + 'bower_components/mousetrap/plugins/global-bind/mousetrap-global-bind.min.js', + 'bower_components/basicContext/dist/basicContext.min.js', + 'bower_components/basicModal/dist/basicModal.min.js', '../dist/_main--javascript.js', '../dist/_main--coffee.js' ], @@ -98,6 +100,8 @@ gulp.task('main--js', function() { var stream = gulp.src(paths.main.js) + .pipe(plugins['6to5']()) + .on('error', catchError) .pipe(plugins.concat('_main--javascript.js', {newLine: "\n"})) .pipe(gulp.dest('../dist/')); diff --git a/src/package.json b/src/package.json index 73d3cea..774efd8 100644 --- a/src/package.json +++ b/src/package.json @@ -11,11 +11,12 @@ }, "devDependencies": { "gulp": "^3.8.10", + "gulp-6to5": "^3.0.0", "gulp-autoprefixer": "2.1.0", "gulp-coffee": "^2.2.0", "gulp-concat": "^2.4.3", "gulp-load-plugins": "^0.8.0", - "gulp-minify-css": "^0.4.2", + "gulp-minify-css": "^0.4.3", "gulp-rimraf": "^0.1.1", "gulp-sass": "^1.3.2", "gulp-uglify": "^1.1.0" From c06f2e0f070836531fc3b5b0efa56d19208d9c98 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:55:13 +0100 Subject: [PATCH 042/190] Updated to ES6 and added the new modal for setSorting --- src/scripts/settings.js | 226 +++++++++++++++++++++++----------------- 1 file changed, 129 insertions(+), 97 deletions(-) diff --git a/src/scripts/settings.js b/src/scripts/settings.js index db742ea..67cbfd7 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -102,15 +102,19 @@ settings.createConfig = function() { } - msg += "

Enter your database connection details below:"; - msg += ""; - msg += ""; - msg += ""; - msg += "

"; - msg += "

Lychee will create its own database. If required, you can enter the name of an existing database instead:"; - msg += ""; - msg += ""; - msg += "

"; + msg = ` +

+ Enter your database connection details below: + + + +

+

+ Lychee will create its own database. If required, you can enter the name of an existing database instead: + + +

+ ` basicModal.show({ body: msg, @@ -126,59 +130,65 @@ settings.createConfig = function() { settings.createLogin = function() { - var username, - password, - params, - buttons; + var action, + msg = ''; - buttons = [ - ['Create Login', function() { + action = function(data) { - username = $('.message input.text#username').val(); - password = $('.message input.text#password').val(); + var params, + username = data.username, + password = data.password; - if (username.length<1||password.length<1) { + if (username.length<1) { + basicModal.error('username'); + return false; + } - setTimeout(function() { + if (password.length<1) { + basicModal.error('password'); + return false; + } - buttons = [ - ['Retry', function() { setTimeout(settings.createLogin, 400) }], - ['', function() {}] - ]; - modal.show('Wrong Input', 'The username or password you entered is not long enough. Please try again with another username and password!', buttons, null, false); - return false; + basicModal.close(); - }, 400); + params = 'setLogin&username=' + escape(username) + '&password=' + md5(password); + lychee.api(params, function(data) { - } else { - - params = 'setLogin&username=' + escape(username) + '&password=' + md5(password); - lychee.api(params, function(data) { - - if (data!==true) { - - setTimeout(function() { - - buttons = [ - ['Retry', function() { setTimeout(settings.createLogin, 400) }], - ['', function() {}] - ]; - modal.show('Creation Failed', 'Unable to save login. Please try again with another username and password!', buttons, null, false); - return false; - - }, 400); + if (data!==true) { + basicModal.show({ + body: '

Unable to save login. Please try again with another username and password!

', + buttons: { + action: { + title: 'Retry', + fn: settings.createLogin + } } - }); } - }], - ['', function() {}] - ]; + }); - modal.show('Create Login', "Enter a username and password for your installation: ", buttons, -122, false); + } + + msg = ` +

+ Enter a username and password for your installation: + + +

+ ` + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Create Login', + fn: action + } + } + }); } @@ -220,13 +230,17 @@ settings.setLogin = function() { } - msg += "

Enter your current password:"; - msg += ""; - msg += "

" - msg += "

Your username and password will be changed to the following:"; - msg += ""; - msg += ""; - msg += "

"; + msg = ` +

+ Enter your current password: + +

+

+ Your username and password will be changed to the following: + + +

+ ` basicModal.show({ body: msg, @@ -246,57 +260,73 @@ settings.setLogin = function() { settings.setSorting = function() { - var buttons, - sorting, - params; + var sorting = [], + action, + msg = ''; - buttons = [ - ['Change Sorting', function() { + action = function() { - sorting[0] = $('select#settings_type').val(); - sorting[1] = $('select#settings_order').val(); + var params; - albums.refresh(); + sorting[0] = $('.basicModal select#settings_type').val(); + sorting[1] = $('.basicModal select#settings_order').val(); - params = 'setSorting&type=' + sorting[0] + '&order=' + sorting[1]; - lychee.api(params, function(data) { + basicModal.close(); + albums.refresh(); - if (data===true) { - lychee.sorting = 'ORDER BY ' + sorting[0] + ' ' + sorting[1]; - lychee.load(); - } else lychee.error(null, params, data); + params = 'setSorting&type=' + sorting[0] + '&order=' + sorting[1]; + lychee.api(params, function(data) { - }); + if (data===true) { + lychee.sorting = 'ORDER BY ' + sorting[0] + ' ' + sorting[1]; + lychee.load(); + } else lychee.error(null, params, data); - }], - ['Cancel', function() {}] - ]; + }); - modal.show('Change Sorting', - "Sort photos by \ - \ - in an \ - \ - order.\ - ", buttons); + } + + msg = ` +

+ Sort photos by + + in an + + order. +

+ ` + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Change Sorting', + fn: action + }, + cancel: { + title: 'Cancel', + fn: basicModal.close + } + } + }); if (lychee.sorting!=='') { sorting = lychee.sorting.replace('ORDER BY ', '').split(' '); - $('select#settings_type').val(sorting[0]); - $('select#settings_order').val(sorting[1]); + $('.basicModal select#settings_type').val(sorting[0]); + $('.basicModal select#settings_order').val(sorting[1]); } @@ -331,10 +361,12 @@ settings.setDropboxKey = function(callback) { } - msg += "

"; - msg += "In order to import photos from your Dropbox, you need a valid drop-ins app key from their website. Generate yourself a personal key and enter it below:"; - msg += ""; - msg += "

"; + msg = ` +

+ In order to import photos from your Dropbox, you need a valid drop-ins app key from their website. Generate yourself a personal key and enter it below: + +

+ ` basicModal.show({ body: msg, From 1cd74f047dd5918b78d8cabec923535828d5effa Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:55:25 +0100 Subject: [PATCH 043/190] Updated to ES6 --- src/scripts/lychee.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 799dc67..b66e513 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -150,11 +150,13 @@ lychee.loginDialog = function() { var localUsername, msg = ''; - msg += ""; - msg += "

Lychee " + lychee.version + "Update available!

"; + msg = ` + +

Lychee ${ lychee.version }Update available!

+ ` basicModal.show({ body: msg, From a2821a8238626cff416295232752c9c18c0df36e Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 29 Jan 2015 23:55:34 +0100 Subject: [PATCH 044/190] Rebuild --- dist/main.css | Bin 47430 -> 47687 bytes dist/main.js | Bin 175878 -> 173898 bytes dist/view.js | Bin 96904 -> 93517 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.css b/dist/main.css index 4d0fed143d0610f27ef6036d3dd80b66f5de8bf5..4e411fa3ee9ca179cf85423034d616afa1f11d5a 100644 GIT binary patch delta 209 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 AqW}N^ delta 14067 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 ZA&qTwuJ31IH1I$_L+on&nSOSJ{SURvC7S>M From 20bcac4dd230b0b6ebf8ed7e4891886acb1435a6 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 00:20:11 +0100 Subject: [PATCH 045/190] Fixed album sharing with password protection --- src/scripts/album.js | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/scripts/album.js b/src/scripts/album.js index 8a68b68..b3a4244 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -376,11 +376,36 @@ album.setPublic = function(albumID, e) { }; - msg = "

This album will be shared with the following properties:

"; - msg += "

Listed to visitors of your Lychee.

"; - msg += "

Visitors of your Lychee can download this album.

"; - msg += "

Only accessible with a valid password.

"; - msg += "" + msg = ` +

This album will be shared with the following properties:

+
+
+ +

Listed to visitors of your Lychee.

+
+
+ +

Visitors of your Lychee can download this album.

+
+
+ +

Only accessible with a valid password.

+ +
+ + ` basicModal.show({ body: msg, @@ -410,7 +435,7 @@ album.setPublic = function(albumID, e) { if (basicModal.visible()) { if ($('.basicModal .choice input[name="password"]:checked').length===1) { - password = md5($('.basicModal .choice input[name="password"]').val()); + password = md5($('.basicModal .choice input[data-name="password"]').val()); album.json.password = 1; } else { password = ''; From 42b4d60b1394d18825c6392df920cc2d11d6df95 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 00:20:42 +0100 Subject: [PATCH 046/190] New modal for password.getDialog --- src/scripts/password.js | 42 ++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/scripts/password.js b/src/scripts/password.js index 8898b37..b782710 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -11,7 +11,7 @@ password = { password.get = function(albumID, callback) { - var passwd = $('.message input.text').val(), + var passwd = $('.basicModal input.text').val(), params; if (!lychee.publicMode) callback(); @@ -35,11 +35,11 @@ password.get = function(albumID, callback) { lychee.api(params, function(data) { if (data===true) { + basicModal.close(); password.value = md5(passwd); callback(); } else { - lychee.goto(''); - loadingBar.show('error', 'Access denied. Wrong password!'); + basicModal.error('password'); } }); @@ -50,12 +50,36 @@ password.get = function(albumID, callback) { password.getDialog = function(albumID, callback) { - var buttons; + var action, + cancel, + msg = ''; - buttons = [ - ['Enter', function() { password.get(albumID, callback) }], - ['Cancel', lychee.goto] - ]; - modal.show("
Enter Password", "This album is protected by a password. Enter the password below to view the photos of this album: ", buttons, -110, false); + action = function() { password.get(albumID, callback) } + + cancel = function() { + basicModal.close(); + lychee.goto(); + } + + msg = ` +

+ This album is protected by a password. Enter the password below to view the photos of this album: + +

+ ` + + basicModal.show({ + body: msg, + buttons: { + action: { + title: 'Enter', + fn: action + }, + cancel: { + title: 'Cancel', + fn: cancel + } + } + }); } \ No newline at end of file From 168d0ed2cef811575692f82a0b0e2323ff495638 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 00:21:20 +0100 Subject: [PATCH 047/190] Removed legacy modal-system --- src/scripts/init.js | 7 +- src/scripts/modal.js | 34 ------- src/styles/_message.scss | 209 +-------------------------------------- 3 files changed, 3 insertions(+), 247 deletions(-) delete mode 100644 src/scripts/modal.js diff --git a/src/scripts/init.js b/src/scripts/init.js index 478d30d..1ab6a59 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -154,11 +154,6 @@ $(document).ready(function() { .on('click', '.album', function() { lychee.goto($(this).attr('data-id')) }) .on('click', '.photo', function() { lychee.goto(album.getID() + '/' + $(this).attr('data-id')) }) - /* Modal */ - .on(eventName, '.message .close', modal.close) - .on(eventName, '.message .button:first', function() { if (modal.fns!==null) modal.fns[0](); if (!visible.signin()) modal.close() }) - .on(eventName, '.message .button:last', function() { if (modal.fns!==null) modal.fns[1](); if (!visible.signin()) modal.close() }) - /* Context Menu */ .on('contextmenu', '.photo', function(e) { contextMenu.photo(photo.getID(), e) }) .on('contextmenu', '.album', function(e) { contextMenu.album(album.getID(), e) }) @@ -167,7 +162,7 @@ $(document).ready(function() { .on(eventName, '#infobox_overlay', view.infobox.hide) /* Upload */ - .on('change', '#upload_files', function() { modal.close(); upload.start.local(this.files) }) + .on('change', '#upload_files', function() { basicModal.close(); upload.start.local(this.files) }) .on(eventName, '.upload_message a.close', upload.close) .on('dragover', function(e) { e.preventDefault(); }, false) .on('drop', function(e) { diff --git a/src/scripts/modal.js b/src/scripts/modal.js deleted file mode 100644 index 10b9d76..0000000 --- a/src/scripts/modal.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @description Build, show and hide a modal. - * @copyright 2014 by Tobias Reich - */ - -modal = { - - fns: null - -} - -modal.show = function(title, text, buttons, marginTop, closeButton) { - - if (!buttons) { - buttons = [ - ['', function() {}], - ['', function() {}] - ]; - } - - modal.fns = [buttons[0][1], buttons[1][1]]; - - $('body').append(build.modal(title, text, buttons, marginTop, closeButton)); - $('.message input:first-child').focus().select(); - -} - -modal.close = function() { - - modal.fns = null; - $('.message_overlay').removeClass('fadeIn').css('opacity', 0); - setTimeout(function() { $('.message_overlay').remove() }, 300); - -} \ No newline at end of file diff --git a/src/styles/_message.scss b/src/styles/_message.scss index 59ea9dc..5c9e65d 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -34,8 +34,6 @@ border-bottom: 1px dashed #888; } - &.less { padding-bottom: 30px; } - &:first-of-type { padding-top: 42px; } &:last-of-type { padding-bottom: 40px; } @@ -43,6 +41,8 @@ &.signIn:first-of-type { padding-top: 30px; } &.signIn:last-of-type { padding-bottom: 30px; } + + &.less { padding-bottom: 30px; } } /* Buttons ------------------------------------------------*/ @@ -179,209 +179,4 @@ span a { color: #888; } } -} - -.message_overlay { - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-color: black(.85); - z-index: 1000; -} - -.message { - - position: absolute; - display: inline-block; - width: 500px; - margin-left: -250px; - margin-top: -95px; - background-image: linear-gradient(to bottom, rgb(75, 75, 75), rgb(45, 45, 45)); - border-radius: 5px; - box-shadow: 0 0 5px black(1), inset 0 1px 0 white(.08); - - /* Animation */ - animation-name: moveUp; - animation-duration: .3s; - animation-timing-function: $timingBounce; - - /* Header ------------------------------------------------*/ - h1 { - float: left; - width: 100%; - padding: 12px 0; - color: #fff; - font-size: 16px; - font-weight: bold; - text-shadow: 0 -1px 0 black(.3); - text-align: center; - } - - .close { - position: absolute; - top: 0; - right: 0; - padding: 12px 14px 6px 7px; - color: #aaa; - font-size: 20px; - text-shadow: 0 -1px 0 black(.3); - cursor: pointer; - - &:hover { color: white(1); } - } - - /* Text ------------------------------------------------*/ - p { - float: left; - width: 90%; - margin-top: 1px; - padding: 12px 5% 15px 5%; - color: #eee; - font-size: 14px; - text-shadow: 0 -1px 0 black(.3); - line-height: 20px; - - b { - font-weight: bold; - color: white(1); - } - - a { - color: #eee; - text-decoration: none; - border-bottom: 1px dashed #888; - } - } - - /* Button ------------------------------------------------*/ - .button { - float: right; - margin: 15px 15px 15px 0; - padding: 7px 10px 8px 10px; - color: #ccc; - font-size: 14px; - font-weight: bold; - text-align: center; - text-shadow: 0 -1px 0 black(.3); - border-radius: 5px; - border: 1px solid black(.4); - box-shadow: inset 0 1px 0 white(.08), 0 1px 0 white(.05); - cursor: pointer; - - &:first-of-type { margin: 15px 5% 18px 0; } - - &.active { - color: #fff; - box-shadow: inset 0 1px 0 white(.08), 0 1px 0 white(.1), 0 0 4px #005ecc; - } - - &:hover { background-image: linear-gradient(to bottom, rgb(60, 60, 60), rgb(57, 57, 57)); } - - &:active, - &.pressed { background-image: linear-gradient(to bottom, rgb(57, 57, 57), rgb(60, 60, 60)); } - } - - /* Input ------------------------------------------------*/ - input.text { - float: left; - width: calc(100% - 10px); - padding: 17px 5px 9px 5px; - margin-top: 10px; - background-color: transparent; - color: #fff; - text-shadow: $shadow; - border: none; - box-shadow: 0 1px 0 white(.1); - border-bottom: 1px solid #222; - border-radius: 0px; - outline: none; - } - - input.less { margin-bottom: -10px; } - - input.more { margin-bottom: 30px; } - - .copylink { margin-bottom: 20px; } - - /* Radio Buttons ------------------------------------------------*/ - .choice { - float: left; - margin: 12px 5%; - width: 90%; - color: #fff; - - input { float: left; } - - h2 { - float: left; - margin: 1px 0 0 8px; - color: #fff; - font-size: 14px; - font-weight: 700; - text-shadow: 0 -1px 0 black(.3); - } - - p { - margin-top: 2px; - padding: 0 5% 0 25px; - color: #aaa; - font-size: 13px; - } - - p input { - width: 100%; - padding: 10px 1px 9px; - margin-top: 10px; - } - } - - /* Version ------------------------------------------------*/ - #version { - display: inline-block; - margin-top: 23px; - margin-left: 5%; - color: #888; - text-shadow: 0 -1px 0 black(.3); - - span { display: none; } - - span a { color: #888; } - } - -} - -/* Sign in ------------------------------------------------*/ -.sign_in { - - float: left; - width: 100%; - margin-top: 1px; - padding: 5px 0; - color: #eee; - font-size: 14px; - text-shadow: 0 -1px 0 black(.3); - line-height: 20px; - - /* Input ------------------------------------------------*/ - input { - float: left; - width: 88%; - padding: 7px 1% 9px 1%; - margin: 0 5%; - background-color: transparent; - color: #fff; - text-shadow: 0 -1px 0 #222; - border: none; - border-bottom: 1px solid #222; - box-shadow: 0 1px 0 white(.1); - border-radius: 0; - outline: none; - - &:first-of-type { margin-bottom: 10px; } - - &.error:focus { box-shadow: 0 1px 0 rgba(204, 0, 7, .6); } - } - } \ No newline at end of file From b84ab4fd2ca25a50af6879f04bba8e777a6f0cd9 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 00:21:25 +0100 Subject: [PATCH 048/190] Rebuild --- dist/main.css | Bin 47687 -> 44180 bytes dist/main.js | Bin 173898 -> 173564 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.css b/dist/main.css index 4e411fa3ee9ca179cf85423034d616afa1f11d5a..3dfb498e897f8f55bce536aafac5825e90e38511 100644 GIT binary patch delta 32 qcmV+*0N?+|^a7OG0b*U8nSz8>3!w3$vp zz+yC;!k6-pK&4bdY(Sv0nazk5><}Z(W)>sCFMtJmxPIK&X-AQg=swPO?m6fC+W+>v z``YvJX!}RGfjtjCwR0f0?`*tpzwO&A&$1<>hNtNj>^6*fxc2KXj9stn)5OYxMC>YV z>Iy<=QHBSPHBm#zX;x+pw?=HKfh}K`R4ujSQ%9F3G^YtCmyd3YuiebR^C!3W#6<+z zY)}ukz*rYED*Um28NRINF7REaWi_bb>j7@%DyjN)eF7DDwE$XS#T}zsC3a0$RHrFu z1wmoeDkg1ESI=XN;nmYY*mXLaDZzCZ*dAlUD&&Sbbp)f8y6{(S2)@DCCB7}s%=tdG zV=^wO)%}=*9@Gj8Mqj8y=0vd0bP&o38Phc3!(;)@?b;2RlVgN_SsQ}aQzC4v`T&zGnr`ST8LMaoA!g157B0`q1Qb=fd|as~58 zT9#Frp-suF8&!H$C$@)u0SQb@0l}Mf^42Ky-XDM$*&Ry>U1B?P ze%LOtOgZ?+g>c0>DxQW518W$4OTc{276uj9Eu? z6f`6f)Kp6vhEcJo?Moh6z`9aOtJlGc8Am-I*x5m3<}wchVw-*Jk}l7tmq(}#Yc~## zhpbqk_+8PQ(h7V?l*?uKJUOnUU&ikXo@3apD)AgP3w4{?IMFT-3#%i&vPWw6G_m1g zX81@v2*X^ZWC&u1c)2Yz=~Rrc#irQZayfZ^I9Cd(x9dz|c-8D@2`>JSS5*~mX9wWV zTl=>K|Novk+@px_C_8d~krR!|{O=s$VU04~MN7u6%f^yL%{i|H+512Bp<_itRNpDYI#JHPrdc$HyiS4FK z828&wfB%T_>GU~w8M&w1Ol0KP{^&8|e%b9J%uG9Yxsno#Gn0MuQxbEwUlw2zWSnj| zkx^K>02t-v`9&#uWr;bZskXT(rW*O0IwcyKnpV>fd}NfH?k~jT$EB06lWD7@WSwU_ zeU%WCEVE9&?evLv8O6Z1OnZ;vWsl4WG% L+FoAFblDgH%p=5+ delta 1064 zcmb7@&ubGw6vvqXTZy%{X{xnS+ziF+(#a;VheEp>6cGv*R49tXRkyp7bm?TK?rvI2 z6YD?VNpNm8ZSkZ~58@sa#8W}Vi+_Rb$%Eh@AmZjn(}Yq%SeBjTec$)J&wKOxbL7+4 z$m2I)Z(aOY2Qxidp1Z{?!tR)kgjof#ZjG9Agl5H)Dj4abj^`6QAzAapS|D~-e5`^A z0X9HP{CN&~k87!B^k@|*JzC0kmX1m`*3u>pWS2I;#J^=Dkww$;(mo{VtFFBqwM~Uh= z1?Gf`a=FOYT28W3Ins=p|KXK6%IlC7vbfmU1-qaaZ0~_DBZIZR_0_QU$yzg&1_<%% z7K}Z;{;F%5mCG{Ib2-$}cg4Vm{uoLVVwg+Mv9SMK#=tCmg^wYsKfzF{PA6pRV}?0) z6a|mU2eWY4V##k%PFnL0wZ-=xFqml@jo!w-MOv>F-kwOjrEunabHexe5^<@yf)v#y z#qbb9$K&aAunge)likgzKtBchfiU~vxu{H6!lfrURNy{GhK!K73*c}ZUAC-nYb2X6 zhuErg+vThv?eAzDDMIwYn`={bTvwS-+zw{@fog&HH3Ui>;uVuwgd*JOX&6nG-aKEH zk!DI(xDTG5a4gP}lv@jltd=sfQr$+n(Yz-JqggTA4<7)jb|+$D`x@*LbQ+#{7KH;R jP)I$Q$)s^S6FiE-m3uH!5wAHs9rQkg!yr&x_-*_zG4E=R From 68893ae402c19e6f88f2fa8da674cea08e9e1673 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 00:34:08 +0100 Subject: [PATCH 049/190] Fixed photo badge not updating --- src/scripts/album.js | 3 +-- src/scripts/build.coffee | 8 ++++---- src/scripts/view.js | 10 +++++----- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/scripts/album.js b/src/scripts/album.js index b3a4244..d598cd5 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -447,8 +447,6 @@ album.setPublic = function(albumID, e) { } - params = 'setAlbumPublic&albumID=' + albumID + '&password=' + password + '&visible=' + listed + '&downloadable=' + downloadable; - if (visible.album()) { album.json.public = (album.json.public==0) ? 1 : 0; @@ -461,6 +459,7 @@ album.setPublic = function(albumID, e) { } + params = 'setAlbumPublic&albumID=' + albumID + '&password=' + password + '&visible=' + listed + '&downloadable=' + downloadable; lychee.api(params, function(data) { if (data!==true) lychee.error(null, params, data); diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index d052571..f1d96b9 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -59,8 +59,8 @@ build.album = (data) -> if lychee.publicMode is false - if data.star is '1' then html += "#{ build.iconic('star') }" - if data.public is '1' then html += "#{ build.iconic('eye') }" + if data.star is '1' then html += "#{ build.iconic('star') }" + if data.public is '1' then html += "#{ build.iconic('eye') }" if data.unsorted is '1' then html += "#{ build.iconic('list') }" if data.recent is '1' then html += "#{ build.iconic('clock') }" @@ -94,8 +94,8 @@ build.photo = (data) -> html += "
" - if data.star is '1' then html += "#{ build.iconic('star') }" - if lychee.publicMode is false and data.public is '1' and album.json.public isnt '1' then html += "#{ build.iconic('eye') }" + if data.star is '1' then html += "#{ build.iconic('star') }" + if lychee.publicMode is false and data.public is '1' and album.json.public isnt '1' then html += "" html += "
" diff --git a/src/scripts/view.js b/src/scripts/view.js index c3dce58..01b6821 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -205,15 +205,15 @@ view.album = { star: function(photoID) { - $('.photo[data-id="' + photoID + '"] .icon-star').remove(); - if (album.json.content[photoID].star==1) $('.photo[data-id="' + photoID + '"]').append(""); + $('.photo[data-id="' + photoID + '"] .iconic-star').remove(); + if (album.json.content[photoID].star==1) $('.photo[data-id="' + photoID + '"]').append("" + build.iconic('star') + ""); }, public: function(photoID) { - $('.photo[data-id="' + photoID + '"] .icon-share').remove(); - if (album.json.content[photoID].public==1) $('.photo[data-id="' + photoID + '"]').append(""); + $('.photo[data-id="' + photoID + '"] .iconic-share').remove(); + if (album.json.content[photoID].public==1) $('.photo[data-id="' + photoID + '"]').append(""); }, @@ -253,7 +253,7 @@ view.album = { if (album.json.public==1) { $('#button_share_album a').addClass('active'); $('#button_share_album').attr('title', 'Share Album'); - $('.photo .icon-share').remove(); + $('.photo .iconic-share').remove(); if (album.json.init) $('#infobox .attr_visibility').html('Public'); } else { $('#button_share_album a').removeClass('active'); From f9d753395a9a0edc3744f95c211bc85ecee1529f Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 00:35:30 +0100 Subject: [PATCH 050/190] Auto-focus password input when sharing album --- src/scripts/album.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/album.js b/src/scripts/album.js index d598cd5..2236f48 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -423,7 +423,7 @@ album.setPublic = function(albumID, e) { $('.basicModal .choice input[name="password"]').on('change', function() { - if ($(this).prop('checked')===true) $('.basicModal .choice input[data-name="password"]').show(); + if ($(this).prop('checked')===true) $('.basicModal .choice input[data-name="password"]').show().focus(); else $('.basicModal .choice input[data-name="password"]').hide(); }); From 12b8b5f19c1c0fe1e0b848e6ed21936e6a3044ba Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 01:03:34 +0100 Subject: [PATCH 051/190] Removed legacy modal-system build fn --- src/scripts/build.coffee | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee index f1d96b9..fa3b3df 100644 --- a/src/scripts/build.coffee +++ b/src/scripts/build.coffee @@ -149,35 +149,6 @@ build.no_content = (typ) -> return html -build.modal = (title, text, button, marginTop, closeButton) -> - - if marginTop? then custom_style = "style='margin-top: #{ marginTop }px;'" - else custom_style = '' - - html = """ -
-
-

#{ title }

- """ - - if closeButton isnt false then html += "" - - html += "

#{ text }

" - - $.each button, (index) -> - - if this[0] isnt '' - - if index is 0 then html += "#{ this[0] }" - else html += "#{ this[0] }" - - html += """ -
-
- """ - - return html - build.uploadModal = (title, files) -> html = """ From 330b16a4b8d7a55fdf01edfe139bb637115c2076 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 01:04:12 +0100 Subject: [PATCH 052/190] Updated context icons (WIP) --- src/scripts/contextMenu.js | 48 ++++++++++++++++++------------------ src/styles/_contextmenu.scss | 11 ++++++++- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index c4415c1..aa4c302 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -8,13 +8,13 @@ contextMenu = {} contextMenu.add = function(e) { var items = [ - { type: 'item', title: 'Upload Photo', icon: 'icon-picture', fn: function() { $('#upload_files').click() } }, + { type: 'item', title: build.iconic('image') + 'Upload Photo', fn: function() { $('#upload_files').click() } }, { type: 'separator' }, - { type: 'item', title: 'Import from Link', icon: 'icon-link', fn: upload.start.url }, - { type: 'item', title: 'Import from Dropbox', icon: 'icon-folder-open', fn: upload.start.dropbox }, - { type: 'item', title: 'Import from Server', icon: 'icon-hdd', fn: upload.start.server }, + { type: 'item', title: build.iconic('link-intact') + 'Import from Link', fn: upload.start.url }, + { type: 'item', title: build.iconic('box') + 'Import from Dropbox', fn: upload.start.dropbox }, + { type: 'item', title: build.iconic('terminal') + 'Import from Server', fn: upload.start.server }, { type: 'separator' }, - { type: 'item', title: 'New Album', icon: 'icon-folder-close', fn: album.add } + { type: 'item', title: build.iconic('folder') + 'New Album', fn: album.add } ]; basicContext.show(items, e); @@ -46,8 +46,8 @@ contextMenu.album = function(albumID, e) { if (albumID==='0'||albumID==='f'||albumID==='s'||albumID==='r') return false; var items = [ - { type: 'item', title: 'Rename', icon: 'icon-edit', fn: function() { album.setTitle([albumID]) } }, - { type: 'item', title: 'Delete', icon: 'icon-trash', fn: function() { album.delete([albumID]) } } + { type: 'item', title: build.iconic('pencil') + 'Rename', fn: function() { album.setTitle([albumID]) } }, + { type: 'item', title: build.iconic('trash') + 'Delete', fn: function() { album.delete([albumID]) } } ]; $('.album[data-id="' + albumID + '"]').addClass('active'); @@ -61,8 +61,8 @@ contextMenu.albumMulti = function(albumIDs, e) { multiselect.stopResize(); var items = [ - { type: 'item', title: 'Rename All', icon: 'icon-edit', fn: function() { album.setTitle(albumIDs) } }, - { type: 'item', title: 'Delete All', icon: 'icon-trash', fn: function() { album.delete(albumIDs) } } + { type: 'item', title: build.iconic('pencil') + 'Rename All', fn: function() { album.setTitle(albumIDs) } }, + { type: 'item', title: build.iconic('trash') + 'Delete All', fn: function() { album.delete(albumIDs) } } ]; basicContext.show(items, e, contextMenu.close); @@ -72,7 +72,7 @@ contextMenu.albumMulti = function(albumIDs, e) { contextMenu.albumTitle = function(albumID, e) { var items = [ - { type: 'item', title: 'Rename', icon: 'icon-edit', fn: function() { album.setTitle([albumID]) } } + { type: 'item', title: build.iconic('pencil') + 'Rename', fn: function() { album.setTitle([albumID]) } } ]; lychee.api('getAlbums', function(data) { @@ -108,13 +108,13 @@ contextMenu.photo = function(photoID, e) { // in order to keep the selection var items = [ - { type: 'item', title: 'Star', icon: 'icon-star', fn: function() { photo.setStar([photoID]) } }, - { type: 'item', title: 'Tags', icon: 'icon-tags', fn: function() { photo.editTags([photoID]) } }, + { type: 'item', title: build.iconic('star') + 'Star', fn: function() { photo.setStar([photoID]) } }, + { type: 'item', title: build.iconic('tag') + 'Tags', fn: function() { photo.editTags([photoID]) } }, { type: 'separator' }, - { type: 'item', title: 'Rename', icon: 'icon-edit', fn: function() { photo.setTitle([photoID]) } }, - { type: 'item', title: 'Duplicate', icon: 'icon-copy', fn: function() { photo.duplicate([photoID]) } }, - { type: 'item', title: 'Move', icon: 'icon-folder-open', fn: function() { basicContext.close(); contextMenu.move([photoID], e); } }, - { type: 'item', title: 'Delete', icon: 'icon-trash', fn: function() { photo.delete([photoID]) } } + { type: 'item', title: build.iconic('pencil') + 'Rename', fn: function() { photo.setTitle([photoID]) } }, + { type: 'item', title: build.iconic('layers') + 'Duplicate', fn: function() { photo.duplicate([photoID]) } }, + { type: 'item', title: build.iconic('folder') + 'Move', fn: function() { basicContext.close(); contextMenu.move([photoID], e); } }, + { type: 'item', title: build.iconic('trash') + 'Delete', fn: function() { photo.delete([photoID]) } } ]; $('.photo[data-id="' + photoID + '"]').addClass('active'); @@ -132,13 +132,13 @@ contextMenu.photoMulti = function(photoIDs, e) { multiselect.stopResize(); var items = [ - { type: 'item', title: 'Star All', icon: 'icon-star', fn: function() { photo.setStar(photoIDs) } }, - { type: 'item', title: 'Tag All', icon: 'icon-tags', fn: function() { photo.editTags(photoIDs) } }, + { type: 'item', title: build.iconic('star') + 'Star All', fn: function() { photo.setStar(photoIDs) } }, + { type: 'item', title: build.iconic('tag') + 'Tag All', fn: function() { photo.editTags(photoIDs) } }, { type: 'separator' }, - { type: 'item', title: 'Rename All', icon: 'icon-edit', fn: function() { photo.setTitle(photoIDs) } }, - { type: 'item', title: 'Duplicate All', icon: 'icon-copy', fn: function() { photo.duplicate(photoIDs) } }, - { type: 'item', title: 'Move All', icon: 'icon-folder-open', fn: function() { basicContext.close(); contextMenu.move(photoIDs, e); } }, - { type: 'item', title: 'Delete All', icon: 'icon-trash', fn: function() { photo.delete(photoIDs) } } + { type: 'item', title: build.iconic('pencil') + 'Rename All', fn: function() { photo.setTitle(photoIDs) } }, + { type: 'item', title: build.iconic('layers') + 'Duplicate All', fn: function() { photo.duplicate(photoIDs) } }, + { type: 'item', title: build.iconic('folder') + 'Move All', fn: function() { basicContext.close(); contextMenu.move(photoIDs, e); } }, + { type: 'item', title: build.iconic('trash') + 'Delete All', fn: function() { photo.delete(photoIDs) } } ]; basicContext.show(items, e, contextMenu.close); @@ -148,8 +148,8 @@ contextMenu.photoMulti = function(photoIDs, e) { contextMenu.photoMore = function(photoID, e) { var items = [ - { type: 'item', title: 'Full Photo', icon: 'icon-resize-full', fn: function() { window.open(photo.getDirectLink()) } }, - { type: 'item', title: 'Download', icon: 'icon-circle-arrow-down', fn: function() { photo.getArchive(photoID) } } + { type: 'item', title: build.iconic('fullscreen-enter') + 'Full Photo', fn: function() { window.open(photo.getDirectLink()) } }, + { type: 'item', title: build.iconic('cloud-download') + 'Download', fn: function() { photo.getArchive(photoID) } } ]; // Remove download-item when diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index 3c1d705..810a847 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -26,7 +26,7 @@ } tr td { - padding: 7px 25px 6px 12px; + padding: 6px 25px 7px 12px; min-width: auto; color: white(1); border-radius: 0; @@ -46,6 +46,15 @@ margin: 0 0 3px 26px; } + tr td .iconic { + display: inline-block; + margin: 0 10px 0 0; + width: 11px; + height: 10px; + fill: white(1); + filter: drop-shadow($shadow); + } + /* Link ------------------------------------------------*/ input#link { width: 100%; From 89dacb31f4d54b8d75233866bcfd7e1fd92bb35e Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 30 Jan 2015 01:04:20 +0100 Subject: [PATCH 053/190] Rebuild --- dist/main.css | Bin 44180 -> 44379 bytes dist/main.js | Bin 173564 -> 173343 bytes dist/view.js | Bin 93517 -> 93143 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.css b/dist/main.css index 3dfb498e897f8f55bce536aafac5825e90e38511..d71e3127bf1227805c6500662b1e30b0b3868313 100644 GIT binary patch delta 97 zcmbPolj-&?rVXpyxXcPF6pT!Pg!$$zZVMTCONtaqQWW$ulk@X3lP521meH{?P%tzA xDlkwmurAL`Dao)hG%TpF&PdHn&nU41Nm-|5=Hyr@r=_J$7Hmo0?B?N@0syo*A}Ig> delta 30 lcmcb8i)qSDrVXpyxXcSG6pT!PgxTgTZVMSV%Xr$S0071^3%>vW diff --git a/dist/main.js b/dist/main.js index e598bf7326b461f88f52cb21d8fc7864a162befb..4cdf5abedc7e269f5b1acd6bac31f2788bb49296 100644 GIT binary patch delta 1192 zcmah}-%Aux6z1I0bXVv_-AycJ*Mzlo6pV^Ws3`g&DU$UhJU86_njZ}=acW*N8iKO zAkWr!B@8u_j&z*E^;tM&tFtf;c=9Q<;_w{!uzwC#@p~Qykc7y2yYB`3u4{{BG#2mD zR72O)NLWiMBQ)F*4c|#ILy1d+qlRT*Y#xSAh(M<4W3r}OifTFV8_ASmT2jI^lG085 zIuCNAh>sarjzcIwGjw#keHD$Se%*;et=F$msl*5 zw6_ZoJAl29NU-)6)s-a03u_R-tqrKh$ptuaRHU#>B|YjeT%n9wF1QIBZ1Cgf1t_{a zz8xOU&njGXc&!XUj~oxzUV_VaZ+}VlvJJl=AZkimifd{JQzZ!Dw?$}a77>;*;%L5& zDQsfUFG3BjzJZ|U@ja)?NHw9Q$On151kr!mQ|05v zYuz5TixT!RUL~F>Lz^VxMe{C{7hup+&iy*iwMZDSp%U-5mt{2qeXu>y?|QIg7xOk9o|6S}jWZVz|A-4@!p6?plUXevgtg!*^3 zT6Rj0AEtR delta 1385 zcmaizPiPcL6vlZax=sv6C5ba8l1@c46J|z}J**n1CyGH)QN-xUKTvj8GL1c5O?S`e zsLSeAMB?i5HXwR1?j96kh}xQ%h=&|h5HEW3pzJ~Rpu0ywmaU#iG;N|@nyOd7_r3SM z>bm-*>f_U@)3+f#2%UKT8mz>cL5TWC2cZb~_z&2Pudl;fZ0RF0zx_{$MVje;+Z0S! z_T+>oXv)xp)k%YI+BP(=;BYi=K~FW^p0|bLDZP%!V`&l^@ZVdoIvoCC1XkmgVQ6ca zNh>|vDRL(yozr#veHb?3o<~r6y|6v%8%!|^!++uki%ICV_;d5V> zyK)C=W3-!_+zTU~!`xiJ)Zt%uV6t&aM%iqdb4oSg-*+Lpa!P6zHbZW`4=29bl`kvK zBlWb$V`0m#4B*mnsK=U@5W(tEh}F}5tj`T~@zVr!;Q29V{Ko8L8+B;EfNFd@2KQH#EzO!s z$ksx9^#G!=z}75q+S!h8-$Z#r(pUs9k3+QSv%6V>A%`?lHWxsj4DS5SWlsBBgj;;b z;C~bFV+-9{FwHsMg2P?o1W)(MQ~YNH8u7*?M6v%N)W&JIIA#S;D0GpU;b-@PLU0@ zxa|U2hC>fvVUVx@&-RlC%=*}kI!8s2P-joyx6b1MAptUt%UtMNQ@`V1@W3A~`Bv#K_Cw6-SPq)PGG0BQY& zwxxni#+INLfO3&qwT3e-m#|X31xxb`VI_Fm$x7FhN)0b(xChz~b;-fGP} diff --git a/dist/view.js b/dist/view.js index 469a7ce1748bc03372ff2b16156ec18a413b0e99..5b46527015ed47fabb684637077775a9e858833d 100644 GIT binary patch delta 401 zcmX?mi}m_-)(zeYjJ}h76nYpvH{VpaA_An=nJ(sM_SNy+9O9ZJ2$b9&)*!jV!}x7|HoLaCOOv1tma*VEK&H z#1ycO3|r65+-D~;ad?(QC&t#)cy3;DUV{T@>)Gp5SQvdbC*3Ksm-5x{1v)rNFEJ~z zA~?0ABr`9)SW~A&)5>@HJ88z7jGo(1$S@k|@cQQ2rs`z{mZla}>Ud6P_hhtI@XP}$ zR8xZq+uGVjsi|qexxU+zJQ=t1aw=pd=jj%gBoa@dpfDwN&n{>)%EGNsEky0NpP_uqU{HMO~;85w}d^}aTrN#Q@3jKB`F#?1*hFKZnX0WoWoe91Q%chisewx1CV(htup`m zCQ`2cHHyW!WNrc~MH&~^`Sf(5wp_$%md1sPp;GM_A+cq65=|5Azt}|aXRy@J6dC}^ z5Cox~&oFA$l3d+taw}XzlBJ%Er^Xn1$eQh~Wj9JtnT4OkO1MA|M>CsJ3a(J7Yq3Pw lbqt5SX%Qat4|)#R|3EEaSCs72@ofI0iB1PUAEU1`e*k}X=t=+p From 75a5605049d7527e0168ef68e26ea2669a802a36 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 00:29:27 +0100 Subject: [PATCH 054/190] Updated basicModal --- src/bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bower.json b/src/bower.json index 3dbdfcc..13a28eb 100644 --- a/src/bower.json +++ b/src/bower.json @@ -6,6 +6,6 @@ "js-md5": "~1.1.0", "mousetrap": "~1.4.6", "basicContext": "~2.0.2", - "basicModal": "~2.0.2" + "basicModal": "~2.0.3" } } From 2d7aa7e247d4c9679647a07091441b2b777188fe Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 00:29:44 +0100 Subject: [PATCH 055/190] Improved icon padding in context --- src/styles/_contextmenu.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index 810a847..778d9e4 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -48,7 +48,7 @@ tr td .iconic { display: inline-block; - margin: 0 10px 0 0; + margin: 0 10px 0 1px; width: 11px; height: 10px; fill: white(1); From f8bf8df5cc67c98c5b025dd7b59f5234f25aff05 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 00:30:47 +0100 Subject: [PATCH 056/190] New dialog for upload, removed unused code --- dist/main.css | Bin 44379 -> 43041 bytes dist/main.js | Bin 173343 -> 172970 bytes dist/view.js | Bin 93143 -> 93003 bytes src/scripts/build.coffee | 9 +- src/scripts/init.js | 1 - src/scripts/lychee.js | 2 - src/scripts/upload.js | 209 +++++++++++++++++++----------------- src/styles/_mediaquery.scss | 30 +----- src/styles/_message.scss | 79 +++++++++++++- src/styles/_upload.scss | 125 --------------------- src/styles/main.scss | 7 -- 11 files changed, 190 insertions(+), 272 deletions(-) delete mode 100644 src/styles/_upload.scss diff --git a/dist/main.css b/dist/main.css index d71e3127bf1227805c6500662b1e30b0b3868313..bd59564846587f6a719f936476d7253f6f6a102e 100644 GIT binary patch delta 334 zcmcb8i)rBnrVRxen`djhm1j0AsMy@;vDkmIo&@jYe0eqzy^PG1l+?WHl+5CSoWx42 zy!^b>&GIvBIQaCE5{omFee+Wia}+WRC;KysPoBCsiqUBDhsC0k|4DI)D(DsEmls#( zCKjb<=2;miSQJz!SWKQjUv#qUQUgYl$$m?tRZKK%k<9_?0PCwx%gIkHvC2tJE1CRk zsng{7(|9IZEVJW6SUS07Sqn0E!wQkjTFWaKQN?6XxuTQbuh2&olA7$cQUFy5q>4i_ wIX@@A$V%BLF~!ut0NI(7=dD~iIeJ0)E6|4lk|a4DoUSMF^+gb(iqn~QHJ24Hljd^uKP zMT*R-Njz3W&vb`6xRz*x%k(LB1qfrc5jg0N!2a{GNG5Kqsl+jHMNev)_BYnXo`+!N zW*Elrhu=KtpPtKTtYX;6%@ap$5mHmB%n>B1smXZ}1iv<>LAiT+Xf7+yY%FEU1CKT) z&u1y;)Sit6p3-;52Q@`xQ(}SyFo^ao#9{B%=!GR_AcxpU4n%d3jdfeJvBcna_3LoA zu@>1ph9@8SOge6GT;VDzlDwn0M|!-gJXR99BK0u5b`{XpPTkN9m*fjv*9?YClQ?-j znG{@-bK-MN+MIEksWDV;n*>31%bX8Q%m0V9mFiPYW|4~ve$R$)e z$t=t2jdN+)t6E}slxSEA_|mh4{%Sl!Qp+&m$KJ!`=Y= zsb3%JD55*Knax{4sI>Va2rV|wHAl88pt7BfRY_4ZiP^ z^+abFNB*-&1)IL$GBJ5U+GN597H~^C0krKCU8+b^`~|brHLPiAtkn(ygB!kX diff --git a/dist/main.js b/dist/main.js index 4cdf5abedc7e269f5b1acd6bac31f2788bb49296..3870557ec70481f8350dc364365e4cc295f29f39 100644 GIT binary patch delta 1920 zcma)6Yitx%6wbM&V7H~E&bN!Bqk`Mj!_d)VtgdV7$4F2BoYzplXa8HCXRAD**>gPms~~0_n7;!w>$3VAA!4ms*=+BvUj>l2ziOxj%p70P z2T`lN@c?$d*LW4$c?;iPlJF~%DN%_@syJ0t%um%uurq!TzB^ZOkSUO4lS98Ac$)w zULv^tOzQYNBy>DK?jl>G$LC@4DdR(AX-$=ek>u;8IFh_%%UUetw|EG4m$p98O=6}6 z@n*~WtM}){sN&k6523A{=|j76=8B5n zZdo(4=-qLm6YVo6md;NE3q@u!b6Y_{r9V7Dp|z4KT+5hd1P!^!bbSLWgcH`LlZTN< z+w74!i22Xo^B#yeDnNf7KKIUtH)=$yTSr`!9g0o{8%+v@P4Tn1WdO}$#g5KEZSiB=7w(4XQ5rNA!}Kd+S64-=pqx`=O-Yx_K8^40ft`@& z?Y%f4?_AppFXG8`&a4I#&w*pE0r#XjZ{G}n-`#n46sn;vhTzPhSlHJ)kmsL|;m!zG z;;;dEz8r@=)wOO((p(eaqcW6m!3Q$jjsrHNVVJaO5@JGuec?#CTtZ~!vRW=D{iY~s z{Dlm3ki5iCZ-mZ0S*XFcJXu)LN|d0p@>U3~;61NFeM>sttbie3ZX+poQIkqD z%&o3Yv6AT>*@o&V{1+SA_|rCYR(hHziwc!U$>0Wqj)x>9`>0d_6{5 z;or$lM;s^K3z94N&IB0>o}1_m7TKgBi0AH@pNdk4UpTMl#R+l>+N4a0R>1kiDTaRq zWwa-b|A}d-RMhz?g{-MkGk&h8NE`3n4U2&CyHZ35(ylHcU&so+aM*PVcq;yOvufra zcT!0eDn9=#MQ#GdLoylkvGZ4MNfy0y@ZZ4r%NeqqAC$>We71`$;w@=%CqH!(mQ?F1 z)dYU>Qqs=r6tbOr^JJX=h9IlMqwzt?H)Tk~NB`gaZ!=_q&y=B-w;hEB-kv4_XM2_m zKxMx3S&ke5KA0l)*8DFo>SN)aL3Xtg)D@aFbAv1p5NRN+jIwyp1r@-M0VN<@9YSx6I)6MwQs8WUgdD8-3%j6;S^xk5 delta 2419 zcma)7Z)_9i8Q1dyNo^C76lfAk;Cuwf*IaBT0oo>ULSzRO8dKCnYe!<7vwgPDciijU zokO!YYgLU+qZ?B3;H|2`%9oa+Nzj_@rmoWZXZ^EE(=>Ja)U8^jsU3_a8V-tPz4-znf7kpVuJw2SzAfsPMN8C0Dk{R9AzMX5=XCi97p*Mb zeHuWm{Aj~?6XYwObbQu~kKgXv0FbDBeE+Xp5Uo5vav306{%+(Ebp99_cAO2PUXLn9 z#Jm_26JoTod$heCdmS26klXuXKdg&{t$<>(LJMrH(AXC2Q9iyu;8HC?5ch|@k;*&! zk2PWNK;ji#$#eus?3w;0fqdmg@=84pbR~btVYXL`*JJP{^Fy4nJXajWA>S;HL#jL*6cgoAv{{>fpn?(Z2`8>^~Fg?XVrR(|So zzbk?P6m>XXdHeEtz@GX)RzqXLZ{-wI^oE3aF{h-eX<%k|M%Z{H{@*vpl>ZcPdC6@9#GkI8_a=f|G5oL z+=VXX;k`yxpX`bIeA;AhJRAKn%Yx5W z)hdw6$thJ%mrC9Udo~2mK#aBbV1bzZP!Ie9zfAka2w3?GtcBWOyHca#o^Q%kCPH3&XQ-7DJWutKcwJkEHIIVQL;HA zA}18s8_t(XMPybgDW#I+w*)c5ex8925);{%kHPj+S#aSlcNTWE*t@?2!5v%pNKVqT zGB-xEiq4Blit7EmvvwCv*qbAa=#cQ6O{~Mh2G%gMKy&?AHBHUuU`57mJVZuU2Aw)P*og!gUV&yGCCH`~ zF&n|x!7Yds2b3p6an_V154%JqJQ*KQGJXbGvc6poXo{}-e6?plll82X8|oA05JB0A zB;j{apO4QMvOEgnm<9c|nN>2kqDSOpp=t{^{}t>Epi(47c7nnlNRff9ikK(y?qf1p3 zpzNLuiEO1`kMIi_A}t|2VDHJ2ez2d;k^caD^HH*%b@dSsOKRl7J+~F0!d!+L{u#;O zlyGQ38KgJ0A5glw1idRvCzW{h-E{FHFFIa$PL~eL{b;gx^JM(%(wkPvo+b32?U~2F z(fs_f!xFyDOBUv2ycxZr;X7}Lojpv}5BB@-L=tpHHZ*CL7XpTS7@deFnWmr5NNIVm zj?t9k(SnpxtXW_9Q z{gy%A+5Ti&nc-4S{cz{aV|BATS8LZfG^M)+zlyqbkECSXl8q|LHJIxe;=AN7elUm@ x?sE-Fw~AM98?Jf_*M_Rzi=D2a!Jt%y+NYi)NvOv?LF~p}P+_AD&y$y3{{uDzINJaK diff --git a/dist/view.js b/dist/view.js index 5b46527015ed47fabb684637077775a9e858833d..293a8e7010da33443d960c854b8da6738ca56ce1 100644 GIT binary patch delta 39 ucmcb9o%QrJ)`l&N8VURvhIUHYsoF|5`ao7p-u4X%j7f~!Rg)MuaRLAzNDVCj delta 181 zcmX?ojrIC<)`l&N8VU6&nPm#eIf=!^w(6w?Ir)hx@%d$`MLCI;3TcTcsh)Z2b}@OJ zHkhh%Q;Ule(^D0aQ}aqvi@>TlZ88k)l(bW|m2C8ZETBG4n?#u5$vOGOsS26N`FXlU sskuNqbc-|7^VB)*Z1fYsO1GOQFeWhy1NG build.uploadModal = (title, files) -> html = """ -
-
-

#{ title }

- -
+

#{ title }

+
""" i = 0 @@ -185,8 +182,6 @@ build.uploadModal = (title, files) -> i++ html += """ -
-
""" diff --git a/src/scripts/init.js b/src/scripts/init.js index 1ab6a59..3cabc06 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -163,7 +163,6 @@ $(document).ready(function() { /* Upload */ .on('change', '#upload_files', function() { basicModal.close(); upload.start.local(this.files) }) - .on(eventName, '.upload_message a.close', upload.close) .on('dragover', function(e) { e.preventDefault(); }, false) .on('drop', function(e) { diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index b66e513..08bbf02 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -88,7 +88,6 @@ lychee.api = function(params, callback) { if (typeof data==='string'&& data.substring(0, 7)==='Error: ') { lychee.error(data.substring(7, data.length), params, data); - upload.close(true); return false; } @@ -110,7 +109,6 @@ lychee.api = function(params, callback) { error: function(jqXHR, textStatus, errorThrown) { lychee.error('Server error or API not found.', params, errorThrown); - upload.close(true); } }); diff --git a/src/scripts/upload.js b/src/scripts/upload.js index b64d813..349ebf5 100755 --- a/src/scripts/upload.js +++ b/src/scripts/upload.js @@ -7,11 +7,17 @@ upload = {} upload.show = function(title, files, callback) { - upload.close(true); - - $('body').append(build.uploadModal(title, files)); - - if (callback!==null&&callback!==undefined) callback(); + basicModal.show({ + body: build.uploadModal(title, files), + buttons: { + action: { + title: 'Close', + class: 'hidden', + fn: basicModal.close + } + }, + callback + }); } @@ -53,13 +59,13 @@ upload.start = { if (error===false) { // Success - upload.close(); + basicModal.close(); upload.notify('Upload complete'); } else { // Error - $('.upload_message a.close').show(); + $('.basicModal #basicModal__action.hidden').show(); upload.notify('Upload complete', 'Failed to upload one or more photos.'); } @@ -118,21 +124,21 @@ upload.start = { if (xhr.status===200&&xhr.responseText==='1') { // Success - $('.upload_message .rows .row:nth-child(' + (file.num+1) + ') .status') + $('.basicModal .rows .row:nth-child(' + (file.num+1) + ') .status') .html('Finished') .addClass('success'); } else { // Error - $('.upload_message .rows .row:nth-child(' + (file.num+1) + ') .status') + $('.basicModal .rows .row:nth-child(' + (file.num+1) + ') .status') .html('Error') .addClass('error'); if (xhr.responseText.substr(0, 6)==='Error:') errorText = xhr.responseText.substr(6) + ' Please take a look at the console of your browser for further details.'; else errorText = 'Server returned an unknown response. Please take a look at the console of your browser for further details.'; - $('.upload_message .rows .row:nth-child(' + (file.num+1) + ') p.notice') + $('.basicModal .rows .row:nth-child(' + (file.num+1) + ') p.notice') .html(errorText) .show(); @@ -168,7 +174,7 @@ upload.start = { // Set progress when progress has changed if (progress>pre_progress) { - $('.upload_message .rows .row:nth-child(' + (file.num+1) + ') .status').html(progress + '%'); + $('.basicModal .rows .row:nth-child(' + (file.num+1) + ') .status').html(progress + '%'); pre_progress = progress; } @@ -177,10 +183,10 @@ upload.start = { // Scroll to the uploading file var scrollPos = 0; if ((file.num+1)>4) scrollPos = (file.num + 1 - 4) * 40 - $('.upload_message .rows').scrollTop(scrollPos); + $('.basicModal .rows').scrollTop(scrollPos); // Set status to processing - $('.upload_message .rows .row:nth-child(' + (file.num+1) + ') .status').html('Processing'); + $('.basicModal .rows .row:nth-child(' + (file.num+1) + ') .status').html('Processing'); // Upload next file if (file.next!==null) process(files, file.next); @@ -219,10 +225,12 @@ upload.start = { window.onbeforeunload = function() { return 'Lychee is currently uploading!'; }; - upload.show('Uploading', files); + upload.show('Uploading', files, function() { - // Upload first file - process(files, files[0]); + // Upload first file + process(files, files[0]); + + }); }, @@ -235,14 +243,13 @@ upload.start = { action = function(data) { - var params, - extension, + var extension, files = []; - basicModal.close(); - if (data.link&&data.link.length>3) { + basicModal.close(); + extension = data.link.split('.').pop(); if (extension!=='jpeg'&&extension!=='jpg'&&extension!=='png'&&extension!=='gif'&&extension!=='webp') { loadingBar.show('error', 'The file format of this link is not supported.'); @@ -255,30 +262,34 @@ upload.start = { } upload.show('Importing URL', files, function() { - $('.upload_message .rows .row .status').html('Importing'); - }); - params = 'importUrl&url=' + escape(encodeURI(data.link)) + '&albumID=' + albumID; - lychee.api(params, function(data) { + var params; - upload.close(); - upload.notify('Import complete'); + $('.basicModal .rows .row .status').html('Importing'); - albums.refresh(); + params = 'importUrl&url=' + escape(encodeURI(data.link)) + '&albumID=' + albumID; + lychee.api(params, function(data) { - if (album.getID()===false) lychee.goto('0'); - else album.load(albumID); + basicModal.close(); + upload.notify('Import complete'); - if (data!==true) lychee.error(null, params, data); + albums.refresh(); + + if (album.getID()===false) lychee.goto('0'); + else album.load(albumID); + + if (data!==true) lychee.error(null, params, data); + + }); }); - } else loadingBar.show('error', 'Link to short or too long. Please try another one!'); + } else basicModal.error('link'); } basicModal.show({ - body: "

Please enter the direct link to a photo to import it:

", + body: "

Please enter the direct link to a photo to import it:

", buttons: { action: { title: 'Import', @@ -302,10 +313,7 @@ upload.start = { action = function(data) { - var params, - files = []; - - basicModal.close(); + var files = []; files[0] = { name: data.path, @@ -313,27 +321,31 @@ upload.start = { }; upload.show('Importing from server', files, function() { - $('.upload_message .rows .row .status').html('Importing'); - }); - params = 'importServer&albumID=' + albumID + '&path=' + escape(encodeURI(data.path)); - lychee.api(params, function(data) { + var params; - upload.close(); - upload.notify('Import complete'); + $('.basicModal .rows .row .status').html('Importing'); - albums.refresh(); + params = 'importServer&albumID=' + albumID + '&path=' + escape(encodeURI(data.path)); + lychee.api(params, function(data) { - if (data==='Notice: Import only contains albums!') { - if (visible.albums()) lychee.load(); - else lychee.goto(''); - } - else if (album.getID()===false) lychee.goto('0'); - else album.load(albumID); + basicModal.close(); + upload.notify('Import complete'); - if (data==='Notice: Import only contains albums!') return true; - else if (data==='Warning: Folder empty!') lychee.error('Folder empty. No photos imported!', params, data); - else if (data!==true) lychee.error(null, params, data); + albums.refresh(); + + if (data==='Notice: Import only contains albums!') { + if (visible.albums()) lychee.load(); + else lychee.goto(''); + } + else if (album.getID()===false) lychee.goto('0'); + else album.load(albumID); + + if (data==='Notice: Import only contains albums!') return true; + else if (data==='Warning: Folder empty!') lychee.error('Folder empty. No photos imported!', params, data); + else if (data!==true) lychee.error(null, params, data); + + }); }); @@ -358,65 +370,60 @@ upload.start = { dropbox: function() { var albumID = album.getID(), - params, - links = ''; + links = '', + success; if (albumID===false) albumID = 0; + success = function(files) { + + for (var i = 0; i < files.length; i++) { + + links += files[i].link + ','; + + files[i] = { + name: files[i].link, + supported: true + }; + + } + + // Remove last comma + links = links.substr(0, links.length-1); + + upload.show('Importing from Dropbox', files, function() { + + var params; + + $('.basicModal .rows .row .status').html('Importing'); + + params = 'importUrl&url=' + escape(links) + '&albumID=' + albumID; + lychee.api(params, function(data) { + + basicModal.close(); + upload.notify('Import complete'); + + albums.refresh(); + + if (album.getID()===false) lychee.goto('0'); + else album.load(albumID); + + if (data!==true) lychee.error(null, params, data); + + }); + + }); + + } + lychee.loadDropbox(function() { Dropbox.choose({ linkType: 'direct', multiselect: true, - success: function(files) { - - for (var i = 0; i < files.length; i++) { - - links += files[i].link + ','; - - files[i] = { - name: files[i].link, - supported: true - }; - - } - - // Remove last comma - links = links.substr(0, links.length-1); - - upload.show('Importing from Dropbox', files, function() { - $('.upload_message .rows .row .status').html('Importing'); - }); - - params = 'importUrl&url=' + escape(links) + '&albumID=' + albumID; - lychee.api(params, function(data) { - - upload.close(); - upload.notify('Import complete'); - - albums.refresh(); - - if (album.getID()===false) lychee.goto('0'); - else album.load(albumID); - - if (data!==true) lychee.error(null, params, data); - - }); - - } + success }); }); } -} - -upload.close = function(force) { - - if (force===true) { - $('.upload_overlay').remove(); - } else { - $('.upload_overlay').removeClass('fadeIn').css('opacity', 0); - setTimeout(function() { $('.upload_overlay').remove() }, 300); - } - } \ No newline at end of file diff --git a/src/styles/_mediaquery.scss b/src/styles/_mediaquery.scss index 50324f4..2efa854 100644 --- a/src/styles/_mediaquery.scss +++ b/src/styles/_mediaquery.scss @@ -8,13 +8,11 @@ margin: 0 20% !important; width: 40% !important; } + #title.view { margin: 0 20% !important; width: 60% !important; } - #title span { - display: none !important; - } } @media only screen and (max-width: 640px) { @@ -22,19 +20,12 @@ #title { display: none !important; } + #title.view { display: block !important; width: 70% !important; margin: 0 20% 0 10% !important; } - #button_move { - display: none !important; - } - - .center { - top: 0 !important; - left: 0 !important; - } .album, .photo { margin: 40px 0 0 50px !important; @@ -44,21 +35,4 @@ display: none !important; } - .message { - position: fixed !important; - width: 100% !important; - height: 100% !important; - margin: 1px 0 0 0 !important; - border-radius: 0 !important; - - /* Animation */ - animation: moveUp .3s !important; - } - - .upload_message { - margin-top: 0 !important; - margin-left: 0 !important; - width: 100% !important; - } - } \ No newline at end of file diff --git a/src/styles/_message.scss b/src/styles/_message.scss index 5c9e65d..be54cd2 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -9,7 +9,6 @@ .basicModal { background: linear-gradient(to bottom, #444, #333); - border: 1px solid black(.7); border-bottom: 1px solid black(.8); box-shadow: 0 1px 4px black(.2), inset 0 1px 0 white(.05); @@ -66,6 +65,8 @@ &#basicModal__action.red { color: $colorRed; } + &.hidden { display: none; } + } /* Inputs ------------------------------------------------*/ @@ -179,4 +180,80 @@ span a { color: #888; } } + /* Title ------------------------------------------------*/ + h1 { + float: left; + width: 100%; + padding: 12px 0; + color: #fff; + font-size: 16px; + font-weight: bold; + text-shadow: $shadow; + text-align: center; + } + + /* Rows ------------------------------------------------*/ + .rows { + margin: 0 8px 8px; + width: calc(100% - 16px); + height: 300px; + background-color: black(.4); + overflow: hidden; + overflow-y: scroll; + border-radius: 3px; + box-shadow: inset 0 0 3px black(.4); + } + + /* Row ------------------------------------------------*/ + .rows .row { + float: left; + padding: 8px 0; + width: 100%; + background-color: white(.02); + + &:nth-child(2n) { background-color: white(0); } + + a.name { + float: left; + padding: 5px 10px; + width: calc(70% - 20px); + color: #fff; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + } + + a.status { + float: left; + padding: 5px 10px; + width: calc(30% - 20px); + color: white(.5); + font-size: 14px; + text-align: right; + + animation-name: pulse; + animation-duration: 2s; + animation-timing-function: ease-in-out; + animation-iteration-count: infinite; + + &.error, + &.success { animation: none; } + + &.error { color: rgb(213, 24, 24); } + + &.success { color: rgb(42, 213, 0); } + } + + p.notice { + display: none; + float: left; + padding: 2px 10px 5px; + width: calc(100% - 20px); + color: white(.5); + font-size: 12px; + overflow: hidden; + line-height: 16px; + } + } + } \ No newline at end of file diff --git a/src/styles/_upload.scss b/src/styles/_upload.scss deleted file mode 100644 index 2ad76d6..0000000 --- a/src/styles/_upload.scss +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @copyright 2014 by Tobias Reich - */ - -#upload { - display: none; -} - -.upload_overlay { - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-color: black(.85); - z-index: 1000; -} - -.upload_message { - - position: absolute; - display: inline-block; - width: 450px; - margin-left: -225px; - margin-top: -170px; - background-image: linear-gradient(to bottom, rgb(75, 75, 75), rgb(45, 45, 45)); - border-radius: 5px; - box-shadow: 0 0 5px #000, inset 0 1px 0 white(.08); - animation-name: moveUp; - animation-duration: .3s; - animation-timing-function: $timingBounce; - - /* Header ------------------------------------------------*/ - h1 { - float: left; - width: 100%; - padding: 12px 0; - color: #fff; - font-size: 16px; - font-weight: bold; - text-shadow: 0px -1px 0px black(.3); - text-align: center; - } - - .close { - display: none; - position: absolute; - top: 0; - right: 0; - padding: 11px 14px 6px 7px; - color: #aaa; - font-size: 20px; - text-shadow: 0px -1px 0px black(.3); - cursor: pointer; - - &:hover { color: #fff; } - } - - /* Rows ------------------------------------------------*/ - .rows { - float: left; - margin: 3px 8px 8px 8px; - width: calc(100% - 16px); - height: 300px; - background-color: black(.5); - overflow: hidden; - overflow-y: scroll; - border-radius: 3px; - box-shadow: inset 0 0 3px black(.8); - } - - /* Row ------------------------------------------------*/ - .rows .row { - float: left; - display: inline-block; - padding: 8px 0; - width: 100%; - background-color: white(.02); - - &:nth-child(2n) { background-color: white(0); } - - a.name { - float: left; - padding: 5px 10px; - width: calc(70% - 20px); - color: #fff; - font-size: 14px; - white-space: nowrap; - overflow: hidden; - } - - a.status { - float: left; - padding: 5px 10px; - width: calc(30% - 20px); - color: white(.5); - font-size: 14px; - text-align: right; - - animation-name: pulse; - animation-duration: 2s; - animation-timing-function: ease-in-out; - animation-iteration-count: infinite; - - &.error, - &.success { animation: none; } - - &.error { color: rgb(213, 24, 24); } - - &.success { color: rgb(42, 213, 0); } - } - - p.notice { - display: none; - float: left; - padding: 2px 10px 5px; - width: calc(100% - 20px); - color: white(.5); - font-size: 12px; - overflow: hidden; - line-height: 16px; - } - } - -} \ No newline at end of file diff --git a/src/styles/main.scss b/src/styles/main.scss index 9708f09..953828d 100755 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -31,12 +31,6 @@ body { } } -.center { - position: absolute; - left: 50%; - top: 50%; -} - input { -webkit-user-select: text !important; -moz-user-select: text !important; @@ -58,5 +52,4 @@ input { @import 'loading'; @import 'message'; @import 'multiselect'; -@import 'upload'; @import 'mediaquery'; \ No newline at end of file From f321e21645f5aa181c7b8273b0e4c77e9f8de1c0 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 00:30:57 +0100 Subject: [PATCH 057/190] New icons for context --- src/scripts/contextMenu.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index aa4c302..d9a6a62 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -26,15 +26,15 @@ contextMenu.add = function(e) { contextMenu.settings = function(e) { var items = [ - { type: 'item', title: 'Change Login', icon: 'icon-user', fn: settings.setLogin }, - { type: 'item', title: 'Change Sorting', icon: 'icon-sort', fn: settings.setSorting }, - { type: 'item', title: 'Set Dropbox', icon: 'icon-folder-open', fn: settings.setDropboxKey }, + { type: 'item', title: build.iconic('person') + 'Change Login', fn: settings.setLogin }, + { type: 'item', title: build.iconic('sort-ascending') + 'Change Sorting', fn: settings.setSorting }, + { type: 'item', title: build.iconic('box') + 'Set Dropbox', fn: settings.setDropboxKey }, { type: 'separator' }, - { type: 'item', title: 'About Lychee', icon: 'icon-info-sign', fn: function() { window.open(lychee.website) } }, - { type: 'item', title: 'Diagnostics', icon: 'icon-dashboard', fn: function() { window.open('plugins/check/') } }, - { type: 'item', title: 'Show Log', icon: 'icon-list', fn: function() { window.open('plugins/displaylog/') } }, + { type: 'item', title: build.iconic('info') + 'About Lychee', fn: function() { window.open(lychee.website) } }, + { type: 'item', title: build.iconic('wrench') + 'Diagnostics', fn: function() { window.open('plugins/check/') } }, + { type: 'item', title: build.iconic('align-left') + 'Show Log', fn: function() { window.open('plugins/displaylog/') } }, { type: 'separator' }, - { type: 'item', title: 'Sign Out', icon: 'icon-signout', fn: lychee.logout } + { type: 'item', title: build.iconic('account-logout') + 'Sign Out', fn: lychee.logout } ]; basicContext.show(items, e); From 0292deea19111a7c19ab8790ba7f816477abd43c Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 22:20:14 +0100 Subject: [PATCH 058/190] Fixed a bug with tags --- src/styles/_infobox.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index ece2eb7..fd5df73 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -146,7 +146,7 @@ #tags .empty .edit { margin-top: 0; } #tags .tag { - float: left; + display: inline-block; padding: 6px 10px; margin: 0 6px 8px 0; background-color: black(.5); From 8c4f4e925f2ba59ebfcc0968ea68addc269ca2e6 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 22:28:25 +0100 Subject: [PATCH 059/190] Added additional Open Graph Metadata #299 --- php/modules/misc.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/php/modules/misc.php b/php/modules/misc.php index 8e70e19..967b927 100755 --- a/php/modules/misc.php +++ b/php/modules/misc.php @@ -64,12 +64,13 @@ function getGraphHeader($database, $photoID) { else $dir = 'big'; $parseUrl = parse_url('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); + $url = $parseUrl['scheme'] . '://' . $parseUrl['host'] . $parseUrl['path'] . '?' . $parseUrl['query']; $picture = $parseUrl['scheme'] . '://' . $parseUrl['host'] . $parseUrl['path'] . '/../uploads/' . $dir . '/' . $row->url; $return = ''; - $return .= ''; - $return .= ''; - $return .= ''; + $return .= ''; + $return .= ''; + $return .= ''; $return .= ''; $return .= ''; @@ -79,6 +80,8 @@ function getGraphHeader($database, $photoID) { $return .= ''; $return .= ''; $return .= ''; + $return .= ''; + $return .= ''; return $return; From b3323c74c3e1c3f473b3b0f7f218abab88be1671 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 22:29:31 +0100 Subject: [PATCH 060/190] From CoffeeScript to JS (ES6) --- dist/main.css | Bin 43041 -> 43071 bytes dist/main.js | Bin 172970 -> 173448 bytes dist/view.js | Bin 93003 -> 93481 bytes src/gulpfile.js | 45 +--- src/package.json | 1 - src/scripts/build.coffee | 370 ---------------------------- src/scripts/build.js | 505 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 510 insertions(+), 411 deletions(-) delete mode 100644 src/scripts/build.coffee create mode 100644 src/scripts/build.js diff --git a/dist/main.css b/dist/main.css index bd59564846587f6a719f936476d7253f6f6a102e..08d666c30e929811b8ab0650acafc0874c8c2499 100644 GIT binary patch delta 55 zcmZ2@focB*rVT=xBFd!&Ir)hx)hU_91v!b8R(bh(shb5g6+9SCHyalwNKIDs5uMCm L%&~b{ceM-vOJEcb delta 44 zcmdmgfob6drVT=xjCzy#xFj|^XtH@Q85(SMFHDf)O3TSlEV0T-O)J^FySqgO07(Q7 AG5`Po diff --git a/dist/main.js b/dist/main.js index 3870557ec70481f8350dc364365e4cc295f29f39..d3366d01d7eee14c553846b9cf171786818de691 100644 GIT binary patch delta 2880 zcmbtWYitx%6wW=RgvPwU^yJKW2LYF{1s9@a zX)!U`*uHWmZtmKwl0@#~&7&0w$qcIo8(2iDCiO%O!OiiGuqSN_g4iMX6O$ix9DV?m zTb_Okf1zswqHXMg*|==VTwMogGe?qDIp6tqyt?=NjaJ-f{O)tanXLT&HG<0bet4TN z+E1fg`RC8z#pU+zG9_u&RZaGibpGpV^5QHMbxN+?pVm5K$-25sXG2nwq%><^LF(tD za&>awz98*4&4DJ$H}VHpkY7C{kvHoJ-j~Qf8X+6`dL&9(#F=S4W45N*7dy$fc*VO( z@=|$4TJp!lME=PhvZ0J5*zsPn1Pw0tlC7KAD~F*z7rkCSL!z{q-8c;5EM1~IHIK)` zZlhFTeR|lc5m>&$7iqD?c*Gd$vp?y6v3pR>q{1n6NKGl(-1@Ea=OI*9F$c4n&vdbF zo`v~rWCT35HekFz)Uz*y>S8 z?oxY$+F&Mw@hkiG4e4si7vnM2wV*Dv#W8mm~NkNvo^V z!Wl*DGy7X&jdgWFjeRu=%ZSeY7=^ZS%Ujks2Acr0^z0aHch&{$$1&JY5ZcC}l?%^| z!$PlRL`5?su`6$o6@>+i5J8I zFRG3}dm&-Fk3hstSkUIl9WpZ&qje;I;|TN;)|dmj?w$hRRd+ouaD6BTS{Wxjeh6&N zQHa}R&Tl#jP{uYhh&XlM%YbqxCm8q~)%y&t9N=8ir6}@=v#7aO&jvMz{dXce*1^}4 zkqtu%Wc6XgDL8G`9f;GTQtha`R`*i@z2H&SRS2T0_3Er|0w_`0;R$${$n1j&7$OF1 zJPEA}&>6%sI2rJuAz8=APr_wyk=%X?{9Zkow9yPEA0t)lxl>SGDJl5i6ecBm84oTi zsw7SdQ|`_v?i}(koZwYYIZcU!#Gc=XQ9Qy+Ck&TLK}s@YRi&v=WcHQY-ijcCqvsJN}DpOIEgtQAxyR+m+gT}-tUU)GfcnSVzFQq_#v+($h}5R-hr2Lz?C=+zsOb3dEA*48`spa3@S~rPu|@r5 z9~1udtECc+sN*$DO=j^mfq+1_*7#|YB_E-0#geGwbvhMX;FIHBRtOww5u7~ zYEZZ`GCbT$;-;Al5T?lPX@=h`AdxlO0HY?dPk3P+TVL@(n6nCa#_Sa6*M0BM8n{n1&uu>Mx|~Q&Ex)X&Qr*X ze<3gG!}RenXrwndD5FDTAf~G$W%SAzL};UEvF_$HP7dmlnbK9eno<;=mpTavv}(NM zF=bPcIF%=ali7#q9lX}kqInca-EPLi{*IQGn@2rHs^2j6Rv+i@aJh-c<3XFE9~Vck zD24|*j;D6?`#eTcq2C?D##l4ZO*dv>6Ftg4rN`l!`q^b_gOaX@JDp*|nQoq*eh(UK z=*Z#kBv`RMmuI1o&M^J>IFL5YO>#XTfjN#4_l%l3B(z~1>dN!&A{@PR0c_bVr+QRzhg77`Lq4QWUc{@k z=M30_g#!g9-EzFG-N&{2@XpZ?vfDyC!+k0}dInb1w7 zSsWczGvxt^OAR91)vWr7afDpubIn11r3K4u?jizDXDanZ7d#opr64tApp| z;o-uM3o$o%`sXB!TW~#b9vo$QB;rCZ;_FaLub&4SB^RJ+cOh?)!RK@` zRNA&xRQgjp2u|)i?Uq;0m=w4r)9OiRLW+4m1;MFAxL)#@Hl!+=7-hu3hlYtZ;Hx;K z=~2QVqY8vdSM9X!W-ZLUJ=kY_H13H_b~(yBWi_U;`wpL%yW+^O&0jZEy9l1T0-|#Q JT0%yG{{liqAt?X= diff --git a/dist/view.js b/dist/view.js index 293a8e7010da33443d960c854b8da6738ca56ce1..5cfaba9d59c80281f8c04437041d6eb0f239bc64 100644 GIT binary patch delta 2831 zcmbVOUu;ul6wlchtRU!wL59P1pV0Q&yW4gMj<$D|2oG27__J^{l2dM*z@VVp3mM6g4BE`_#R|eH-dL};n%H0A3xtM@!8ef@lqddu1&w&CkbV_ zR*R@SQM3iZ@lx~T%ngkFZRTJXWSax|188LOV_g`3`Rvzd94_W{G_J3Y;QsCPzfWXs z!KmAFrqQU2?piZ+9#?kBP?ng>t{8^R7GiYv=?8v~vFswykaiK>`g-FD}CS8vuX z$i?O5?CK}qM|$yB@BDOQ6G*G2U(C#2DIy`@ydclZmnT)**7P}x<83Y}(LY~;4aly2 zI|!rvc1agiVg6J@HJA7--6BCMnAI^b6!P7oDCR?j1Cubg-_4b-CdNrrjgoW>S6)Iq?k=e`2`@J%PHld!Jqx`w33BtqN9|r+ zq<1HwcuuQC^hT|Q1**%-3x=iy<7~~j5HQPvY%(B(XHBv-yQcD3BjGhxvj>!A7#2l6 z6w-y7s?XWg@x&PROQ*{@7zC4kn1eTZ9I$jF2T~XIXLt%`yzgD~+7!ImGVV`7h8aWC zu-iLyXd1YoRs(_#3^7ciW|V~8$}zq^4J4yS-Tnt2_9sA+1l#t=DH6p{Cy4NN)a!JB z-kyd%eK#k%c}9zBmKNTRqw_3o*Y( z5w|gcC)MbLteLY=0lJX~a^$HBV1xD%w}`!`0D3oLI4(GPs{mDBE?C}yWPE^$B3o=X{eV8SXuKP9VhOL#=@OU~__l~qt zFMyqjM*SJ+^aB}QJ?QrD;b?5Ud&5|3ZK+&URiWM})wFWfP*l$!F-3a63;$`JE+#C7epiCX1s{SV1H8dZ89!3i zqGp$?5w$>E6r{*qDa)2h;v|U-nlMPJWUBJTl;cb|&RNy!@Q$LFPLyF^98Zjp6<-bi zt4htSa;u{b_(U0w9ooY2nqDz18c<*uG#XXlFc`F?zyip0LxD^`qQm4eV+)HE-T1f) zpKoh-{H{W9t641i3Aa~3*deNg1U^8XbkZXg7#?h!GwO&fmujl7QUPjIpg-?jS(F)9 z&oM{4q<88MvpSP>^vju1(kFoRPp8a^oc>pYAJEQHCie+CV* zveI@XJ335-i?G)dn;+(Y%RPpvyu~&eVxjm9oTZs6^y9NORfVB`d2cydIqq1c`4rA#vRM9~75eiqkO-c63>ev7f%LL2oz5H(Y|t^eYX9z@qmw$X-BA zERbWyqFys(h4GN^26LT6IbAeN1>f;vk#7j7!N+C1xRr)pX8*P#DtCoVjIcigg?KUJ zy{eDW*IJnj=zRy2#arH=+wteK=RexAL8Z##Sbx3^gGW-4EEIzS(v8h#Y zGb}ehuPlCiBhZRfmw&yq5!A)}?{;se8c?y}bcju}bEBH;>gJRqQCEtq{LW6e1`BdWvTMK0@9LIgs)rq+X{qu-!ss{ zuPLw(2>(j~$^!$iYf~y2E;|~2owHLZega*5s0Tclb726w+LNVdiUhSFNrur%hHNR+$@N#wvBAcgnv5>{WW;oM<6WVb#y(d?WH$I zU{dsS`(+@N$Z~VVd%1PX+QAe4)hK4njN;K~X&ypJUZ3JO$KdeN^cZ~8gweg@Snk9) z^1d(*d-&yX`2KvA%Sp>d^2F>`2?0lfO7Ip8<~Xw7wq_lFN{|{sc17`oo^4BYI*H8jDC0wUM|7 z+VLZ4JT?LQw$`@bdC4$RD{@UfGXbw`6ubD13Fv6Av5V~ogAF=u?n%S5`|tCM6F|Mn zE?%?l$o#x9S14&(Xr`Pu^nz*?wW?nTokz0J(d@D*hwwMj5asu_K?~UYN*YF6M0F`{ z^UWF9{UmC%QQ78)G7zX7d(YEG8FdoQtnL;{0ZSC+Z49=7!+&JZzTJ_@gyxV$-qzTw zi2`#p5+iYk|B!)QQ4IEwh5FsI*V`+tst@1G^`i4NQO0vw=tflMvv2?}>X%tK3p($~ zLGO+LiI8qt*5~KzhJ-{jneo?iaAkuq`c8t^#seD$+JsRDEDOiZ7k4zx@p*ZV(J=GBX`UpFT$@$%tc%LANm NuXFxT$~TaO#6Lv0%@hCt diff --git a/src/gulpfile.js b/src/gulpfile.js index 694f9d0..cd70b80 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -16,15 +16,12 @@ var catchError = function(err) { paths.view = { js: [ '../src/scripts/_gup.js', + '../src/scripts/build.js', '../src/scripts/view/main.js' ], - coffee: [ - '../src/scripts/build.coffee' - ], scripts: [ 'bower_components/jQuery/dist/jquery.min.js', - '../dist/_view--javascript.js', - '../dist/_view--coffee.js' + '../dist/_view--javascript.js' ] } @@ -41,20 +38,7 @@ gulp.task('view--js', function() { }); -gulp.task('view--coffee', function() { - - var stream = - gulp.src(paths.view.coffee) - .pipe(plugins.coffee({bare: true})) - .on('error', catchError) - .pipe(plugins.concat('_view--coffee.js', {newLine: "\n"})) - .pipe(gulp.dest('../dist/')); - - return stream; - -}); - -gulp.task('view--scripts', ['view--js', 'view--coffee'], function() { +gulp.task('view--scripts', ['view--js'], function() { var stream = gulp.src(paths.view.scripts) @@ -73,9 +57,6 @@ paths.main = { js: [ '../src/scripts/*.js' ], - coffee: [ - '../src/scripts/*.coffee' - ], scripts: [ 'bower_components/jQuery/dist/jquery.min.js', 'bower_components/js-md5/js/md5.min.js', @@ -83,8 +64,7 @@ paths.main = { 'bower_components/mousetrap/plugins/global-bind/mousetrap-global-bind.min.js', 'bower_components/basicContext/dist/basicContext.min.js', 'bower_components/basicModal/dist/basicModal.min.js', - '../dist/_main--javascript.js', - '../dist/_main--coffee.js' + '../dist/_main--javascript.js' ], scss: [ '../src/styles/*.scss' @@ -109,20 +89,7 @@ gulp.task('main--js', function() { }); -gulp.task('main--coffee', function() { - - var stream = - gulp.src(paths.main.coffee) - .pipe(plugins.coffee({bare: true})) - .on('error', catchError) - .pipe(plugins.concat('_main--coffee.js', {newLine: "\n"})) - .pipe(gulp.dest('../dist/')); - - return stream; - -}); - -gulp.task('main--scripts', ['main--js', 'main--coffee'], function() { +gulp.task('main--scripts', ['main--js'], function() { var stream = gulp.src(paths.main.scripts) @@ -174,10 +141,8 @@ gulp.task('default', ['view--scripts', 'main--scripts', 'main--styles'], functio gulp.task('watch', ['default'], function() { gulp.watch(paths.view.js, ['view--scripts']); - gulp.watch(paths.view.coffee, ['view--scripts']); gulp.watch(paths.main.js, ['main--scripts']); - gulp.watch(paths.main.coffee, ['main--scripts']); gulp.watch(paths.main.scss, ['main--styles']); }); \ No newline at end of file diff --git a/src/package.json b/src/package.json index 774efd8..f74c5de 100644 --- a/src/package.json +++ b/src/package.json @@ -13,7 +13,6 @@ "gulp": "^3.8.10", "gulp-6to5": "^3.0.0", "gulp-autoprefixer": "2.1.0", - "gulp-coffee": "^2.2.0", "gulp-concat": "^2.4.3", "gulp-load-plugins": "^0.8.0", "gulp-minify-css": "^0.4.3", diff --git a/src/scripts/build.coffee b/src/scripts/build.coffee deleted file mode 100644 index 4bc37db..0000000 --- a/src/scripts/build.coffee +++ /dev/null @@ -1,370 +0,0 @@ -### -# @description This module is used to generate HTML-Code. -# @copyright 2014 by Tobias Reich -### - -window.build = {} - -build.iconic = (icon, classes, path) -> - - path = path || 'src/images/iconic.svg' - classes = classes || '' - - "" - -build.divider = (title) -> - - "

#{ title }

" - -build.editIcon = (id) -> - - "
#{ build.iconic('pencil') }
" - -build.multiselect = (top, left) -> - - "
" - -build.album = (data) -> - - return '' if not data? - - title = data.title - longTitle = '' - typeThumb = '' - - if title? and title.length > 18 - - title = data.title.substr(0, 18) + '...' - longTitle = data.title - - if data.thumb0.split('.').pop() is 'svg' then typeThumb = 'nonretina' - - html = """ -
- thumb - thumb - thumb -
- """ - - if data.password and lychee.publicMode is false - html += "

#{ title }

"; - else - html += "

#{ title }

" - - html += """ - #{ data.sysdate } -
- """ - - if lychee.publicMode is false - - if data.star is '1' then html += "#{ build.iconic('star') }" - if data.public is '1' then html += "#{ build.iconic('eye') }" - if data.unsorted is '1' then html += "#{ build.iconic('list') }" - if data.recent is '1' then html += "#{ build.iconic('clock') }" - - html += "
" - - return html - -build.photo = (data) -> - - return '' if not data? - - title = data.title - longTitle = '' - - if title? and title.length > 18 - - title = data.title.substr(0, 18) + '...' - longTitle = data.title - - html = """ -
- thumb -
-

#{ title }

- """ - - if data.cameraDate is 1 - html += "#{ data.sysdate }" - else - html += "#{ data.sysdate }" - - html += "
" - - if data.star is '1' then html += "#{ build.iconic('star') }" - if lychee.publicMode is false and data.public is '1' and album.json.public isnt '1' then html += "" - - html += "
" - - return html - -build.imageview = (data, size, visibleControls) -> - - return '' if not data? - - html = """ - - - """ - - if size is 'big' - - if visibleControls is true - html += "
" - else - html += "
" - - else if size is 'medium' - - if visibleControls is true - html += "
" - else - html += "
" - - else if size is 'small' - - if visibleControls is true - html += "
" - else - html += "
" - - return html - -build.no_content = (typ) -> - - html = """ -
- - """ - - switch typ - when 'search' then html += "

No results

" - when 'share' then html += "

No public albums

" - when 'cog' then html += "

No configuration

" - - html += "
" - - return html - -build.uploadModal = (title, files) -> - - html = """ -

#{ title }

-
- """ - - i = 0 - file = null - - while i < files.length - - file = files[i] - - if file.name.length > 40 - file.name = file.name.substr(0, 17) + '...' + file.name.substr(file.name.length-20, 20) - - html += """ -
- #{ lychee.escapeHTML(file.name) } - """ - - if file.supported is true then html += "" - else html += "Not supported" - - html += """ -

-
- """ - - i++ - - html += """ -
- """ - - return html - -build.tags = (tags, forView) -> - - html = '' - - if forView is true or lychee.publicMode is true then editTagsHTML = '' - else editTagsHTML = ' ' + build.editIcon('edit_tags') - - if tags isnt '' - - tags = tags.split ',' - - tags.forEach (tag, index, array) -> - html += "#{ tag }" - - html += editTagsHTML - - else - - html = "
No Tags#{ editTagsHTML }
" - - return html - -build.infoboxPhoto = (data, forView) -> - - html = "" - - switch data.public - when '0' then visible = 'No' - when '1' then visible = 'Yes' - when '2' then visible = 'Yes (Album)' - else visible = '-' - - if forView is true or lychee.publicMode is true then editTitleHTML = '' - else editTitleHTML = ' ' + build.editIcon('edit_title') - - if forView is true or lychee.publicMode is true then editDescriptionHTML = '' - else editDescriptionHTML = ' ' + build.editIcon('edit_description') - - infos = [ - ['', 'Basics'] - ['Title', data.title + editTitleHTML] - ['Uploaded', data.sysdate] - ['Description', data.description + editDescriptionHTML] - ['', 'Image'] - ['Size', data.size] - ['Format', data.type] - ['Resolution', data.width + ' x ' + data.height] - ['Tags', build.tags(data.tags, forView)] - ] - - exifHash = data.takestamp+data.make+data.model+data.shutter+data.aperture+data.focal+data.iso - - if exifHash isnt '0' or exifHash isnt '0' - - infos = infos.concat [ - ['', 'Camera'] - ['Captured', data.takedate] - ['Make', data.make] - ['Type/Model', data.model] - ['Shutter Speed', data.shutter] - ['Aperture', data.aperture] - ['Focal Length', data.focal] - ['ISO', data.iso] - ] - - infos = infos.concat [ - ['', 'Share'] - ['Public', visible] - ] - - infos.forEach (info, i, items) -> - - if info[1] is '' or - not info[1]? - - info[1] = '-' - - switch info[0] - - when '' - - # Divider - html += """ -
-

#{ info[1] }

- - """ - - when 'Tags' - - # Tags - if forView isnt true and lychee.publicMode is false - - html += """ -
-

#{ info[0] }

-
#{ info[1] }
- """ - - else - - # Item - html += """ - - #{ info[0] } - #{ info[1] } - - """ - - html += """ - -
- """ - - return html - -build.infoboxAlbum = (data, forView) -> - - html = "" - - switch data.public - when '0' then visible = 'No' - when '1' then visible = 'Yes' - else visible = '-' - - switch data.password - when false then password = 'No' - when true then password = 'Yes' - else password = '-' - - switch data.downloadable - when '0' then downloadable = 'No' - when '1' then downloadable = 'Yes' - else downloadable = '-' - - if forView is true or lychee.publicMode is true then editTitleHTML = '' - else editTitleHTML = ' ' + build.editIcon('edit_title_album') - - if forView is true or lychee.publicMode is true then editDescriptionHTML = '' - else editDescriptionHTML = ' ' + build.editIcon('edit_description_album') - - infos = [ - ['', 'Basics'] - ['Title', data.title + editTitleHTML] - ['Description', data.description + editDescriptionHTML] - ['', 'Album'] - ['Created', data.sysdate] - ['Images', data.num] - ['', 'Share'] - ['Public', visible] - ['Downloadable', downloadable] - ['Password', password] - ] - - infos.forEach (info, i, items) -> - - if info[0] is '' - - # Divider - html += """ - -

#{ info[1] }

- - """ - - else - - # Item - html += """ - - - - - """ - - html += """ -
#{ info[0] }#{ info[1] }
-
- """ - - return html \ No newline at end of file diff --git a/src/scripts/build.js b/src/scripts/build.js new file mode 100644 index 0000000..6fa9c45 --- /dev/null +++ b/src/scripts/build.js @@ -0,0 +1,505 @@ +/** + * @description This module is used to generate HTML-Code. + * @copyright 2014 by Tobias Reich + */ + +window.build = {} + +build.iconic = function(icon, classes, path) { + + var html = ''; + + path = path || 'src/images/iconic.svg'; + classes = classes || ''; + + html = ` + + + + ` + + return html; + +} + +build.divider = function(title) { + + var html = ''; + + html = ` +
+

${ title }

+
+ ` + + return html; + +} + +build.editIcon = function(id) { + + var html = ''; + + html = `
${ build.iconic('pencil') }
` + + return html; + +} + +build.multiselect = function(top, left) { + + var html = ''; + + html = `
` + + return html; + +} + +build.album = function(data) { + + if (data===null||data===undefined) return ''; + + var html = '', + title = data.title, + longTitle = '', + typeThumb = ''; + + if (title!==null&&title.length>18) { + + title = data.title.substr(0, 18) + '...'; + longTitle = data.title; + + } + + if (data.thumb0.split('.').pop()==='svg') typeThumb = 'nonretina'; + + html = ` +
+ thumb + thumb + thumb +
+ ` + + if (data.password&&lychee.publicMode===false) { + + html += ` +

+ ${ title } +

+ ` + + } else { + + html += `

${ title }

` + + } + + html += ` + ${ data.sysdate } +
+ ` + + if (lychee.publicMode===false) { + + if (data.star==='1') html += `${ build.iconic('star') }`; + if (data.public==='1') html += `${ build.iconic('eye') }`; + if (data.unsorted==='1') html += `${ build.iconic('list') }`; + if (data.recent==='1') html += `${ build.iconic('clock') }`; + + } + + html += '
' + + return html; + +} + +build.photo = function(data) { + + if (data===null||data===undefined) return ''; + + var html = '', + title = data.title, + longTitle = ''; + + if (title!==null&&title.length>18) { + + title = data.title.substr(0, 18) + '...'; + longTitle = data.title; + + } + + html = ` +
+ thumb +
+

${ title }

+ ` + + if (data.cameraDate===1) html += `${ data.sysdate }`; + else html += `${ data.sysdate }`; + + html += '
'; + + if (data.star==='1') + html += `${ build.iconic('star') }`; + + if (lychee.publicMode===false&&data.public==='1'&&album.json.public!=='1') + html += ``; + + html += '
'; + + return html + +} + +build.imageview = function(data, size, visibleControls) { + + if (data===null||data===undefined) return ''; + + var html = ''; + + html = ` + + + ` + + if (size==='big') { + + if (visibleControls===true) + html += `
`; + else + html += `
`; + + } else if (size==='medium') { + + if (visibleControls===true) + html += `
`; + else + html += `
`; + + } else if (size==='small') { + + if (visibleControls===true) + html += `
`; + else + html += `
`; + + } + + return html; + +} + +build.no_content = function(typ) { + + var html; + + html = ` +
+ + ` + + switch (typ) { + case 'search': html += '

No results

'; + break; + case 'share': html += '

No public albums

'; + break; + case 'cog': html += '

No configuration

'; + break; + } + + html += '
'; + + return html; + +} + +build.uploadModal = function(title, files) { + + var html = '', + i = 0, + file = null; + + html = ` +

${ title }

+
+ ` + + while (i40) file.name = file.name.substr(0, 17) + '...' + file.name.substr(file.name.length-20, 20); + + html += ` +
+ ${ lychee.escapeHTML(file.name) } + ` + + if (file.supported===true) html += ``; + else html += `Not supported`; + + html += ` +

+
+ ` + + i++; + + } + + html += '
'; + + return html; + +} + +build.tags = function(tags, forView) { + + var html = '', + editTagsHTML = ''; + + if (forView!==true&&lychee.publicMode!==true) editTagsHTML = ' ' + build.editIcon('edit_tags'); + + if (tags!=='') { + + tags = tags.split(','); + + tags.forEach(function(tag, index, array) { + html += `${ tag }` + }); + + html += editTagsHTML; + + } else { + + html = `
No Tags${ editTagsHTML }
`; + + } + + return html; + +} + +build.infoboxPhoto = function(data, forView) { + + var html = '', + visible = '', + editTitleHTML = '', + editDescriptionHTML = '', + exifHash = '', + info = []; + + switch (data.public) { + + case '0': visible = 'No'; + break; + case '1': visible = 'Yes'; + break; + case '2': visible = 'Yes (Album)'; + break; + default: visible = '-'; + break; + + } + + if (forView!==true&&lychee.publicMode!==true) { + editTitleHTML = ' ' + build.editIcon('edit_title'); + editDescriptionHTML = ' ' + build.editIcon('edit_description'); + } + + infos = [ + ['', 'Basics'], + ['Title', data.title + editTitleHTML], + ['Uploaded', data.sysdate], + ['Description', data.description + editDescriptionHTML], + ['', 'Image'], + ['Size', data.size], + ['Format', data.type], + ['Resolution', data.width + ' x ' + data.height], + ['Tags', build.tags(data.tags, forView)] + ] + + exifHash = data.takestamp+data.make+data.model+data.shutter+data.aperture+data.focal+data.iso; + + if (exifHash!=='0') { + + infos = infos.concat([ + ['', 'Camera'], + ['Captured', data.takedate], + ['Make', data.make], + ['Type/Model', data.model], + ['Shutter Speed', data.shutter], + ['Aperture', data.aperture], + ['Focal Length', data.focal], + ['ISO', data.iso] + ]); + + } + + infos = infos.concat([ + ['', 'Share'], + ['Public', visible] + ]); + + infos.forEach(function(info, i, items) { + + if (info[1]===''||info[1]===null||info[1]===undefined) info[1] = '-'; + + switch (info[0]) { + + case '': + + // Divider + html += ` + +
+

${ info[1] }

+
+ + ` + + break; + + case 'Tags': + + // Tags + if (forView!==true&&lychee.publicMode===false) { + + html += ` +
+
+

${ info[0] }

+
+
${ info[1] }
+ ` + + } + + break; + + default: + + // Item + html += ` + + ${ info[0] } + ${ info[1] } + + ` + + break; + + } + + + }); + + html += ` + +
+ ` + + return html; + +} + +build.infoboxAlbum = function(data, forView) { + + var html = '', + visible = '', + password = '', + downloadable = '', + editTitleHTML = '', + editDescriptionHTML = '', + infos = []; + + switch (data.public) { + + case '0': visible = 'No'; + break; + case '1': visible = 'Yes'; + break; + default: visible = '-'; + break; + + } + + switch (data.password) { + + case false: password = 'No'; + break; + case true: password = 'Yes'; + break; + default: password = '-'; + break; + + } + + switch (data.downloadable) { + + case '0': downloadable = 'No'; + break; + case '1': downloadable = 'Yes'; + break; + default: downloadable = '-'; + break; + + } + + if (forView!==true&&lychee.publicMode!==true) { + editTitleHTML = ' ' + build.editIcon('edit_title_album'); + editDescriptionHTML = ' ' + build.editIcon('edit_description_album'); + } + + infos = [ + ['', 'Basics'], + ['Title', data.title + editTitleHTML], + ['Description', data.description + editDescriptionHTML], + ['', 'Album'], + ['Created', data.sysdate], + ['Images', data.num], + ['', 'Share'], + ['Public', visible], + ['Downloadable', downloadable], + ['Password', password] + ] + + infos.forEach(function(info, i, items) { + + if (info[0]==='') { + + // Divider + html += ` + +
+

${ info[1] }

+
+ + ` + + } else { + + // Item + html += ` + + + + + ` + + } + + }); + + html += ` +
${ info[0] }${ info[1] }
+
+ ` + + return html; + +} \ No newline at end of file From 330325ead6fddded417547cc2a5ecf89ad733d25 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 22:29:59 +0100 Subject: [PATCH 061/190] Reduced spacing of title icon --- src/styles/_header.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/_header.scss b/src/styles/_header.scss index 7c0508f..db4633c 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -47,7 +47,7 @@ header { .iconic { display: none; - margin: 0 0 0 10px; + margin: 0 0 0 5px; width: 10px; fill: white(.5); filter: drop-shadow($shadow); From aa7502606765545d6b980ccc7560e58e5616aba5 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 31 Jan 2015 22:30:15 +0100 Subject: [PATCH 062/190] Hide upload form --- src/styles/main.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/styles/main.scss b/src/styles/main.scss index 953828d..dd5f33f 100755 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -26,9 +26,7 @@ body { -moz-osx-font-smoothing: grayscale; font-smoothing: antialiased; - &.view { - background-color: #0f0f0f; - } + &.view { background-color: #0f0f0f; } } input { @@ -42,6 +40,8 @@ input { height: 100%; } +#upload { display: none; } + @import 'animations'; @import 'content'; @import 'contextmenu'; From c6e5088fc5fdc2054f799a31555e9cf50b657c7c Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 1 Feb 2015 00:22:32 +0100 Subject: [PATCH 063/190] Code adjustments --- src/styles/_header.scss | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/styles/_header.scss b/src/styles/_header.scss index db4633c..25b269d 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -13,17 +13,11 @@ header { transition: transform .3s ease-out; /* Modes ------------------------------------------------*/ - &.hidden { - transform: translateY(-60px); - } + &.hidden { transform: translateY(-60px); } - &.loading { - transform: translateY(2px); - } + &.loading { transform: translateY(2px); } - &.error { - transform: translateY(40px); - } + &.error { transform: translateY(40px); } &.view { background: none; From 65f4980bb8c1667888b1fbca42caf43180d2643d Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 1 Feb 2015 00:25:31 +0100 Subject: [PATCH 064/190] Added ionicons, dropped Font Awesome, fixed active album share, new protected badge --- dist/main.css | Bin 43071 -> 34396 bytes dist/main.js | Bin 173448 -> 173381 bytes dist/view.js | Bin 93481 -> 93440 bytes index.html | 2 +- src/fonts/fontawesome-webfont.eot | Bin 38708 -> 0 bytes src/fonts/fontawesome-webfont.svg | 255 ------------------------ src/fonts/fontawesome-webfont.ttf | Bin 68476 -> 0 bytes src/fonts/fontawesome-webfont.woff | Bin 41752 -> 0 bytes src/images/ionicons.svg | 11 ++ src/scripts/build.js | 57 +++--- src/scripts/contextMenu.js | 26 +-- src/scripts/search.js | 2 +- src/scripts/view.js | 25 ++- src/styles/_content.scss | 24 ++- src/styles/_contextmenu.scss | 6 + src/styles/_font.scss | 303 ----------------------------- src/styles/_infobox.scss | 14 +- src/styles/main.scss | 1 - 18 files changed, 96 insertions(+), 630 deletions(-) delete mode 100755 src/fonts/fontawesome-webfont.eot delete mode 100755 src/fonts/fontawesome-webfont.svg delete mode 100755 src/fonts/fontawesome-webfont.ttf delete mode 100755 src/fonts/fontawesome-webfont.woff create mode 100755 src/images/ionicons.svg delete mode 100755 src/styles/_font.scss diff --git a/dist/main.css b/dist/main.css index 08d666c30e929811b8ab0650acafc0874c8c2499..0bde333b597342bdddc603bce83735c3f81b2eb4 100644 GIT binary patch delta 385 zcmdmgf$2^U(}o>(I(nJO`FWYi)oGbIIabO^NlDhZiACv|c~%ArrUexW1_}n&<(VlZ z8CDhr6_f26l_npy6`EYoC@p3Tlr2h6O4KmWQGg&l6HU#@XYKB@0+lM5P2OnVJUP)> za&nAA4zmeRbAf~Sj_u!S) z%LMr^Kd-nN?lF-2bd5m1n;cjw%wh<1-R7Sjf{dHj<;uuUj%(+be5*%@9pY_+$t=B3 zloW~!67v*L!z#tnDB0Kq7CMt<9MdP~^hiv8*UKYn33M{tHUo%Vrjsw$i%ym|;@qs) HCnyB~oV9;# delta 9404 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 diff --git a/dist/main.js b/dist/main.js index d3366d01d7eee14c553846b9cf171786818de691..a0baca8e70fa6790e34b403285f8e0e51a4be12e 100644 GIT binary patch delta 8480 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 QvAaVCVY&P74xKFcKRVMx{Qv*} delta 8649 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 MXrc4&z=@Lo0itwkP5=M^ diff --git a/dist/view.js b/dist/view.js index 5cfaba9d59c80281f8c04437041d6eb0f239bc64..d2cc84bf50c56063e07d71e55ee322f3664de615 100644 GIT binary patch delta 13252 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
xPQI@E}(RafbEy>kY5@7?&8%lS6#pslz)S@ z4>n>FaGA)B6bvoYc?8x6FOkcF?RMZC7@aqP=4Rgw&6UNdEq}dGK%xX*-}7$OxqcgP z?cDkPyVT{`caej{vu^Sp_rxqVqpYj#?}bod@Vy4owD(rw`ucmMW@|63bT+;Jc|4zf ze?^y2bjc6t3UOM!=sZFXBX(+~+tNQ<(eO_I2pX~fkq02~hEU%`;$7>bNyf-Q$5CUireC98tIf|=+hWv}EFfis{?IsuP{aQF0R2AmlB!)O+k zhULx~%QCYm4TRi7ug7-jRGT*_cPV;2hmJ^SX2N}qvGCCE#YG)_^`R%$ug#sLy}j6`Wd7CVA1T<6Ajb%wfFB{lQcg znqF>A!2v(e2H}1%mHpc!+WxnC=?E5Rh5OPprtT2HQ!7QPl>oNpaWA5A5LHhW}e^!@C;TB(&)?8-@YJLpaSwr zUtwM)63B;oXRu|X{s#317bf2|^qpC(9>izpjVk7j#>!kXpZy~fZgc@wUktS`U_X$? zFchj`->Hy^+o9Kj?5h>1b8Hc#Q#jdJLFA%ZBwGR~_pwE+8ICX|+`lejb0&)Dh<6KX z8EArgS1qt0U(0GH0{oEGF>JjnEsN{X?Q^y4Sq#d(eKErtxN3xbNEo8@yTLj()5S*o zm~qm3al{&16c)t-QN}7^s`-LE*O}l$Ur^ZPqy5yfJ3hvijN)l%UW`48{@;tSW#@u! zmkvk_t!Q9ZjvB^u_q$8j?uA|i5j)Z?HgF@CC9;Y@*C-cY#H*LG+tA+gOWB<9Nbg82 zw`Kg}j#|d{VDy<~40+z6L(AABG6Cn-uVgp}J@nO;tg4)lc7L#nJxM}c&3f?j{%Qu+ z@2*I&Bz{DKEyDpZ3SZm@5^QcYg3;Vzy)R$hYEt@XzY)$DC%fF=Bp5PK?zAL(paV%h zp94r95k#6TJPlU9^DwtU$`dejUWjpq_VO?7#Nkl(mTLApRt#4sC+UIU> zVK^%79%^At?)7WgRQLNW>}uc|?7g#-vY8YDxI0?$4RdSI${!#Ho2EZtO%(PH@uN8FROURMs@*a zcxod&r*L20$O2PvMA(~MD2lZf?$k|ec9@bbbU>a$bzK4M$^+isnH?0+fUFcB+PaBZ zY$=^Z!lH!oqN9QLAd!`C2$hV?q~U}(f>GXq6NnlTS*Xn2w>Gma<3-d&be})eHPn0_ z`+saSHRN_}V=WNmrY#bT4sT)m*eJL%ckP92VRch?JYaJ>XK0I&6o`fvH{)bTG}P44 z9dF)i4&AdAhBQ^C)AISlmdHwS=$>d}%1o={Kz$AuBTJ_zn;P`ykmA0womIM_ZEOR2 z2~(zpGZHC4?SW2aBN&rG>=2IYmO0y%&0YJ}0PM_s179&3$$& zYjzv9vpTo2jm>aBx1H^!u6DwA;Mi6Pf7}aq;pLM%*aEkA2LqLI8+Nja#zoBb z?&rF>i`jLqaxwc51&emEJxe|{2m?LuHOG%1AHtSie+Nz{Rol-Qhd|^Mf&+xYi z@s;Q~7DI;SlW&Ck@otu$;}!bimIK5HO;8=TcMm&;$$Yejt;S#=6!(uhi@4|RW%J#^ zcD6GqHzOpSp{2&*pU+AjG@lj{2_v&vt|#(}Xq>y}rdbe;*QeP^_yST+_p&s@IcxU` zoz27{$Iu=lAMy_ECZ)8N;BQ>q@1+^`b=_a4S-q>bV<3z7vRwe}qkGw_;^hx zBOCnFrPBPVLHAmn)h_CVkV)k{`3K_(Sj1LqWG}%+H=%>g$n5Z;KsOsd=Dz_0 C4|*{G delta 13308 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

=BuOa~f7M9DE-B=1NvoPDndHUd5gw zp{{1V`1o)&1M7EI#8@03BF36=JdDB@=YbfTUxQ#YcQDFeFXG!B+TQ;N(jc1HFV5D#n+>24}n zhmhly5h>C7k`7X?o;$u4HU}$R*}@J6aLO zR%2gwVfOq4dwRZr8ugiZPNoFnk_Je@0Rf|h6J5hlU31P`!;l|yezt}c5s#5Yqf~|t z1L%hXoH-;$sIZIp6W+5xOmkXB8Y zF}H2E+lJ6ZZZ9PoR6cy)ddv<->jn_vpnROtMhcGPB7U=hHO)j!0@5ZcX~c?<3UPuP z+48cAXEw6)u)>oY;W@eU`bOrPhBLwL>H=ZxHFu_OVsnF(bfFXR6so5wE|Vv^-4i=# zpb41?F}!sXGucvk63H_vgI*uVi%cW$MM^8*$PtI~OeBAx8^;edb$;(^gb;9_GU{mP^sR$YE@^e{J)ddLC+D*c=Z*8(T<4ta%yb^x&UQc- zapqMVa~*z>|5?f+<9jwv!IoGFJNCKt^DhSY88F+FfY?1;K#~jxz`HNNr_$oa-)Pi!1UyX(;+d?5G>yIIX)_>xC#Vmwb{!JcN#y z%Pfu8+S*LK#%)6Fol-lId|@xjZun0O(Ul7FIuT@cK6{5dFYS`}5!nr(?r2{ z;%>GYA7^(m)p;Yys+}F3Z0E(JrRnAkmiS~1L$V;+d7Ky;*;-m-0GUT4tRe6-v_MOi zA1FygX8D)2ZZ&;7)7^Qfj8lfR6-a;9~%b>>dEg%`8eu>-@a_OR>ebdJ>XXD?;V2=l%;o|8Y3Fj<~1Yk@j}K)N`QR@CV&&;<*0@8^w#F diff --git a/index.html b/index.html index 36d3c2f..1dd1fbe 100644 --- a/index.html +++ b/index.html @@ -68,7 +68,7 @@ - +

diff --git a/src/fonts/fontawesome-webfont.eot b/src/fonts/fontawesome-webfont.eot deleted file mode 100755 index 89070c1e63c2703b2334023922ecc1664f759b55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38708 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/fonts/fontawesome-webfont.ttf b/src/fonts/fontawesome-webfont.ttf deleted file mode 100755 index c17e9f8d100d01a002029b5b93cc081062618bf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68476 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 diff --git a/src/images/ionicons.svg b/src/images/ionicons.svg new file mode 100755 index 0000000..55ec9c8 --- /dev/null +++ b/src/images/ionicons.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/scripts/build.js b/src/scripts/build.js index 6fa9c45..db91590 100644 --- a/src/scripts/build.js +++ b/src/scripts/build.js @@ -5,16 +5,17 @@ window.build = {} -build.iconic = function(icon, classes, path) { +build.iconic = function(icon, classes, file) { - var html = ''; + var html = '', + path = 'src/images/'; - path = path || 'src/images/iconic.svg'; + file = file || 'iconic'; classes = classes || ''; html = ` - + ` @@ -80,24 +81,8 @@ build.album = function(data) { thumb thumb ` @@ -107,6 +92,7 @@ build.album = function(data) { if (data.public==='1') html += `${ build.iconic('eye') }`; if (data.unsorted==='1') html += `${ build.iconic('list') }`; if (data.recent==='1') html += `${ build.iconic('clock') }`; + if (data.password===true) html += `${ build.iconic('lock-locked') }`; } @@ -138,16 +124,17 @@ build.photo = function(data) {

${ title }

` - if (data.cameraDate===1) html += `${ data.sysdate }`; + if (data.cameraDate===1) html += `${ build.iconic('camera-slr') }${ data.sysdate }`; else html += `${ data.sysdate }`; html += ''; - if (data.star==='1') - html += `${ build.iconic('star') }`; + if (lychee.publicMode===false) { - if (lychee.publicMode===false&&data.public==='1'&&album.json.public!=='1') - html += ``; + if (data.star==='1') html += `${ build.iconic('star') }`; + if (data.public==='1'&&album.json.public!=='1') html += ``; + + } html += ''; @@ -199,16 +186,16 @@ build.no_content = function(typ) { html = `
- + ${ build.iconic(typ) } ` switch (typ) { - case 'search': html += '

No results

'; - break; - case 'share': html += '

No public albums

'; - break; - case 'cog': html += '

No configuration

'; - break; + case 'magnifying-glass': html += '

No results

'; + break; + case 'eye': html += '

No public albums

'; + break; + case 'cog': html += '

No configuration

'; + break; } html += '
'; @@ -269,7 +256,7 @@ build.tags = function(tags, forView) { tags = tags.split(','); tags.forEach(function(tag, index, array) { - html += `${ tag }` + html += `${ tag }${ build.iconic('x') }` }); html += editTagsHTML; diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index d9a6a62..36be03d 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -209,19 +209,21 @@ contextMenu.move = function(photoIDs, e) { contextMenu.sharePhoto = function(photoID, e) { - var link = photo.getViewLink(photoID); + var link = photo.getViewLink(photoID), + file = 'ionicons'; + if (photo.json.public==='2') link = location.href; var items = [ { type: 'item', title: '', fn: function() {}, class: 'noHover' }, { type: 'separator' }, - { type: 'item', title: 'Make Private', icon: 'icon-eye-close', fn: function() { photo.setPublic(photoID) } }, + { type: 'item', title: build.iconic('twitter', file, file) + 'Twitter', fn: function() { photo.share(photoID, 0) } }, + { type: 'item', title: build.iconic('facebook', file, file) + 'Facebook', fn: function() { photo.share(photoID, 1) } }, + { type: 'item', title: build.iconic('envelope-closed') + 'Mail', fn: function() { photo.share(photoID, 2) } }, + { type: 'item', title: build.iconic('dropbox', file, file) + 'Dropbox', fn: function() { photo.share(photoID, 3) } }, + { type: 'item', title: build.iconic('link-intact') + 'Direct Link', fn: function() { window.open(photo.getDirectLink()) } }, { type: 'separator' }, - { type: 'item', title: 'Twitter', icon: 'icon-twitter', fn: function() { photo.share(photoID, 0) } }, - { type: 'item', title: 'Facebook', icon: 'icon-facebook', fn: function() { photo.share(photoID, 1) } }, - { type: 'item', title: 'Mail', icon: 'icon-envelope', fn: function() { photo.share(photoID, 2) } }, - { type: 'item', title: 'Dropbox', icon: 'icon-hdd', fn: function() { photo.share(photoID, 3) } }, - { type: 'item', title: 'Direct Link', icon: 'icon-link', fn: function() { window.open(photo.getDirectLink()) } } + { type: 'item', title: build.iconic('ban') + 'Make Private', fn: function() { photo.setPublic(photoID) } } ]; basicContext.show(items, e); @@ -231,14 +233,16 @@ contextMenu.sharePhoto = function(photoID, e) { contextMenu.shareAlbum = function(albumID, e) { + var file = 'ionicons'; + var items = [ { type: 'item', title: '', fn: function() {}, class: 'noHover' }, { type: 'separator' }, - { type: 'item', title: 'Make Private', icon: 'icon-eye-close', fn: function() { album.setPublic(albumID) } }, + { type: 'item', title: build.iconic('twitter', file, file) + 'Twitter', fn: function() { album.share(0) } }, + { type: 'item', title: build.iconic('facebook', file, file) + 'Facebook', fn: function() { album.share(1) } }, + { type: 'item', title: build.iconic('envelope-closed') + 'Mail', fn: function() { album.share(2) } }, { type: 'separator' }, - { type: 'item', title: 'Twitter', icon: 'icon-twitter', fn: function() { album.share(0) } }, - { type: 'item', title: 'Facebook', icon: 'icon-facebook', fn: function() { album.share(1) } }, - { type: 'item', title: 'Mail', icon: 'icon-envelope', fn: function() { album.share(2) } } + { type: 'item', title: build.iconic('ban') + 'Make Private', fn: function() { album.setPublic(albumID) } } ]; basicContext.show(items, e); diff --git a/src/scripts/search.js b/src/scripts/search.js index ce4a7ca..2cbeea5 100755 --- a/src/scripts/search.js +++ b/src/scripts/search.js @@ -64,7 +64,7 @@ search.find = function(term) { if (code==='error') { lychee.content.html(''); - $('body').append(build.no_content('search')); + $('body').append(build.no_content('magnifying-glass')); } else { lychee.content.html(code); lychee.animate('.album, .photo', 'contentZoomIn'); diff --git a/src/scripts/view.js b/src/scripts/view.js index 01b6821..9266a2b 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -71,7 +71,7 @@ view.albums = { if (smartData===''&&albumsData==='') { lychee.content.html(''); - $('body').append(build.no_content('share')); + $('body').append(build.no_content('eye')); } else { lychee.content.html(smartData + albumsData); } @@ -87,19 +87,16 @@ view.albums = { title: function(albumID) { - var prefix = '', - longTitle = '', + var longTitle = '', title = albums.json.content[albumID].title; - if (albums.json.content[albumID].password) prefix = " "; - if (title!==null&&title.length>18) { longTitle = title; title = title.substr(0, 18) + '...'; } $('.album[data-id="' + albumID + '"] .overlay h1') - .html(prefix + title) + .html(title) .attr('title', longTitle); }, @@ -251,13 +248,21 @@ view.album = { public: function() { if (album.json.public==1) { - $('#button_share_album a').addClass('active'); - $('#button_share_album').attr('title', 'Share Album'); + + $('#button_share_album') + .addClass('active') + .attr('title', 'Share Album'); + $('.photo .iconic-share').remove(); + if (album.json.init) $('#infobox .attr_visibility').html('Public'); + } else { - $('#button_share_album a').removeClass('active'); - $('#button_share_album').attr('title', 'Make Public'); + + $('#button_share_album') + .removeClass('active') + .attr('title', 'Make Public'); + if (album.json.init) $('#infobox .attr_visibility').html('Private'); } diff --git a/src/styles/_content.scss b/src/styles/_content.scss index 4034688..c440ed8 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -110,7 +110,12 @@ text-shadow: 0 1px 3px black(.4); } - .photo .overlay a span { margin: 0 6px 0 0; } + .photo .overlay a .iconic { + fill: #bbb; + margin: 0 5px 0 0; + width: 8px; + filter: drop-shadow(0 1px 3px black(.4)); + } .album img[data-type^='nonretina'] + .overlay h1, .album img[data-type^='nonretina'] + .overlay a { text-shadow: none; } @@ -120,22 +125,21 @@ .photo .badge { position: absolute; margin: -1px 0 0 12px; - padding: 12px 7px 3px 7px; + padding: 12px 8px 6px; box-shadow: 0 0 2px black(.6); background: $colorRed; border-radius: 0 0 5px 5px; border: 1px solid #fff; border-top: none; color: #fff; - font-size: 24px; text-shadow: 0 1px 0 black(.4); opacity: .9; - &:nth-child(2n) { margin-left: 57px; } + &:nth-child(2n) { margin-left: 54px; } .iconic { fill: #fff; - width: 21px; + width: 16px; filter: drop-shadow($shadowLight); } } @@ -174,13 +178,17 @@ top: 50%; left: 50%; padding-top: 20px; - color: rgba(10, 10, 10, 1); color: black(.9); - text-shadow: 0 1px 0 white(.02); + text-shadow: 0 1px 0 white(.03); text-align: center; transform: translateX(-50%) translateY(-50%); - .icon { font-size: 80px; } + .iconic { + fill: black(.9); + margin: 0 0 10px; + width: 60px; + filter: drop-shadow(0 1px 0 white(.03)); + } p { font-size: 18px; diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index 778d9e4..96fc83c 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -55,6 +55,12 @@ filter: drop-shadow($shadow); } + tr td .iconic.ionicons { + margin: 0 8px -2px 0; + width: 14px; + height: 14px; + } + /* Link ------------------------------------------------*/ input#link { width: 100%; diff --git a/src/styles/_font.scss b/src/styles/_font.scss deleted file mode 100755 index 6eacd51..0000000 --- a/src/styles/_font.scss +++ /dev/null @@ -1,303 +0,0 @@ -/* Font Awesome - the iconic font designed for use with Twitter Bootstrap - ------------------------------------------------------- - The full suite of pictographic icons, examples, and documentation - can be found at: http://fortawesome.github.com/Font-Awesome/ - - License - ------------------------------------------------------- - The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0: - http://creativecommons.org/licenses/by/3.0/ A mention of - 'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable - source code is considered acceptable attribution (most common on the web). - If human readable source code is not available to the end user, a mention in - an 'About' or 'Credits' screen is considered acceptable (most common in desktop - or mobile software). - - Contact - ------------------------------------------------------- - Email: dave@davegandy.com - Twitter: http://twitter.com/fortaweso_me - Work: http://lemonwi.se co-founder - - */ -@font-face { - font-family: 'FontAwesome'; - src: url('../src/fonts/fontawesome-webfont.eot'); - src: url('../src/fonts/fontawesome-webfont.eot?#iefix') format('eot'), url('../src/fonts/fontawesome-webfont.woff') format('woff'), url('../src/fonts/fontawesome-webfont.ttf') format('truetype'), url('../src/fonts/fontawesome-webfont.svg#FontAwesome') format('svg'); - font-weight: normal; - font-style: normal; -} - -/* Font Awesome styles - ------------------------------------------------------- */ -[class^="icon-"]:before, [class*=" icon-"]:before { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; -} -a [class^="icon-"], a [class*=" icon-"] { - display: inline-block; - text-decoration: inherit; -} -/* makes the font 33% larger relative to the icon container */ -.icon-large:before { - vertical-align: top; - font-size: 1.3333333333333333em; -} -.btn [class^="icon-"], .btn [class*=" icon-"] { - /* keeps button heights with and without icons the same */ - - line-height: .9em; -} -li [class^="icon-"], li [class*=" icon-"] { - display: inline-block; - width: 1.25em; - text-align: center; -} -li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] { - /* 1.5 increased font size for icon-large * 1.25 width */ - - width: 1.875em; -} -li[class^="icon-"], li[class*=" icon-"] { - margin-left: 0; - list-style-type: none; -} -li[class^="icon-"]:before, li[class*=" icon-"]:before { - text-indent: -2em; - text-align: center; -} -li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before { - text-indent: -1.3333333333333333em; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.icon-glass:before { content: "\f000"; } -.icon-music:before { content: "\f001"; } -.icon-search:before { content: "\f002"; } -.icon-envelope:before { content: "\f003"; } -.icon-heart:before { content: "\f004"; } -.icon-star:before { content: "\f005"; } -.icon-star-empty:before { content: "\f006"; } -.icon-user:before { content: "\f007"; } -.icon-film:before { content: "\f008"; } -.icon-th-large:before { content: "\f009"; } -.icon-th:before { content: "\f00a"; } -.icon-th-list:before { content: "\f00b"; } -.icon-ok:before { content: "\f00c"; } -.icon-remove:before { content: "\f00d"; } -.icon-zoom-in:before { content: "\f00e"; } - -.icon-zoom-out:before { content: "\f010"; } -.icon-off:before { content: "\f011"; } -.icon-signal:before { content: "\f012"; } -.icon-cog:before { content: "\f013"; } -.icon-trash:before { content: "\f014"; } -.icon-home:before { content: "\f015"; } -.icon-file:before { content: "\f016"; } -.icon-time:before { content: "\f017"; } -.icon-road:before { content: "\f018"; } -.icon-download-alt:before { content: "\f019"; } -.icon-download:before { content: "\f01a"; } -.icon-upload:before { content: "\f01b"; } -.icon-inbox:before { content: "\f01c"; } -.icon-play-circle:before { content: "\f01d"; } -.icon-repeat:before { content: "\f01e"; } - -/* \f020 doesn't work in Safari. all shifted one down */ -.icon-refresh:before { content: "\f021"; } -.icon-list-alt:before { content: "\f022"; } -.icon-lock:before { content: "\f023"; } -.icon-flag:before { content: "\f024"; } -.icon-headphones:before { content: "\f025"; } -.icon-volume-off:before { content: "\f026"; } -.icon-volume-down:before { content: "\f027"; } -.icon-volume-up:before { content: "\f028"; } -.icon-qrcode:before { content: "\f029"; } -.icon-barcode:before { content: "\f02a"; } -.icon-tag:before { content: "\f02b"; } -.icon-tags:before { content: "\f02c"; } -.icon-book:before { content: "\f02d"; } -.icon-bookmark:before { content: "\f02e"; } -.icon-print:before { content: "\f02f"; } - -.icon-camera:before { content: "\f030"; } -.icon-font:before { content: "\f031"; } -.icon-bold:before { content: "\f032"; } -.icon-italic:before { content: "\f033"; } -.icon-text-height:before { content: "\f034"; } -.icon-text-width:before { content: "\f035"; } -.icon-align-left:before { content: "\f036"; } -.icon-align-center:before { content: "\f037"; } -.icon-align-right:before { content: "\f038"; } -.icon-align-justify:before { content: "\f039"; } -.icon-list:before { content: "\f03a"; } -.icon-indent-left:before { content: "\f03b"; } -.icon-indent-right:before { content: "\f03c"; } -.icon-facetime-video:before { content: "\f03d"; } -.icon-picture:before { content: "\f03e"; } - -.icon-pencil:before { content: "\f040"; } -.icon-map-marker:before { content: "\f041"; } -.icon-adjust:before { content: "\f042"; } -.icon-tint:before { content: "\f043"; } -.icon-edit:before { content: "\f044"; } -.icon-share:before { content: "\f045"; } -.icon-check:before { content: "\f046"; } -.icon-move:before { content: "\f047"; } -.icon-step-backward:before { content: "\f048"; } -.icon-fast-backward:before { content: "\f049"; } -.icon-backward:before { content: "\f04a"; } -.icon-play:before { content: "\f04b"; } -.icon-pause:before { content: "\f04c"; } -.icon-stop:before { content: "\f04d"; } -.icon-forward:before { content: "\f04e"; } - -.icon-fast-forward:before { content: "\f050"; } -.icon-step-forward:before { content: "\f051"; } -.icon-eject:before { content: "\f052"; } -.icon-chevron-left:before { content: "\f053"; } -.icon-chevron-right:before { content: "\f054"; } -.icon-plus-sign:before { content: "\f055"; } -.icon-minus-sign:before { content: "\f056"; } -.icon-remove-sign:before { content: "\f057"; } -.icon-ok-sign:before { content: "\f058"; } -.icon-question-sign:before { content: "\f059"; } -.icon-info-sign:before { content: "\f05a"; } -.icon-screenshot:before { content: "\f05b"; } -.icon-remove-circle:before { content: "\f05c"; } -.icon-ok-circle:before { content: "\f05d"; } -.icon-ban-circle:before { content: "\f05e"; } - -.icon-arrow-left:before { content: "\f060"; } -.icon-arrow-right:before { content: "\f061"; } -.icon-arrow-up:before { content: "\f062"; } -.icon-arrow-down:before { content: "\f063"; } -.icon-share-alt:before { content: "\f064"; } -.icon-resize-full:before { content: "\f065"; } -.icon-resize-small:before { content: "\f066"; } -.icon-plus:before { content: "\f067"; } -.icon-minus:before { content: "\f068"; } -.icon-asterisk:before { content: "\f069"; } -.icon-exclamation-sign:before { content: "\f06a"; } -.icon-gift:before { content: "\f06b"; } -.icon-leaf:before { content: "\f06c"; } -.icon-fire:before { content: "\f06d"; } -.icon-eye-open:before { content: "\f06e"; } - -.icon-eye-close:before { content: "\f070"; } -.icon-warning-sign:before { content: "\f071"; } -.icon-plane:before { content: "\f072"; } -.icon-calendar:before { content: "\f073"; } -.icon-random:before { content: "\f074"; } -.icon-comment:before { content: "\f075"; } -.icon-magnet:before { content: "\f076"; } -.icon-chevron-up:before { content: "\f077"; } -.icon-chevron-down:before { content: "\f078"; } -.icon-retweet:before { content: "\f079"; } -.icon-shopping-cart:before { content: "\f07a"; } -.icon-folder-close:before { content: "\f07b"; } -.icon-folder-open:before { content: "\f07c"; } -.icon-resize-vertical:before { content: "\f07d"; } -.icon-resize-horizontal:before { content: "\f07e"; } - -.icon-bar-chart:before { content: "\f080"; } -.icon-twitter-sign:before { content: "\f081"; } -.icon-facebook-sign:before { content: "\f082"; } -.icon-camera-retro:before { content: "\f083"; } -.icon-key:before { content: "\f084"; } -.icon-cogs:before { content: "\f085"; } -.icon-comments:before { content: "\f086"; } -.icon-thumbs-up:before { content: "\f087"; } -.icon-thumbs-down:before { content: "\f088"; } -.icon-star-half:before { content: "\f089"; } -.icon-heart-empty:before { content: "\f08a"; } -.icon-signout:before { content: "\f08b"; } -.icon-linkedin-sign:before { content: "\f08c"; } -.icon-pushpin:before { content: "\f08d"; } -.icon-external-link:before { content: "\f08e"; } - -.icon-signin:before { content: "\f090"; } -.icon-trophy:before { content: "\f091"; } -.icon-github-sign:before { content: "\f092"; } -.icon-upload-alt:before { content: "\f093"; } -.icon-lemon:before { content: "\f094"; } -.icon-phone:before { content: "\f095"; } -.icon-check-empty:before { content: "\f096"; } -.icon-bookmark-empty:before { content: "\f097"; } -.icon-phone-sign:before { content: "\f098"; } -.icon-twitter:before { content: "\f099"; } -.icon-facebook:before { content: "\f09a"; } -.icon-github:before { content: "\f09b"; } -.icon-unlock:before { content: "\f09c"; } -.icon-credit-card:before { content: "\f09d"; } -.icon-rss:before { content: "\f09e"; } - -.icon-hdd:before { content: "\f0a0"; } -.icon-bullhorn:before { content: "\f0a1"; } -.icon-bell:before { content: "\f0a2"; } -.icon-certificate:before { content: "\f0a3"; } -.icon-hand-right:before { content: "\f0a4"; } -.icon-hand-left:before { content: "\f0a5"; } -.icon-hand-up:before { content: "\f0a6"; } -.icon-hand-down:before { content: "\f0a7"; } -.icon-circle-arrow-left:before { content: "\f0a8"; } -.icon-circle-arrow-right:before { content: "\f0a9"; } -.icon-circle-arrow-up:before { content: "\f0aa"; } -.icon-circle-arrow-down:before { content: "\f0ab"; } -.icon-globe:before { content: "\f0ac"; } -.icon-wrench:before { content: "\f0ad"; } -.icon-tasks:before { content: "\f0ae"; } - -.icon-filter:before { content: "\f0b0"; } -.icon-briefcase:before { content: "\f0b1"; } -.icon-fullscreen:before { content: "\f0b2"; } - -.icon-group:before { content: "\f0c0"; } -.icon-link:before { content: "\f0c1"; } -.icon-cloud:before { content: "\f0c2"; } -.icon-beaker:before { content: "\f0c3"; } -.icon-cut:before { content: "\f0c4"; } -.icon-copy:before { content: "\f0c5"; } -.icon-paper-clip:before { content: "\f0c6"; } -.icon-save:before { content: "\f0c7"; } -.icon-sign-blank:before { content: "\f0c8"; } -.icon-reorder:before { content: "\f0c9"; } -.icon-list-ul:before { content: "\f0ca"; } -.icon-list-ol:before { content: "\f0cb"; } -.icon-strikethrough:before { content: "\f0cc"; } -.icon-underline:before { content: "\f0cd"; } -.icon-table:before { content: "\f0ce"; } - -.icon-magic:before { content: "\f0d0"; } -.icon-truck:before { content: "\f0d1"; } -.icon-pinterest:before { content: "\f0d2"; } -.icon-pinterest-sign:before { content: "\f0d3"; } -.icon-google-plus-sign:before { content: "\f0d4"; } -.icon-google-plus:before { content: "\f0d5"; } -.icon-money:before { content: "\f0d6"; } -.icon-caret-down:before { content: "\f0d7"; } -.icon-caret-up:before { content: "\f0d8"; } -.icon-caret-left:before { content: "\f0d9"; } -.icon-caret-right:before { content: "\f0da"; } -.icon-columns:before { content: "\f0db"; } -.icon-sort:before { content: "\f0dc"; } -.icon-sort-down:before { content: "\f0dd"; } -.icon-sort-up:before { content: "\f0de"; } - -.icon-envelope-alt:before { content: "\f0e0"; } -.icon-linkedin:before { content: "\f0e1"; } -.icon-undo:before { content: "\f0e2"; } -.icon-legal:before { content: "\f0e3"; } -.icon-dashboard:before { content: "\f0e4"; } -.icon-comment-alt:before { content: "\f0e5"; } -.icon-comments-alt:before { content: "\f0e6"; } -.icon-bolt:before { content: "\f0e7"; } -.icon-sitemap:before { content: "\f0e8"; } -.icon-umbrella:before { content: "\f0e9"; } -.icon-paste:before { content: "\f0ea"; } - -.icon-user-md:before { content: "\f200"; } \ No newline at end of file diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index fd5df73..69667a8 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -159,20 +159,24 @@ #tags .tag span { float: right; - width: 0; padding: 0; margin: 0 0 -2px 0; - color: red; - font-size: 11px; + width: 0; cursor: pointer; overflow: hidden; transform: scale(0); transition: width .3s, margin .3s, transform .3s; + + .iconic { + fill: $colorRed; + width: 8px; + filter: drop-shadow($shadowLight); + } } #tags .tag:hover span { - width: 10px; - margin: 0 0 -2px 6px; + width: 9px; + margin: 0 0 -2px 5px; transform: scale(1); } diff --git a/src/styles/main.scss b/src/styles/main.scss index dd5f33f..58580e1 100755 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -45,7 +45,6 @@ input { @import 'animations'; @import 'content'; @import 'contextmenu'; -@import 'font'; @import 'header'; @import 'imageview'; @import 'infobox'; From 7a970a55ed53adbf62e1cf638eab97703c353ebd Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 1 Feb 2015 21:21:58 +0100 Subject: [PATCH 065/190] Fixed view.php --- dist/view.js | Bin 93440 -> 93443 bytes src/scripts/view/main.js | 14 +++++++------- view.php | 20 ++++++++++++++++---- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/dist/view.js b/dist/view.js index d2cc84bf50c56063e07d71e55ee322f3664de615..4863530fc079a3a7aa813de12ee517234242b6b7 100644 GIT binary patch delta 116 zcmZp;#oBy}wP6e6{S-#O=?_yF!?ZK=((;q?EA-Mb^HMaF^fFQtQ&Ni*^pbP(i&K>} z_44yHQp-~FO8gRYQ>Uk1|16v;)zHQyF!E^!AUbj16qln{pWC*z}4s^2;@* J&(C2@0RT
- -
-
+ + + + + + @@ -60,7 +63,16 @@
-
+
+
+

About

+ + + +
+
+
+
From 0630554789a4c8deeb3520c70da02a62c7baa9cd Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 1 Feb 2015 22:08:37 +0100 Subject: [PATCH 066/190] Updated copyright --- dist/main.js | Bin 173381 -> 173942 bytes php/access/Access.php | 2 +- php/access/Admin.php | 2 +- php/access/Guest.php | 2 +- php/access/Installation.php | 2 +- php/api.php | 2 +- php/autoload.php | 2 +- php/database/update_020100.php | 2 +- php/database/update_020101.php | 2 +- php/database/update_020200.php | 2 +- php/database/update_020500.php | 2 +- php/database/update_020505.php | 2 +- php/database/update_020601.php | 2 +- php/database/update_020602.php | 2 +- php/database/update_020700.php | 2 +- php/define.php | 2 +- php/modules/Album.php | 2 +- php/modules/Database.php | 2 +- php/modules/Import.php | 2 +- php/modules/Log.php | 2 +- php/modules/Module.php | 2 +- php/modules/Photo.php | 2 +- php/modules/Plugins.php | 2 +- php/modules/Session.php | 2 +- php/modules/Settings.php | 2 +- php/modules/misc.php | 2 +- src/scripts/album.js | 2 +- src/scripts/albums.js | 2 +- src/scripts/build.js | 2 +- src/scripts/contextMenu.js | 2 +- src/scripts/header.js | 2 +- src/scripts/init.js | 2 +- src/scripts/loadingBar.js | 2 +- src/scripts/lychee.js | 2 +- src/scripts/multiselect.js | 2 +- src/scripts/password.js | 2 +- src/scripts/photo.js | 2 +- src/scripts/search.js | 2 +- src/scripts/settings.js | 2 +- src/scripts/swipe.js | 2 +- src/scripts/upload.js | 2 +- src/scripts/view.js | 2 +- src/scripts/view/main.js | 2 +- src/scripts/visible.js | 4 +--- src/styles/_animations.scss | 2 +- src/styles/_content.scss | 2 +- src/styles/_contextmenu.scss | 2 +- src/styles/_etc.scss | 2 +- src/styles/_header.scss | 2 +- src/styles/_imageview.scss | 2 +- src/styles/_infobox.scss | 2 +- src/styles/_loading.scss | 2 +- src/styles/_mediaquery.scss | 2 +- src/styles/_message.scss | 2 +- src/styles/_multiselect.scss | 2 +- src/styles/main.scss | 2 +- 56 files changed, 55 insertions(+), 57 deletions(-) diff --git a/dist/main.js b/dist/main.js index a0baca8e70fa6790e34b403285f8e0e51a4be12e..2f345617f26a7f084cee399c11493429c66ab3ec 100644 GIT binary patch delta 1067 zcmZuvO>7%Q6xM7K;@C>~b7(^evRz{Bl3_zrXoAxrO3XH@TC!oc6x!IL6Ys>{*529f zjuVGC2RLx(b%iW`q^J@|luA{_q8bSS5(o~dLM22M6~O^GA|X)~dZ4X%c2F;HdH?g~ zecyXuZ$$t4HhM7^>oNq9jey3EA|v=DHj0e!x7djYGQ-318=XiCrv`3zfO=+dy#wjt zwL}g<;hv?3!@1Ph1AS&XJtYeT3nJ=uGko)@oe1f{g{QZm&l~%0p+O^0l22l`wpeuv z!sbrGmYK4;M7@L{X1G57dS}GQ*Xy#FH$sJcjN(Q$Yy4S=Sp2c(cFg}fSY=lR(^DuQF%?@>$gkvqlv!9`UO{K2O94lM0%NG2s z+7>Z_J35AL!*dlt7QAIX28cd4AA-e)TxDCjIbMqCDJ8~N!f5{!{Y17Z3Q?M_;7nnJjKNH>Nb79^HZWS-w zB{%q}bY|PJAoHAk2>||W_X66m=hW{~L|em)yioOn)A+%m1S5o)Dus&&C zg0*1q@>#(2#pT<&E>!M{qQ|Q)*|y<2Fj!)NTPv-QSma!^i~=v;tt(Ksbw=%ciBYTl zqD1sCwmB@p*JD>$L>KcO+>{=^cV$uwB)Uqu~S&v!3f=$bQ%61Z_gJ)EFlGcdnkYv(q zyfTVl0nK0(d0j|r+%t}jA+3309DN{x?wLThdy(GgK8Ple-pn3EUo9r7Ym-%%ic%)! zmfR6=RnVz5+_tzc8dE=`_zuh`%A8uZQ=F!r>X-PktYC*UUyDixk~nExi%HqW6H#ek zZ~GxM#1<7a!`kY|ipw%7!D=Ff{c54Wd_Uu0=6T%9@HM5`c@dqRM$zW`*HORJ{PYIe RzY5+>F6mNp#*^-h{sZ_WaD)H= delta 933 zcmZuvTSydP6y}VYtBZEi?#8a=Fq1!1*+s+t#B7SN9GfXi-KECeUw3MEX50PMt+tmQ zdgyfs=>ih;&;=x#XnU!ks0YJ>D5R*DdMtvX%R?7BqtQ#fod4YZbI$jj^YwB0gYoif zkzk3&sie7PunRQzRB)#qX`yw-)^ityP`Gg<_?_aYPlOk6#*$m^_a zoKvZaVynbu!YR+^RqyoL1pvA`wr&#ZoLv6{YP2W~uOjSt|DYY?mScx3iOI)?%uI+= z)f;U(Q5?{s`Mkt?HBY8Dph}C1qGZtl$&zJaielKr$j43XMOcw;J`XtA%eEBEREa@4 zNGI7r4ilYdUYB|mr*?&ox)PN-#PCSRZKyUBGo5C3ye(lRl&Xq}8yjM3lBJl1ko zN%Mh>Gnl5+I$j4sjrTe6Bfg9GI}Z1in3MdQ7cG Date: Mon, 2 Feb 2015 21:55:33 +0100 Subject: [PATCH 067/190] New api object --- dist/main.js | Bin 173942 -> 173166 bytes php/api.php | 4 --- src/scripts/album.js | 60 +++++++++++++++++++++++--------- src/scripts/albums.js | 2 +- src/scripts/api.js | 63 +++++++++++++++++++++++++++++++++ src/scripts/contextMenu.js | 4 +-- src/scripts/lychee.js | 62 +++++++-------------------------- src/scripts/password.js | 9 +++-- src/scripts/photo.js | 69 ++++++++++++++++++++++++++----------- src/scripts/search.js | 6 ++-- src/scripts/settings.js | 42 ++++++++++++++++------ src/scripts/upload.js | 26 ++++++++++---- 12 files changed, 228 insertions(+), 119 deletions(-) create mode 100644 src/scripts/api.js diff --git a/dist/main.js b/dist/main.js index 2f345617f26a7f084cee399c11493429c66ab3ec..fe2a0aa467a7ac7ab9cf955c00f784e7cd77da5a 100644 GIT binary patch delta 11766 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 WH(x=PdWUb8c7cRlbBpv!(f0) link = location.href.replace(location.hash, '').replace('index.html', url); else link = location.href.replace(location.hash, '') + url; diff --git a/src/scripts/albums.js b/src/scripts/albums.js index f9430ec..dbaf44b 100644 --- a/src/scripts/albums.js +++ b/src/scripts/albums.js @@ -22,7 +22,7 @@ albums.load = function() { if (albums.json===null) { - lychee.api('getAlbums', function(data) { + api.post('getAlbums', {}, function(data) { /* Smart Albums */ data.unsortedAlbum = { diff --git a/src/scripts/api.js b/src/scripts/api.js new file mode 100644 index 0000000..9980dd1 --- /dev/null +++ b/src/scripts/api.js @@ -0,0 +1,63 @@ +/** + * @description This module communicates with Lychee's API + * @copyright 2015 by Tobias Reich + */ + +api = { + + path: 'php/api.php' + +} + +api.post = function(fn, params, callback) { + + var success, + error; + + loadingBar.show(); + + params = $.extend({function: fn}, params); + + success = function(data) { + + setTimeout(function() { loadingBar.hide() }, 100); + + // Catch errors + if (typeof data==='string'&& + data.substring(0, 7)==='Error: ') { + lychee.error(data.substring(7, data.length), params, data); + return false; + } + + // Convert 1 to true and an empty string to false + if (data==='1') data = true; + else if (data==='') data = false; + + // Convert to JSON if string start with '{' and ends with '}' + if (typeof data==='string'&& + data.substring(0, 1)==='{'&& + data.substring(data.length-1, data.length)==='}') data = $.parseJSON(data); + + // Output response when debug mode is enabled + if (lychee.debugMode) console.log(data); + + callback(data); + + } + + error = function(jqXHR, textStatus, errorThrown) { + + lychee.error('Server error or API not found.', params, errorThrown); + + } + + $.ajax({ + type: 'POST', + url: api.path, + data: params, + dataType: 'text', + success, + error + }); + +} \ No newline at end of file diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index ec9fa40..240548a 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -75,7 +75,7 @@ contextMenu.albumTitle = function(albumID, e) { { type: 'item', title: build.iconic('pencil') + 'Rename', fn: function() { album.setTitle([albumID]) } } ]; - lychee.api('getAlbums', function(data) { + api.post('getAlbums', {}, function(data) { if (data.num!==0) { @@ -176,7 +176,7 @@ contextMenu.move = function(photoIDs, e) { } - lychee.api('getAlbums', function(data) { + api.post('getAlbums', {}, function(data) { if (data.num===0) { diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 4abb18a..044c14b 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -9,7 +9,6 @@ lychee = { version: '3.0.0', version_code: '030000', - api_path: 'php/api.php', update_path: 'http://lychee.electerious.com/version/index.php', updateURL: 'https://github.com/electerious/Lychee', website: 'http://lychee.electerious.com', @@ -37,8 +36,11 @@ lychee.init = function() { var params; - params = 'init&version=' + lychee.version_code; - lychee.api(params, function(data) { + params = { + version: lychee.version_code + } + + api.post('init', params, function(data) { if (data.loggedIn!==true) { lychee.setMode('public'); @@ -71,58 +73,18 @@ lychee.init = function() { } -lychee.api = function(params, callback) { - - loadingBar.show(); - - $.ajax({ - type: 'POST', - url: lychee.api_path, - data: 'function=' + params, - dataType: 'text', - success: function(data) { - - setTimeout(function() { loadingBar.hide() }, 100); - - // Catch errors - if (typeof data==='string'&& - data.substring(0, 7)==='Error: ') { - lychee.error(data.substring(7, data.length), params, data); - return false; - } - - // Convert 1 to true and an empty string to false - if (data==='1') data = true; - else if (data==='') data = false; - - // Convert to JSON if string start with '{' and ends with '}' - if (typeof data==='string'&& - data.substring(0, 1)==='{'&& - data.substring(data.length-1, data.length)==='}') data = $.parseJSON(data); - - // Output response when debug mode is enabled - if (lychee.debugMode) console.log(data); - - callback(data); - - }, - error: function(jqXHR, textStatus, errorThrown) { - - lychee.error('Server error or API not found.', params, errorThrown); - - } - }); - -} - lychee.login = function(data) { var user = data.username, password = md5(data.password), params; - params = 'login&user=' + user + '&password=' + password; - lychee.api(params, function(data) { + params = { + user, + password + } + + api.post('login', params, function(data) { if (data===true) { @@ -184,7 +146,7 @@ lychee.loginDialog = function() { lychee.logout = function() { - lychee.api('logout', function() { + api.post('logout', {}, function() { window.location.reload(); }); diff --git a/src/scripts/password.js b/src/scripts/password.js index f294a64..84448d9 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -31,8 +31,13 @@ password.get = function(albumID, callback) { } else { // Check password - params = 'checkAlbumAccess&albumID=' + albumID + '&password=' + md5(passwd); - lychee.api(params, function(data) { + + params = { + albumID, + password: md5(passwd) + } + + api.post('checkAlbumAccess', params, function(data) { if (data===true) { basicModal.close(); diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 195da39..3bc2ee6 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -27,8 +27,13 @@ photo.load = function(photoID, albumID) { var params, checkPasswd; - params = 'getPhoto&photoID=' + photoID + '&albumID=' + albumID + '&password=' + password.value; - lychee.api(params, function(data) { + params = { + photoID, + albumID, + password: password.value + } + + api.post('getPhoto', params, function(data) { if (data==='Warning: Wrong password!') { checkPasswd = function() { @@ -156,8 +161,11 @@ photo.duplicate = function(photoIDs) { albums.refresh(); - params = 'duplicatePhoto&photoIDs=' + photoIDs; - lychee.api(params, function(data) { + params = { + photoIDs: photoIDs.join() + } + + api.post('duplicatePhoto', params, function(data) { if (data!==true) lychee.error(null, params, data); else album.load(album.getID()); @@ -220,8 +228,11 @@ photo.delete = function(photoIDs) { if (visible.photo()&&nextPhoto!==''&&nextPhoto!==photo.getID()) lychee.goto(album.getID() + '/' + nextPhoto); else if (!visible.albums()) lychee.goto(album.getID()); - params = 'deletePhoto&photoIDs=' + photoIDs; - lychee.api(params, function(data) { + params = { + photoIDs: photoIDs.join() + } + + api.post('deletePhoto', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -299,8 +310,12 @@ photo.setTitle = function(photoIDs) { view.album.content.title(id); }); - params = 'setPhotoTitle&photoIDs=' + photoIDs + '&title=' + escape(encodeURI(newTitle)); - lychee.api(params, function(data) { + params = { + photoIDs: photoIDs.join(), + title: newTitle + } + + api.post('setPhotoTitle', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -359,8 +374,12 @@ photo.setAlbum = function(photoIDs, albumID) { albums.refresh(); - params = 'setPhotoAlbum&photoIDs=' + photoIDs + '&albumID=' + albumID; - lychee.api(params, function(data) { + params = { + photoIDs: photoIDs.join(), + albumID + } + + api.post('setPhotoAlbum', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -385,8 +404,11 @@ photo.setStar = function(photoIDs) { albums.refresh(); - params = 'setPhotoStar&photoIDs=' + photoIDs; - lychee.api(params, function(data) { + params = { + photoIDs: photoIDs.join() + } + + api.post('setPhotoStar', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -396,8 +418,6 @@ photo.setStar = function(photoIDs) { photo.setPublic = function(photoID, e) { - var params; - if (photo.json.public==2) { var action; @@ -440,8 +460,7 @@ photo.setPublic = function(photoID, e) { albums.refresh(); - params = 'setPhotoPublic&photoID=' + photoID; - lychee.api(params, function(data) { + api.post('setPhotoPublic', { photoID }, function(data) { if (data!==true) lychee.error(null, params, data); @@ -469,8 +488,12 @@ photo.setDescription = function(photoID) { view.photo.description(); } - params = 'setPhotoDescription&photoID=' + photoID + '&description=' + escape(encodeURI(description)); - lychee.api(params, function(data) { + params = { + photoID, + description + } + + api.post('setPhotoDescription', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -569,8 +592,12 @@ photo.setTags = function(photoIDs, tags) { album.json.content[id].tags = tags; }); - params = 'setPhotoTags&photoIDs=' + photoIDs + '&tags=' + tags; - lychee.api(params, function(data) { + params = { + photoIDs: photoIDs.join(), + tags + } + + api.post('setPhotoTags', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -666,7 +693,7 @@ photo.getSize = function() { photo.getArchive = function(photoID) { var link, - url = 'php/api.php?function=getPhotoArchive&photoID=' + photoID; + url = api.path + '?function=getPhotoArchive&photoID=' + photoID; if (location.href.indexOf('index.html')>0) link = location.href.replace(location.hash, '').replace('index.html', url); else link = location.href.replace(location.hash, '') + url; diff --git a/src/scripts/search.js b/src/scripts/search.js index db041ac..987d569 100755 --- a/src/scripts/search.js +++ b/src/scripts/search.js @@ -11,8 +11,7 @@ search = { search.find = function(term) { - var params, - albumsData = '', + var albumsData = '', photosData = '', code; @@ -21,8 +20,7 @@ search.find = function(term) { if ($('#search').val().length!==0) { - params = 'search&term=' + term; - lychee.api(params, function(data) { + api.post('search', { term }, function(data) { // Build albums if (data&&data.albums) { diff --git a/src/scripts/settings.js b/src/scripts/settings.js index 74f6fea..fddcb4b 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -22,8 +22,15 @@ settings.createConfig = function() { if (dbHost.length<1) dbHost = 'localhost'; if (dbName.length<1) dbName = 'lychee'; - params = 'dbCreateConfig&dbName=' + escape(dbName) + '&dbUser=' + escape(dbUser) + '&dbPassword=' + escape(dbPassword) + '&dbHost=' + escape(dbHost) + '&dbTablePrefix=' + escape(dbTablePrefix); - lychee.api(params, function(data) { + params = { + dbName, + dbUser, + dbPassword, + dbHost, + dbTablePrefix + } + + api.post('dbCreateConfig', params, function(data) { if (data!==true) { @@ -152,7 +159,13 @@ settings.createLogin = function() { basicModal.close(); params = 'setLogin&username=' + escape(username) + '&password=' + md5(password); - lychee.api(params, function(data) { + + params = { + username, + password: md5(password) + } + + api.post('setLogin', params, function(data) { if (data!==true) { @@ -221,8 +234,13 @@ settings.setLogin = function() { basicModal.close(); - params = 'setLogin&oldPassword=' + md5(oldPassword) + '&username=' + escape(username) + '&password=' + md5(password); - lychee.api(params, function(data) { + params = { + oldPassword: md5(oldPassword), + username, + password: md5(password) + } + + api.post('setLogin', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -274,8 +292,12 @@ settings.setSorting = function() { basicModal.close(); albums.refresh(); - params = 'setSorting&type=' + sorting[0] + '&order=' + sorting[1]; - lychee.api(params, function(data) { + params = { + type: sorting[0], + order: sorting[1] + } + + api.post('setSorting', params, function(data) { if (data===true) { lychee.sorting = 'ORDER BY ' + sorting[0] + ' ' + sorting[1]; @@ -339,8 +361,7 @@ settings.setDropboxKey = function(callback) { action = function(data) { - var params, - key = data.key; + var key = data.key; if (data.key.length<1) { basicModal.error('key'); @@ -349,8 +370,7 @@ settings.setDropboxKey = function(callback) { basicModal.close(); - params = 'setDropboxKey&key=' + key; - lychee.api(params, function(data) { + api.post('setDropboxKey', { key }, function(data) { if (data===true) { lychee.dropboxKey = key; diff --git a/src/scripts/upload.js b/src/scripts/upload.js index 52a2275..75c0077 100755 --- a/src/scripts/upload.js +++ b/src/scripts/upload.js @@ -111,7 +111,7 @@ upload.start = { formData.append('tags', ''); formData.append(0, file); - xhr.open('POST', lychee.api_path); + xhr.open('POST', api.path); xhr.onload = function() { @@ -267,8 +267,12 @@ upload.start = { $('.basicModal .rows .row .status').html('Importing'); - params = 'importUrl&url=' + escape(encodeURI(data.link)) + '&albumID=' + albumID; - lychee.api(params, function(data) { + params = { + url: data.link, + albumID + } + + api.post('importUrl', params, function(data) { basicModal.close(); upload.notify('Import complete'); @@ -326,8 +330,12 @@ upload.start = { $('.basicModal .rows .row .status').html('Importing'); - params = 'importServer&albumID=' + albumID + '&path=' + escape(encodeURI(data.path)); - lychee.api(params, function(data) { + params = { + albumID, + path: data.path + } + + api.post('importServer', params, function(data) { basicModal.close(); upload.notify('Import complete'); @@ -397,8 +405,12 @@ upload.start = { $('.basicModal .rows .row .status').html('Importing'); - params = 'importUrl&url=' + escape(links) + '&albumID=' + albumID; - lychee.api(params, function(data) { + params = { + url: links, + albumID + } + + api.post('importUrl', params, function(data) { basicModal.close(); upload.notify('Import complete'); From 7b1f95688cc0fe78a0f34c180613628d6df098c2 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 2 Feb 2015 23:33:40 +0100 Subject: [PATCH 068/190] Required MySQL username --- src/scripts/settings.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/scripts/settings.js b/src/scripts/settings.js index fddcb4b..446b408 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -19,6 +19,11 @@ settings.createConfig = function() { dbTablePrefix = data.dbTablePrefix || '', params; + if (dbUser.length<1) { + basicModal.error('dbUser'); + return false; + } + if (dbHost.length<1) dbHost = 'localhost'; if (dbName.length<1) dbName = 'lychee'; From 5678de1000e27437e31a0c54b8b3f9638c0d6ca3 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 2 Feb 2015 23:36:33 +0100 Subject: [PATCH 069/190] New naming for all API calls --- dist/main.js | Bin 173166 -> 173353 bytes php/access/Admin.php | 60 ++++++++++++++++++------------------ php/access/Guest.php | 18 +++++------ php/access/Installation.php | 6 ++-- src/scripts/album.js | 14 ++++----- src/scripts/albums.js | 2 +- src/scripts/contextMenu.js | 4 +-- src/scripts/lychee.js | 6 ++-- src/scripts/password.js | 2 +- src/scripts/photo.js | 20 ++++++------ src/scripts/settings.js | 12 +++----- src/scripts/upload.js | 8 ++--- 12 files changed, 75 insertions(+), 77 deletions(-) diff --git a/dist/main.js b/dist/main.js index fe2a0aa467a7ac7ab9cf955c00f784e7cd77da5a..ca922305b86d3551510f2e331973c99c70039c13 100644 GIT binary patch delta 1512 zcmaJ=ZA@Eb6wZ0uwY1^;YXimxg&@r?6?98ju^|n+Gawg88tE8o#%+6{*M8hW-y#`I zvqTc(HVocmSIG2_2|6@$+UT3iAB)Bhf)e5~+z-jj#NfvazZQ)#LC<9rn)&gkr{{Uk zd7kq==e-*X)+>wFYX&QXQ%38&0R;8koJmZM|x`xTc;&vk@ zxA)1wr`%<~8-Q1jR(ipcny&n#6vO$$^Z6wL7v|cyXSieBX|9%Ya~`gp<5L}ckvUJG zuEAt1KxHLXZy)!lkOotPM+4k{&RJ?{u8F)GTjguPXD&laZ&PGq4csq#~$x=&5M z7EGeP?*XUoIsG2~l7Tj~?)U)7#?T(Q3R(PFZcqs%6Y4Nmlq!sUYsHq0v5E#FP!)V7 zYSkQ%YZ#n+wH6uwTCBuNR(|Q#Rg%jcS%v)eD3ZOduDYA{*LzZ5-yY0G_U82!)J^67 z^bR1wM?b%>huFOfI{4?W#EN0_H_--yHc$rRAh6XkcqI!{#RgyG39$UPDW$)i%8s7q_ZJ>-rybp>vug>V#iB*J><;iVdF`7T(B zZTPTdd>{!MxAT{+Ex{)I&-o9_uxWgV^WH7UwLFB8JJ3-IR;}|soMdm_hvpKCM@l46 z(&=R1SxA^<`Mt|22olu!0okKS`5~nkV2IQ*3LRe$dtbg1e0+r z64A{3Bc#!glZLkp)(|VzUcU^*TC1Cw*myI!v_pmVYUuY8TYrLlO7gZF5#5?VTb_YN z_G2rtL0VhiM}eEHkW65sjr3+#Xt*&idxIy%rp&S%Pm$M*X+VD;!5%VZ&Ki+uawJxz zXnjFanH%&!osdRscCNa~?yT2Vy=1t2RFQ*KVqA8_75ubq$3!an#f0Q^2H43HBzuph zNaP@U!AEWywDTh23Oy2~a%?E!bmF|7%8(q}a)GUg#Bcbo(;bh@EH04)2J0>hn+lP0 z#!MhDN-8auZNJ1IYZ@i4EK7Sdu8dHpGs%+Akp)ti&hbX0cquN%sqT0Y8#qUvH)a&C JPm&i8{0)j333vbi delta 1372 zcmZuwTTC2P7|wrY*_+F9E3`ndWx-`vhAq^RP|2ol=wjF~ux4s0(zVR)&cZmmI}3Bx z61!FVP&L{%p<_Ch_Qe-kNmE-_JxP73#tW%YtFiJRF~OR~Tkyq8j1fJv3xz~q=AZBT z&-woEd}rph8}{XS`xV9xT;61#V?fqkFFj5{r&Bk;Cl$Lv&RZ(K1PE%2RaYoDxv9@Y z!NL{^_DZhE!jT;oHpNo!p!-xPg3>FW~kN_E<~qX<0hy)J0MUmrv`jB8GF6# zfWMK;e=yJt)WDB}m#KmLS$-Qc$ooq|rzzPyG+8 z{Fl=#L+{byi^E&$z3iYL=W=7%heZ{8cwbCOV?j!*-aT4iW>dc6fR$#FuRB;{P0gZ%4fWT$22cfkd+K3WS$KqiZ|aN0_t;)0LL#inMC;Tp zI7x3vH+R7>@MN?LE+SfO-SA9I0hNr;!HZ2yRGA`WpTY_h z-tNB%E2a%=I&Xo~wgHE~fl!Tp?pJusWIyU<^-&$w5a(~Ot=cT5CG27~Azn=$v7;~| za}Kn`keAER*7|b#QOD%MxdO46sH)_8E9zzpZ{cwTE2Lxx8aG$Ovl(h$z+!=Pu~=W4 zg({+TqB_P|%w}V!g?!hA&ND_v1$sRron~}~4EfRf=x(<#-3X>#Pxm7SNj!vVplod~ zkA=zAfi2|C0J=~}xM)t?i}r&Ncme7(@FBhIG+0St6v$D((bG(PNs#F=y$b> zYD~z8p0u~s<<1DIdRUo^Q#uvz^eB3H6t$C36g|u6^toOCgetAlbums(); break; - case 'getAlbum': $this->getAlbum(); break; - case 'addAlbum': $this->addAlbum(); break; - case 'setAlbumTitle': $this->setAlbumTitle(); break; - case 'setAlbumDescription': $this->setAlbumDescription(); break; - case 'setAlbumPublic': $this->setAlbumPublic(); break; - case 'deleteAlbum': $this->deleteAlbum(); break; + case 'Album::getAll': $this->getAlbums(); break; + case 'Album::get': $this->getAlbum(); break; + case 'Album::add': $this->addAlbum(); break; + case 'Album::setTitle': $this->setAlbumTitle(); break; + case 'Album::setDescription': $this->setAlbumDescription(); break; + case 'Album::setPublic': $this->setAlbumPublic(); break; + case 'Album::delete': $this->deleteAlbum(); break; # Photo functions - case 'getPhoto': $this->getPhoto(); break; - case 'setPhotoTitle': $this->setPhotoTitle(); break; - case 'setPhotoDescription': $this->setPhotoDescription(); break; - case 'setPhotoStar': $this->setPhotoStar(); break; - case 'setPhotoPublic': $this->setPhotoPublic(); break; - case 'setPhotoAlbum': $this->setPhotoAlbum(); break; - case 'setPhotoTags': $this->setPhotoTags(); break; - case 'duplicatePhoto': $this->duplicatePhoto(); break; - case 'deletePhoto': $this->deletePhoto(); break; + case 'Photo::get': $this->getPhoto(); break; + case 'Photo::setTitle': $this->setPhotoTitle(); break; + case 'Photo::setDescription': $this->setPhotoDescription(); break; + case 'Photo::setStar': $this->setPhotoStar(); break; + case 'Photo::setPublic': $this->setPhotoPublic(); break; + case 'Photo::setAlbum': $this->setPhotoAlbum(); break; + case 'Photo::setTags': $this->setPhotoTags(); break; + case 'Photo::duplicate': $this->duplicatePhoto(); break; + case 'Photo::delete': $this->deletePhoto(); break; # Add functions - case 'upload': $this->upload(); break; - case 'importUrl': $this->importUrl(); break; - case 'importServer': $this->importServer(); break; + case 'Photo::add': $this->upload(); break; + case 'Import::url': $this->importUrl(); break; + case 'Import::server': $this->importServer(); break; # Search functions - case 'search': $this->search(); break; + case 'search': $this->search(); break; # Session functions - case 'init': $this->init(); break; - case 'login': $this->login(); break; - case 'logout': $this->logout(); break; + case 'Session::init': $this->init(); break; + case 'Session::login': $this->login(); break; + case 'Session::logout': $this->logout(); break; # Settings functions - case 'setLogin': $this->setLogin(); break; - case 'setSorting': $this->setSorting(); break; - case 'setDropboxKey': $this->setDropboxKey(); break; + case 'Settings::setLogin': $this->setLogin(); break; + case 'Settings::setSorting': $this->setSorting(); break; + case 'Settings::setDropboxKey': $this->setDropboxKey(); break; # $_GET functions - case 'getAlbumArchive': $this->getAlbumArchive(); break; - case 'getPhotoArchive': $this->getPhotoArchive(); break; + case 'Album::getArchive': $this->getAlbumArchive(); break; + case 'Photo::getArchive': $this->getPhotoArchive(); break; # Error - default: exit('Error: Function not found! Please check the spelling of the called function.'); - return false; break; + default: exit('Error: Function not found! Please check the spelling of the called function.'); + return false; break; } diff --git a/php/access/Guest.php b/php/access/Guest.php index ecea6e4..b5fb2ee 100644 --- a/php/access/Guest.php +++ b/php/access/Guest.php @@ -15,21 +15,21 @@ class Guest extends Access { switch ($fn) { # Album functions - case 'getAlbums': $this->getAlbums(); break; - case 'getAlbum': $this->getAlbum(); break; - case 'checkAlbumAccess': $this->checkAlbumAccess(); break; + case 'Album::getAll': $this->getAlbums(); break; + case 'Album::get': $this->getAlbum(); break; + case 'Album::getPublic': $this->checkAlbumAccess(); break; # Photo functions - case 'getPhoto': $this->getPhoto(); break; + case 'Photo::get': $this->getPhoto(); break; # Session functions - case 'init': $this->init(); break; - case 'login': $this->login(); break; - case 'logout': $this->logout(); break; + case 'Session::init': $this->init(); break; + case 'Session::login': $this->login(); break; + case 'Session::logout': $this->logout(); break; # $_GET functions - case 'getAlbumArchive': $this->getAlbumArchive(); break; - case 'getPhotoArchive': $this->getPhotoArchive(); break; + case 'Album::getArchive': $this->getAlbumArchive(); break; + case 'Photo::getArchive': $this->getPhotoArchive(); break; # Error default: exit('Error: Function not found! Please check the spelling of the called function.'); diff --git a/php/access/Installation.php b/php/access/Installation.php index 4e56c31..eb49c04 100644 --- a/php/access/Installation.php +++ b/php/access/Installation.php @@ -14,11 +14,11 @@ class Installation extends Access { switch ($fn) { - case 'dbCreateConfig': $this->dbCreateConfig(); break; + case 'Database::createConfig': $this->dbCreateConfig(); break; # Error - default: exit('Warning: No configuration!'); - return false; break; + default: exit('Warning: No configuration!'); + return false; break; } diff --git a/src/scripts/album.js b/src/scripts/album.js index 362f4c3..0ed96df 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -47,7 +47,7 @@ album.load = function(albumID, refresh) { password: password.value } - api.post('getAlbum', params, function(data) { + api.post('Album::get', params, function(data) { if (data==='Warning: Album private!') { if (document.location.hash.replace('#', '').split('/')[1]!=undefined) { @@ -120,7 +120,7 @@ album.add = function() { if (title.length===0) title = 'Untitled'; - api.post('addAlbum', { title }, function(data) { + api.post('Album::add', { title }, function(data) { // Avoid first album to be true if (data===true) data = 1; @@ -172,7 +172,7 @@ album.delete = function(albumIDs) { albumIDs: albumIDs.join() } - api.post('deleteAlbum', params, function(data) { + api.post('Album::delete', params, function(data) { if (visible.albums()) { @@ -297,7 +297,7 @@ album.setTitle = function(albumIDs) { title: newTitle } - api.post('setAlbumTitle', params, function(data) { + api.post('Album::setTitle', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -351,7 +351,7 @@ album.setDescription = function(albumID) { description } - api.post('setAlbumDescription', params, function(data) { + api.post('Album::setDescription', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -486,7 +486,7 @@ album.setPublic = function(albumID, e) { downloadable } - api.post('setAlbumPublic', params, function(data) { + api.post('Album::setPublic', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -521,7 +521,7 @@ album.share = function(service) { album.getArchive = function(albumID) { var link, - url = api.path + '?function=getAlbumArchive&albumID=' + albumID; + url = api.path + '?function=Album::getArchive&albumID=' + albumID; if (location.href.indexOf('index.html')>0) link = location.href.replace(location.hash, '').replace('index.html', url); else link = location.href.replace(location.hash, '') + url; diff --git a/src/scripts/albums.js b/src/scripts/albums.js index dbaf44b..8a447ea 100644 --- a/src/scripts/albums.js +++ b/src/scripts/albums.js @@ -22,7 +22,7 @@ albums.load = function() { if (albums.json===null) { - api.post('getAlbums', {}, function(data) { + api.post('Album::getAll', {}, function(data) { /* Smart Albums */ data.unsortedAlbum = { diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index 240548a..390f297 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -75,7 +75,7 @@ contextMenu.albumTitle = function(albumID, e) { { type: 'item', title: build.iconic('pencil') + 'Rename', fn: function() { album.setTitle([albumID]) } } ]; - api.post('getAlbums', {}, function(data) { + api.post('Album::getAll', {}, function(data) { if (data.num!==0) { @@ -176,7 +176,7 @@ contextMenu.move = function(photoIDs, e) { } - api.post('getAlbums', {}, function(data) { + api.post('Album::getAll', {}, function(data) { if (data.num===0) { diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 044c14b..e665b7e 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -40,7 +40,7 @@ lychee.init = function() { version: lychee.version_code } - api.post('init', params, function(data) { + api.post('Session::init', params, function(data) { if (data.loggedIn!==true) { lychee.setMode('public'); @@ -84,7 +84,7 @@ lychee.login = function(data) { password } - api.post('login', params, function(data) { + api.post('Session::login', params, function(data) { if (data===true) { @@ -146,7 +146,7 @@ lychee.loginDialog = function() { lychee.logout = function() { - api.post('logout', {}, function() { + api.post('Session::logout', {}, function() { window.location.reload(); }); diff --git a/src/scripts/password.js b/src/scripts/password.js index 84448d9..b9bf811 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -37,7 +37,7 @@ password.get = function(albumID, callback) { password: md5(passwd) } - api.post('checkAlbumAccess', params, function(data) { + api.post('Album::getPublic', params, function(data) { if (data===true) { basicModal.close(); diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 3bc2ee6..df69c58 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -33,7 +33,7 @@ photo.load = function(photoID, albumID) { password: password.value } - api.post('getPhoto', params, function(data) { + api.post('Photo::get', params, function(data) { if (data==='Warning: Wrong password!') { checkPasswd = function() { @@ -165,7 +165,7 @@ photo.duplicate = function(photoIDs) { photoIDs: photoIDs.join() } - api.post('duplicatePhoto', params, function(data) { + api.post('Photo::duplicate', params, function(data) { if (data!==true) lychee.error(null, params, data); else album.load(album.getID()); @@ -232,7 +232,7 @@ photo.delete = function(photoIDs) { photoIDs: photoIDs.join() } - api.post('deletePhoto', params, function(data) { + api.post('Photo::delete', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -315,7 +315,7 @@ photo.setTitle = function(photoIDs) { title: newTitle } - api.post('setPhotoTitle', params, function(data) { + api.post('Photo::setTitle', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -379,7 +379,7 @@ photo.setAlbum = function(photoIDs, albumID) { albumID } - api.post('setPhotoAlbum', params, function(data) { + api.post('Photo::setAlbum', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -408,7 +408,7 @@ photo.setStar = function(photoIDs) { photoIDs: photoIDs.join() } - api.post('setPhotoStar', params, function(data) { + api.post('Photo::setStar', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -460,7 +460,7 @@ photo.setPublic = function(photoID, e) { albums.refresh(); - api.post('setPhotoPublic', { photoID }, function(data) { + api.post('Photo::setPublic', { photoID }, function(data) { if (data!==true) lychee.error(null, params, data); @@ -493,7 +493,7 @@ photo.setDescription = function(photoID) { description } - api.post('setPhotoDescription', params, function(data) { + api.post('Photo::setDescription', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -597,7 +597,7 @@ photo.setTags = function(photoIDs, tags) { tags } - api.post('setPhotoTags', params, function(data) { + api.post('Photo::setTags', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -693,7 +693,7 @@ photo.getSize = function() { photo.getArchive = function(photoID) { var link, - url = api.path + '?function=getPhotoArchive&photoID=' + photoID; + url = api.path + '?function=Photo::getArchive&photoID=' + photoID; if (location.href.indexOf('index.html')>0) link = location.href.replace(location.hash, '').replace('index.html', url); else link = location.href.replace(location.hash, '') + url; diff --git a/src/scripts/settings.js b/src/scripts/settings.js index 446b408..abfc501 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -35,7 +35,7 @@ settings.createConfig = function() { dbTablePrefix } - api.post('dbCreateConfig', params, function(data) { + api.post('Database::createConfig', params, function(data) { if (data!==true) { @@ -163,14 +163,12 @@ settings.createLogin = function() { basicModal.close(); - params = 'setLogin&username=' + escape(username) + '&password=' + md5(password); - params = { username, password: md5(password) } - api.post('setLogin', params, function(data) { + api.post('Settings::setLogin', params, function(data) { if (data!==true) { @@ -245,7 +243,7 @@ settings.setLogin = function() { password: md5(password) } - api.post('setLogin', params, function(data) { + api.post('Settings::setLogin', params, function(data) { if (data!==true) lychee.error(null, params, data); @@ -302,7 +300,7 @@ settings.setSorting = function() { order: sorting[1] } - api.post('setSorting', params, function(data) { + api.post('Settings::setSorting', params, function(data) { if (data===true) { lychee.sorting = 'ORDER BY ' + sorting[0] + ' ' + sorting[1]; @@ -375,7 +373,7 @@ settings.setDropboxKey = function(callback) { basicModal.close(); - api.post('setDropboxKey', { key }, function(data) { + api.post('Settings::setDropboxKey', { key }, function(data) { if (data===true) { lychee.dropboxKey = key; diff --git a/src/scripts/upload.js b/src/scripts/upload.js index 75c0077..e59200b 100755 --- a/src/scripts/upload.js +++ b/src/scripts/upload.js @@ -106,7 +106,7 @@ upload.start = { } - formData.append('function', 'upload'); + formData.append('function', 'Photo::add'); formData.append('albumID', albumID); formData.append('tags', ''); formData.append(0, file); @@ -272,7 +272,7 @@ upload.start = { albumID } - api.post('importUrl', params, function(data) { + api.post('Import::url', params, function(data) { basicModal.close(); upload.notify('Import complete'); @@ -335,7 +335,7 @@ upload.start = { path: data.path } - api.post('importServer', params, function(data) { + api.post('Import::server', params, function(data) { basicModal.close(); upload.notify('Import complete'); @@ -410,7 +410,7 @@ upload.start = { albumID } - api.post('importUrl', params, function(data) { + api.post('Import::url', params, function(data) { basicModal.close(); upload.notify('Import complete'); From 1e3fdc680d699d5b6d144cb1572a70f362c8da01 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 2 Feb 2015 23:37:13 +0100 Subject: [PATCH 070/190] Added Dropbox icon to context --- src/scripts/contextMenu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index 390f297..47d868a 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -11,7 +11,7 @@ contextMenu.add = function(e) { { type: 'item', title: build.iconic('image') + 'Upload Photo', fn: function() { $('#upload_files').click() } }, { type: 'separator' }, { type: 'item', title: build.iconic('link-intact') + 'Import from Link', fn: upload.start.url }, - { type: 'item', title: build.iconic('box') + 'Import from Dropbox', fn: upload.start.dropbox }, + { type: 'item', title: build.iconic('dropbox', 'ionicons', 'ionicons') + 'Import from Dropbox', fn: upload.start.dropbox }, { type: 'item', title: build.iconic('terminal') + 'Import from Server', fn: upload.start.server }, { type: 'separator' }, { type: 'item', title: build.iconic('folder') + 'New Album', fn: album.add } @@ -28,7 +28,7 @@ contextMenu.settings = function(e) { var items = [ { type: 'item', title: build.iconic('person') + 'Change Login', fn: settings.setLogin }, { type: 'item', title: build.iconic('sort-ascending') + 'Change Sorting', fn: settings.setSorting }, - { type: 'item', title: build.iconic('box') + 'Set Dropbox', fn: settings.setDropboxKey }, + { type: 'item', title: build.iconic('dropbox', 'ionicons', 'ionicons') + 'Set Dropbox', fn: settings.setDropboxKey }, { type: 'separator' }, { type: 'item', title: build.iconic('info') + 'About Lychee', fn: function() { window.open(lychee.website) } }, { type: 'item', title: build.iconic('wrench') + 'Diagnostics', fn: function() { window.open('plugins/check/') } }, From dd2a57e5f82ee305c9ba70ddcf545e746628764e Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 7 Feb 2015 00:01:54 +0100 Subject: [PATCH 071/190] Fixed editable state in public mode --- src/scripts/header.js | 21 +++++++++++++++++++++ src/scripts/lychee.js | 9 ++------- src/styles/_contextmenu.scss | 5 +++-- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/scripts/header.js b/src/scripts/header.js index deaba99..9d4aa90 100644 --- a/src/scripts/header.js +++ b/src/scripts/header.js @@ -58,6 +58,15 @@ header.hide = function(e, delay) { } +header.setTitle = function(title) { + + var $title = header.dom('#title'), + title = title || 'Untitled'; + + $title.html(title + build.iconic('caret-bottom')); + +} + header.setMode = function(mode) { var albumID = album.getID(); @@ -105,4 +114,16 @@ header.setMode = function(mode) { } +} + +header.setEditable = function(editable) { + + var $title = header.dom('#title'); + + // Hide editable icon when not logged in + if (lychee.publicMode===true) editable = false; + + if (editable) $title.addClass('editable'); + else $title.removeClass('editable'); + } \ No newline at end of file diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index e665b7e..d3b3f26 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -230,14 +230,10 @@ lychee.getUpdate = function() { lychee.setTitle = function(title, editable) { - var $title = header.dom('#title'); - document.title = lychee.title + ' - ' + title; - if (editable) $title.addClass('editable'); - else $title.removeClass('editable'); - - $title.html(title + build.iconic('caret-bottom')); + header.setEditable(editable); + header.setTitle(title); } @@ -247,7 +243,6 @@ lychee.setMode = function(mode) { $('#button_trash, #button_move, #button_share, #button_star').remove(); $(document) - .on('mouseenter', '#title.editable', function() { $(this).removeClass('editable') }) .off('click', '#title.editable') .off('touchend', '#title.editable') .off('contextmenu', '.photo') diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index bad7373..fbf5d3f 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -35,13 +35,14 @@ &:hover { background: linear-gradient(to bottom, $colorBlue, darken($colorBlue, 5%)); } } - tr td .albumCover { + tr td .cover { + background-color: #222; border-radius: 2px; box-shadow: 0 0 0 1px black(.5); position: absolute; } - tr td .albumTitle { + tr td .title { display: inline-block; margin: 0 0 3px 26px; } From d0616d678b0ca311ff44395c62077cc53ce24345 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 7 Feb 2015 00:04:20 +0100 Subject: [PATCH 072/190] Quickly switch between photos --- src/scripts/contextMenu.js | 40 ++++++++++++++++++++++++++++++++++---- src/scripts/init.js | 4 ++-- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index 47d868a..d5a1fa1 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -77,19 +77,21 @@ contextMenu.albumTitle = function(albumID, e) { api.post('Album::getAll', {}, function(data) { - if (data.num!==0) { + if (data.num>1) { items.push({ type: 'separator' }); // Generate list of albums $.each(data.content, function(index) { - var that = this; + var that = this, + title = ''; if (!that.thumb0) that.thumb0 = 'src/images/no_cover.svg'; - that.title = "
" + that.title + "
"; - if (that.id!=album.getID()) items.push({ type: 'item', title: that.title, fn: function() { lychee.goto(that.id) } }); + title = "
" + that.title + "
"; + + if (that.id!=albumID) items.push({ type: 'item', title, fn: function() { lychee.goto(that.id) } }); }); @@ -145,6 +147,36 @@ contextMenu.photoMulti = function(photoIDs, e) { } +contextMenu.photoTitle = function(albumID, photoID, e) { + + var items = [ + { type: 'item', title: build.iconic('pencil') + 'Rename', fn: function() { photo.setTitle([photoID]) } } + ]; + + var data = album.json; + + if (data.num>1) { + + items.push({ type: 'separator' }); + + // Generate list of albums + $.each(data.content, function(index) { + + var that = this, + title = ''; + + title = "
" + that.title + "
"; + + if (that.id!=photoID) items.push({ type: 'item', title, fn: function() { lychee.goto(albumID + '/' + that.id) } }); + + }); + + } + + basicContext.show(items, e, contextMenu.close); + +} + contextMenu.photoMore = function(photoID, e) { var items = [ diff --git a/src/scripts/init.js b/src/scripts/init.js index 2df8c2b..935f3d3 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -15,8 +15,8 @@ $(document).ready(function() { /* Header */ header.dom('#title').on(eventName, function(e) { if (!$(this).hasClass('editable')) return false; - if (visible.photo()) photo.setTitle([photo.getID()]); - else contextMenu.albumTitle([album.getID()], e); + if (visible.photo()) contextMenu.photoTitle(album.getID(), photo.getID(), e); + else contextMenu.albumTitle(album.getID(), e); }); header.dom('#button_share').on(eventName, function(e) { if (photo.json.public==1||photo.json.public==2) contextMenu.sharePhoto(photo.getID(), e); From 580228521d7a0c877d76abc9eba16d512413c633 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 7 Feb 2015 00:06:46 +0100 Subject: [PATCH 073/190] Default values for album infobox --- src/scripts/build.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/scripts/build.js b/src/scripts/build.js index dbe8e58..51afa9e 100644 --- a/src/scripts/build.js +++ b/src/scripts/build.js @@ -334,6 +334,7 @@ build.infoboxPhoto = function(data, forView) { infos.forEach(function(info, i, items) { + // Set default for empty values if (info[1]===''||info[1]===null||info[1]===undefined) info[1] = '-'; switch (info[0]) { @@ -457,6 +458,9 @@ build.infoboxAlbum = function(data, forView) { infos.forEach(function(info, i, items) { + // Set default for empty values + if (info[1]===''||info[1]===null||info[1]===undefined) info[1] = '-'; + if (info[0]==='') { // Divider From 36d01240d653d15b50b35c7fe33fb727d5d3d28d Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 7 Feb 2015 00:06:57 +0100 Subject: [PATCH 074/190] Rebuild --- dist/main.css | Bin 34396 -> 34408 bytes dist/main.js | Bin 173353 -> 173949 bytes dist/view.js | Bin 93443 -> 93495 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.css b/dist/main.css index 0bde333b597342bdddc603bce83735c3f81b2eb4..932de008b6283b727b67c0616ac301ac92c69699 100644 GIT binary patch delta 40 wcmcc9!}OwuX+x_AWAfyAVPdSxMn*=~lP7q@vX*3)>Y*B1M zL=Zm|B;X*TR8*{gO2I`G!3W|4#Rsj3QWZbcLJ>jz6TL|lMg7^k=iGD8oVj!Up8MNF z_k{xntp9YTwPka(88q$7M+BP*d}bD#YKDW96tF zGpSLZLSR6|r^ zk|p+wQMIu5!+LDr{BU*-7>*9mSc&z-G`1{+i+!?qJrz_l+xW|%BI~$Ae_%JNyr$-?$Q?e96 zSj}XXwzJ8GzP=FS1H-V$i*%Eo?XFH`68XFmO!3iSsO6DYFc%n)zk&czzIg-|fW@s5 zSP0BHJOZc6Cb#M=LzP1H13$m`7X19tQ&`9co`9EoMxla_KZEiB>lFL@J0)F7WRiAP zHu9FaTAxT(R~NE)%P`b{&X2SbUv+OHS8XaRt>;mXN%8YCyElXEm{_0oSj&arW5haD-)WONtXLQPxlNn6ZnEp8w*vGs1sHf;!rQmG;TLR5_Y zIaQMWXUd6wgmVPk&YMqgnK;Kk!@~gI?<2LrzpshsF;V)>PMFb4eliK1mf7USc69Og MkT`K@j@(-I1Lag!LjV8( delta 638 zcmXX?Ur1AN80FmIzw26N=}Z~oRNAe(yG;7S@?YHqg`kH5vuzL4{ghqiRrF2*2`YrJ z2#SHfCkxU_p9%*4hRlgcw()8rC&xQ>Hb0nnnNRG>RI%4?c$jLb-O4q^ZzQg- zoTc%bmB&u#A_`R72}kx|sno8UwZ32=7^?88h8Xf9VS~Y4RX7YoG*w|TkDS|QU}X_n z&A7P3XIcU3AZ7!|qk8;n5JM!h5PoGq=Ye*_Nu6uQO)_1I;DSWzSO<|p%k z66&}ziCkW?jFNn&Sy3y-j<{=lk!XLNTV=dy8CveHu6CGy?y^b6l$`knmw5FVgBilH zh Date: Sun, 8 Feb 2015 15:27:08 +0100 Subject: [PATCH 075/190] Updated login section in docs --- docs/Settings.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/Settings.md b/docs/Settings.md index 6b121dc..5559b0a 100644 --- a/docs/Settings.md +++ b/docs/Settings.md @@ -17,10 +17,10 @@ All settings are stored in the database. You can change the properties manually, #### Login - username = Username for Lychee - password = Password for Lychee, saved as an md5 hash + username = Username for Lychee (hashed) + password = Password for Lychee (hashed) -Your photos and albums are protected by an username and password you need to set. If both rows are empty, Lychee will prompt you to set them. +Your photos and albums are protected by an username and password. If both rows are empty, Lychee will prompt you to set them. #### Thumb Quality @@ -31,7 +31,7 @@ Less means an inferiority quality of your thumbs, but faster loading. More means #### Check For Updates checkForUpdates = [0|1] - + If `1`, Lychee will check if you are using the latest version. The notice will be displayed beside the version-number when you sign in. #### Sorting @@ -45,15 +45,15 @@ A typical part of a MySQL statement. This string will be appended to mostly ever This key is required to use the Dropbox import feature from your server. Lychee will ask you for this key, the first time you try to use the import. You can get your personal drop-ins app key from [their website](https://www.dropbox.com/developers/apps/create). dropboxKey = Your personal App Key - + #### Imagick imagick = [0|1] - + If `1`, Lychee will use Imagick when available. Disable [Imagick](http://www.imagemagick.org) if you have problems or if you are using an outdated version. Lychee will use [GD](http://php.net/manual/en/book.image.php) when Imagick is disabled or not available. #### Medium medium = [0|1] - + If `1`, Lychee will create a second, smaller version of your photo. This feature requires [Imagick](http://www.imagemagick.org) on your server and an activated `imagick` option the the settings table. \ No newline at end of file From 0c97151f4f158f0e5f7cfcfac7775802542c7cab Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 8 Feb 2015 15:29:06 +0100 Subject: [PATCH 076/190] Added direct access protection to database updates --- php/database/update_020100.php | 2 ++ php/database/update_020101.php | 2 ++ php/database/update_020200.php | 2 ++ php/database/update_020500.php | 2 ++ php/database/update_020505.php | 2 ++ php/database/update_020601.php | 2 ++ php/database/update_020602.php | 2 ++ php/database/update_020700.php | 2 ++ 8 files changed, 16 insertions(+) diff --git a/php/database/update_020100.php b/php/database/update_020100.php index a230ef9..a9c9c9b 100644 --- a/php/database/update_020100.php +++ b/php/database/update_020100.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + $query = Database::prepare($database, "SELECT `tags` FROM `?` LIMIT 1", array(LYCHEE_TABLE_PHOTOS)); if(!$database->query($query)) { $query = Database::prepare($database, "ALTER TABLE `?` ADD `tags` VARCHAR( 1000 ) NULL DEFAULT ''", array(LYCHEE_TABLE_PHOTOS)); diff --git a/php/database/update_020101.php b/php/database/update_020101.php index 6a02658..435477e 100644 --- a/php/database/update_020101.php +++ b/php/database/update_020101.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + $query = Database::prepare($database, "ALTER TABLE `?` CHANGE `value` `value` VARCHAR( 200 ) NULL DEFAULT ''", array(LYCHEE_TABLE_SETTINGS)); $result = $database->query($query); if (!$result) { diff --git a/php/database/update_020200.php b/php/database/update_020200.php index 4d3269e..161ccc2 100644 --- a/php/database/update_020200.php +++ b/php/database/update_020200.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + $query = Database::prepare($database, "SELECT `visible` FROM `?` LIMIT 1", array(LYCHEE_TABLE_ALBUMS)); if (!$database->query($query)) { $query = Database::prepare($database, "ALTER TABLE `?` ADD `visible` TINYINT(1) NOT NULL DEFAULT 1", array(LYCHEE_TABLE_ALBUMS)); diff --git a/php/database/update_020500.php b/php/database/update_020500.php index 9e2bf3d..9892961 100644 --- a/php/database/update_020500.php +++ b/php/database/update_020500.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + # Add `plugins` $query = Database::prepare($database, "SELECT `key` FROM `?` WHERE `key` = 'plugins' LIMIT 1", array(LYCHEE_TABLE_SETTINGS)); $result = $database->query($query); diff --git a/php/database/update_020505.php b/php/database/update_020505.php index e205126..6c25fa0 100644 --- a/php/database/update_020505.php +++ b/php/database/update_020505.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + # Add `checksum` $query = Database::prepare($database, "SELECT `checksum` FROM `?` LIMIT 1", array(LYCHEE_TABLE_PHOTOS)); if (!$database->query($query)) { diff --git a/php/database/update_020601.php b/php/database/update_020601.php index 8dec41c..453114b 100644 --- a/php/database/update_020601.php +++ b/php/database/update_020601.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + # Add `downloadable` $query = Database::prepare($database, "SELECT `downloadable` FROM `?` LIMIT 1", array(LYCHEE_TABLE_ALBUMS)); if (!$database->query($query)) { diff --git a/php/database/update_020602.php b/php/database/update_020602.php index d6962c3..a97f263 100644 --- a/php/database/update_020602.php +++ b/php/database/update_020602.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + # Add a checksum $query = Database::prepare($database, "SELECT `id`, `url` FROM `?` WHERE `checksum` IS NULL", array(LYCHEE_TABLE_PHOTOS)); $result = $database->query($query); diff --git a/php/database/update_020700.php b/php/database/update_020700.php index c233745..659e708 100644 --- a/php/database/update_020700.php +++ b/php/database/update_020700.php @@ -5,6 +5,8 @@ # @copyright 2015 by Tobias Reich ### +if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!'); + # Add medium to photos $query = Database::prepare($database, "SELECT `medium` FROM `?` LIMIT 1", array(LYCHEE_TABLE_PHOTOS)); if (!$database->query($query)) { From 3f4bfe253d642bd1b898e32ba0a931e6245b5d16 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 8 Feb 2015 15:36:13 +0100 Subject: [PATCH 077/190] Removed useless md5 hashing in front-end and added username hashing in back-end --- dist/main.js | Bin 173949 -> 173914 bytes php/database/update_030000.php | 37 +++++++++++++++++++++++++++++++++ php/modules/Album.php | 9 ++++---- php/modules/Database.php | 3 ++- php/modules/Session.php | 23 ++++++++++---------- php/modules/Settings.php | 19 ++++++++--------- php/modules/misc.php | 2 +- src/scripts/album.js | 2 +- src/scripts/lychee.js | 2 +- src/scripts/password.js | 4 ++-- src/scripts/settings.js | 6 +++--- 11 files changed, 72 insertions(+), 35 deletions(-) create mode 100644 php/database/update_030000.php diff --git a/dist/main.js b/dist/main.js index a11c5e4421d59180e24512e2025afc98d5a9d02e..10ce618dba37417f4a02318894eb06ab96ee20cd 100644 GIT binary patch delta 111 zcmex+j_cMru7)j)bC*nCxP;Ma`<*3>Em>TtdIgEa#pU@$Dcke;nVRLM7tCQ4na-`p zrkH9>7g)+DJ6&c8qXcVNVvdI9_G?QRTeJ8%a`N0!d|RZhw`|RA3JPA`USH diff --git a/php/database/update_030000.php b/php/database/update_030000.php new file mode 100644 index 0000000..632277d --- /dev/null +++ b/php/database/update_030000.php @@ -0,0 +1,37 @@ +query($query); +if (!$resetUsername) { + Log::error($database, 'update_030000', __LINE__, 'Could not reset username (' . $database->error . ')'); + return false; +} +$query = Database::prepare($database, "UPDATE `?` SET `value` = '' WHERE `key` = 'password' LIMIT 1", array(LYCHEE_TABLE_SETTINGS)); +$resetPassword = $database->query($query); +if (!$resetPassword) { + Log::error($database, 'update_030000', __LINE__, 'Could not reset password (' . $database->error . ')'); + return false; +} + +# Make public albums private and reset password +# Password now saved as crypt without md5. Legacy code has been removed. +$query = Database::prepare($database, "UPDATE `?` SET `public` = 0, `password` = NULL", array(LYCHEE_TABLE_ALBUMS)); +$resetPublic = $database->query($query); +if (!$resetPublic) { + Log::error($database, 'update_030000', __LINE__, 'Could not reset public albums (' . $database->error . ')'); + return false; +} + +# Set version +if (Database::setVersion($database, '030000')===false) return false; + +?> \ No newline at end of file diff --git a/php/modules/Album.php b/php/modules/Album.php index 51b5e20..a45d398 100644 --- a/php/modules/Album.php +++ b/php/modules/Album.php @@ -547,22 +547,23 @@ class Album extends Module { if (strlen($password)>0) { # Get hashed password - $password = get_hashed_password($password); + $password = getHashedString($password); # Set hashed password # Do not prepare $password because it is hashed and save # Preparing (escaping) the password would destroy the hash $query = Database::prepare($this->database, "UPDATE ? SET password = '$password' WHERE id IN (?)", array(LYCHEE_TABLE_ALBUMS, $this->albumIDs)); - $result = $this->database->query($query); } else { # Unset password $query = Database::prepare($this->database, "UPDATE ? SET password = NULL WHERE id IN (?)", array(LYCHEE_TABLE_ALBUMS, $this->albumIDs)); - $result = $this->database->query($query); } + # Execute query + $result = $this->database->query($query); + # Call plugins $this->plugins(__METHOD__, 1, func_get_args()); @@ -591,7 +592,7 @@ class Album extends Module { $this->plugins(__METHOD__, 1, func_get_args()); if ($album->password=='') return true; - else if ($album->password===$password||$album->password===crypt($password, $album->password)) return true; + else if ($album->password===crypt($password, $album->password)) return true; return false; } diff --git a/php/modules/Database.php b/php/modules/Database.php index 4b76216..317a395 100755 --- a/php/modules/Database.php +++ b/php/modules/Database.php @@ -54,7 +54,8 @@ class Database extends Module { '020505', #2.5.5 '020601', #2.6.1 '020602', #2.6.2 - '020700' #2.7.0 + '020700', #2.7.0 + '030000' #3.0.0 ); # For each update diff --git a/php/modules/Session.php b/php/modules/Session.php index 10da0ba..74381c5 100755 --- a/php/modules/Session.php +++ b/php/modules/Session.php @@ -88,20 +88,18 @@ class Session extends Module { # Call plugins $this->plugins(__METHOD__, 0, func_get_args()); - # Check login with MD5 hash - if ($username===$this->settings['username']&&$password===$this->settings['password']) { - $_SESSION['login'] = true; - return true; - } + $username = crypt($username, $this->settings['username']); + $password = crypt($password, $this->settings['password']); # Check login with crypted hash - if ($username===$this->settings['username']&&$this->settings['password']===crypt($password, $this->settings['password'])) { - $_SESSION['login'] = true; - return true; + if ($this->settings['username']===$username&& + $this->settings['password']===$password) { + $_SESSION['login'] = true; + return true; } # No login - if ($this->settings['username']===''&&$this->settings['password']==='') { + if ($this->noLogin()===true) { $_SESSION['login'] = true; return true; } @@ -119,9 +117,10 @@ class Session extends Module { self::dependencies(isset($this->settings)); # Check if login credentials exist and login if they don't - if ($this->settings['username']===''&&$this->settings['password']==='') { - $_SESSION['login'] = true; - return true; + if ($this->settings['username']===''&& + $this->settings['password']==='') { + $_SESSION['login'] = true; + return true; } return false; diff --git a/php/modules/Settings.php b/php/modules/Settings.php index 2ea74ef..e53a5a4 100755 --- a/php/modules/Settings.php +++ b/php/modules/Settings.php @@ -50,10 +50,10 @@ class Settings extends Module { if ($oldPassword===$settings['password']||$settings['password']===crypt($oldPassword, $settings['password'])) { # Save username - if (!$this->setUsername($username)) exit('Error: Updating username failed!'); + if ($this->setUsername($username)!==true) exit('Error: Updating username failed!'); # Save password - if (!$this->setPassword($password)) exit('Error: Updating password failed!'); + if ($this->setPassword($password)!==true) exit('Error: Updating password failed!'); return true; @@ -68,15 +68,13 @@ class Settings extends Module { # Check dependencies self::dependencies(isset($this->database)); - # Parse - $username = htmlentities($username); - if (strlen($username)>50) { - Log::notice($this->database, __METHOD__, __LINE__, 'Username is longer than 50 chars'); - return false; - } + # Hash username + $username = getHashedString($username); # Execute query - $query = Database::prepare($this->database, "UPDATE ? SET value = '?' WHERE `key` = 'username'", array(LYCHEE_TABLE_SETTINGS, $username)); + # Do not prepare $username because it is hashed and save + # Preparing (escaping) the username would destroy the hash + $query = Database::prepare($this->database, "UPDATE ? SET value = '$username' WHERE `key` = 'username'", array(LYCHEE_TABLE_SETTINGS)); $result = $this->database->query($query); if (!$result) { @@ -92,7 +90,8 @@ class Settings extends Module { # Check dependencies self::dependencies(isset($this->database)); - $password = get_hashed_password($password); + # Hash password + $password = getHashedString($password); # Execute query # Do not prepare $password because it is hashed and save diff --git a/php/modules/misc.php b/php/modules/misc.php index 7c52c80..c449e4a 100755 --- a/php/modules/misc.php +++ b/php/modules/misc.php @@ -97,7 +97,7 @@ function getExtension($filename) { } -function get_hashed_password($password) { +function getHashedString($password) { # Inspired by http://alias.io/2010/01/store-passwords-safely-with-php-and-mysql/ diff --git a/src/scripts/album.js b/src/scripts/album.js index 0ed96df..61c52b9 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -455,7 +455,7 @@ album.setPublic = function(albumID, e) { if (basicModal.visible()) { if ($('.basicModal .choice input[name="password"]:checked').length===1) { - password = md5($('.basicModal .choice input[data-name="password"]').val()); + password = $('.basicModal .choice input[data-name="password"]').val(); album.json.password = 1; } else { password = ''; diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index d3b3f26..af2d130 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -76,7 +76,7 @@ lychee.init = function() { lychee.login = function(data) { var user = data.username, - password = md5(data.password), + password = data.password, params; params = { diff --git a/src/scripts/password.js b/src/scripts/password.js index b9bf811..10440c6 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -34,14 +34,14 @@ password.get = function(albumID, callback) { params = { albumID, - password: md5(passwd) + password: passwd } api.post('Album::getPublic', params, function(data) { if (data===true) { basicModal.close(); - password.value = md5(passwd); + password.value = passwd; callback(); } else { basicModal.error('password'); diff --git a/src/scripts/settings.js b/src/scripts/settings.js index abfc501..f732b70 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -165,7 +165,7 @@ settings.createLogin = function() { params = { username, - password: md5(password) + password } api.post('Settings::setLogin', params, function(data) { @@ -238,9 +238,9 @@ settings.setLogin = function() { basicModal.close(); params = { - oldPassword: md5(oldPassword), + oldPassword, username, - password: md5(password) + password } api.post('Settings::setLogin', params, function(data) { From cca2b09d08797a248033b98b12d839d07bcb08ec Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 8 Feb 2015 15:36:29 +0100 Subject: [PATCH 078/190] Fixed incorrect version in comment --- php/database/update_020700.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php/database/update_020700.php b/php/database/update_020700.php index 659e708..e6e594e 100644 --- a/php/database/update_020700.php +++ b/php/database/update_020700.php @@ -1,7 +1,7 @@ Date: Mon, 16 Feb 2015 20:26:10 +0100 Subject: [PATCH 079/190] 6to5 now named Babel --- src/gulpfile.js | 4 ++-- src/package.json | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gulpfile.js b/src/gulpfile.js index cd70b80..fbec696 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -29,7 +29,7 @@ gulp.task('view--js', function() { var stream = gulp.src(paths.view.js) - .pipe(plugins['6to5']()) + .pipe(plugins.babel()) .on('error', catchError) .pipe(plugins.concat('_view--javascript.js', {newLine: "\n"})) .pipe(gulp.dest('../dist/')); @@ -80,7 +80,7 @@ gulp.task('main--js', function() { var stream = gulp.src(paths.main.js) - .pipe(plugins['6to5']()) + .pipe(plugins.babel()) .on('error', catchError) .pipe(plugins.concat('_main--javascript.js', {newLine: "\n"})) .pipe(gulp.dest('../dist/')); diff --git a/src/package.json b/src/package.json index f74c5de..a379dd6 100644 --- a/src/package.json +++ b/src/package.json @@ -10,14 +10,14 @@ "url": "https://github.com/electerious/Lychee.git" }, "devDependencies": { - "gulp": "^3.8.10", - "gulp-6to5": "^3.0.0", + "gulp": "^3.8.11", "gulp-autoprefixer": "2.1.0", - "gulp-concat": "^2.4.3", + "gulp-babel": "^4.0.0", + "gulp-concat": "^2.5.0", "gulp-load-plugins": "^0.8.0", - "gulp-minify-css": "^0.4.3", + "gulp-minify-css": "^0.4.5", "gulp-rimraf": "^0.1.1", - "gulp-sass": "^1.3.2", + "gulp-sass": "^1.3.3", "gulp-uglify": "^1.1.0" } } From 810338f13a8b09b63983e4e3311600b3dbe076c1 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Mon, 16 Feb 2015 20:27:27 +0100 Subject: [PATCH 080/190] Syntax adjustments --- php/access/Guest.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/php/access/Guest.php b/php/access/Guest.php index b5fb2ee..e90587c 100644 --- a/php/access/Guest.php +++ b/php/access/Guest.php @@ -58,8 +58,8 @@ class Guest extends Access { if ($album->getPublic()) { # Album public - if ($album->checkPassword($_POST['password'])) echo json_encode($album->get()); - else echo 'Warning: Wrong password!'; + if ($album->checkPassword($_POST['password'])) echo json_encode($album->get()); + else echo 'Warning: Wrong password!'; } else { @@ -78,8 +78,8 @@ class Guest extends Access { if ($album->getPublic()) { # Album public - if ($album->checkPassword($_POST['password'])) echo true; - else echo false; + if ($album->checkPassword($_POST['password'])) echo true; + else echo false; } else { @@ -97,8 +97,8 @@ class Guest extends Access { Module::dependencies(isset($_POST['photoID'], $_POST['albumID'], $_POST['password'])); $photo = new Photo($this->database, $this->plugins, null, $_POST['photoID']); - if ($photo->getPublic($_POST['password'])) echo json_encode($photo->get($_POST['albumID'])); - else echo 'Warning: Wrong password!'; + if ($photo->getPublic($_POST['password'])) echo json_encode($photo->get($_POST['albumID'])); + else echo 'Warning: Wrong password!'; } @@ -138,8 +138,8 @@ class Guest extends Access { if ($album->getPublic()&&$album->getDownloadable()) { # Album Public - if ($album->checkPassword($_GET['password'])) $album->getArchive(); - else exit('Warning: Wrong password!'); + if ($album->checkPassword($_GET['password'])) $album->getArchive(); + else exit('Warning: Wrong password!'); } else { From c07c43b023aac3661c9a21798e56a009d90698fb Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 22 Feb 2015 21:52:42 +0100 Subject: [PATCH 081/190] Adjusted indention --- src/scripts/build.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scripts/build.js b/src/scripts/build.js index 51afa9e..9fcd1c3 100644 --- a/src/scripts/build.js +++ b/src/scripts/build.js @@ -76,13 +76,13 @@ build.album = function(data) { if (data.thumb0.split('.').pop()==='svg') typeThumb = 'nonretina'; html = ` -
+
thumb thumb thumb
-

${ title }

- ${ data.sysdate } +

${ title }

+ ${ data.sysdate }
` From a50e8bf90c7fd9a8f30e53e923c1436fa1e7d63b Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Tue, 24 Feb 2015 20:54:47 +0100 Subject: [PATCH 082/190] Disabled directory listing --- .htaccess | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.htaccess b/.htaccess index 257eede..e63c168 100644 --- a/.htaccess +++ b/.htaccess @@ -1,4 +1,4 @@ -IndexIgnore * +Options -Indexes # --- # Uncomment these lines to change PHP parameters if you are using the PHP Apache module From bd2bf9d543d8a38715ed46cd5d70cf044666f3c8 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Wed, 25 Feb 2015 20:54:26 +0100 Subject: [PATCH 083/190] Rebuild --- dist/main.js | Bin 173914 -> 173915 bytes dist/view.js | Bin 93495 -> 93496 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.js b/dist/main.js index 10ce618dba37417f4a02318894eb06ab96ee20cd..a2b128b4f6d3506ebc959cc7e88cb9dd46b5fdd4 100644 GIT binary patch delta 33 rcmV++0N(%F&I;Sk3V^f$AGMdgzX1ogC$#}#0hhPA0V21kwgIy62yhQ# delta 28 mcmV+%0OSAL&I;Pj3V^f$AGNn0wE<}Xm$|tCA-Afw0kQDGE)7Tk diff --git a/dist/view.js b/dist/view.js index 3349187aa07cae3ad726521d9530fdb68cace2b9..3b2d68fd6b43bda9379a39112af085dba07f3993 100644 GIT binary patch delta 33 pcmdmfi*?5>)`l&NGkvD_1u(L2U+BY_$T*$Rk5PHMvLB;}JOJlT3o-xz delta 28 kcmdmSi*@@g)`l&NGkvzt@L|kkoNgS*sJLClk5NP(0IyaF=l}o! From f3ce2de49f70ca24a877fad7af3da5a6759bbc3d Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Wed, 25 Feb 2015 21:02:03 +0100 Subject: [PATCH 084/190] Added lychee-FlashAir to plugins --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a302adb..6da2c59 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ Here's a list of all available Plugins and Extensions: | lychee-redirect | Redirect from an album-name to a Lychee-album | [More »](https://github.com/electerious/lychee-redirect) | | lychee-watermark | Adds a second watermarked photo when uploading images | [More »](https://github.com/electerious/lychee-watermark) | | lychee-rss | Creates a RSS-Feed out of your photos | [More »](https://github.com/cternes/Lychee-RSS) | +| lychee-FlashAir | Import from a Toshiba FlashAir WiFi SD card | [More »](https://github.com/mhp/Lychee-FlashAir) | ## Troubleshooting From ed0df727c5df69e93f3776af2f9b2e23ad865566 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Wed, 25 Feb 2015 21:16:30 +0100 Subject: [PATCH 085/190] Added new plugin import hook #306 --- docs/Plugins.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/Plugins.md b/docs/Plugins.md index dfa6eb7..38d853b 100644 --- a/docs/Plugins.md +++ b/docs/Plugins.md @@ -151,4 +151,12 @@ These hooks are called from `php/modules/Session.php`. | Session::login:before | Someone logs in | | Session::login:after | | | Session::logout:before | User logs out | -| Session::logout:after | | \ No newline at end of file +| Session::logout:after | | + +##### Import +These hooks are called from `php/modules/Import.php`. + +| Name | Description | +|:-----------|:------------|:------------| +| Import::server:before | User imports photos from the server | +| Import::server:after | | \ No newline at end of file From c06e3d16ae040ea5ab713d0b9ba716a3e1c287ef Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 27 Feb 2015 18:11:07 +0100 Subject: [PATCH 086/190] Updated deps --- src/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/package.json b/src/package.json index a379dd6..8a9148b 100644 --- a/src/package.json +++ b/src/package.json @@ -13,9 +13,9 @@ "gulp": "^3.8.11", "gulp-autoprefixer": "2.1.0", "gulp-babel": "^4.0.0", - "gulp-concat": "^2.5.0", - "gulp-load-plugins": "^0.8.0", - "gulp-minify-css": "^0.4.5", + "gulp-concat": "^2.5.2", + "gulp-load-plugins": "^0.8.1", + "gulp-minify-css": "^0.4.6", "gulp-rimraf": "^0.1.1", "gulp-sass": "^1.3.3", "gulp-uglify": "^1.1.0" From 452a19254cb659fdefd6335a4782fab6489673a7 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 27 Feb 2015 20:33:03 +0100 Subject: [PATCH 087/190] Fixed move photo --- src/scripts/contextMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index d5a1fa1..9659fb9 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -225,7 +225,7 @@ contextMenu.move = function(photoIDs, e) { var that = this; if (!that.thumb0) that.thumb0 = 'src/images/no_cover.svg'; - that.title = "
" + that.title + "
"; + that.title = "
" + that.title + "
"; if (that.id!=album.getID()) items.push({ type: 'item', title: that.title, fn: function() { photo.setAlbum(photoIDs, that.id) } }); From 67dce773e634c7d00a72e62bedd63c35520e2571 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 27 Feb 2015 20:37:24 +0100 Subject: [PATCH 088/190] Updated Album::getAll --- dist/main.css | Bin 34408 -> 33566 bytes dist/main.js | Bin 173915 -> 174199 bytes php/modules/Album.php | 55 +++++++++++++++++++++++-------------- src/scripts/album.js | 10 +++---- src/scripts/albums.js | 42 ++++++++++++++-------------- src/scripts/contextMenu.js | 4 +-- src/scripts/password.js | 2 +- src/scripts/view.js | 21 ++++++++------ 8 files changed, 77 insertions(+), 57 deletions(-) diff --git a/dist/main.css b/dist/main.css index 932de008b6283b727b67c0616ac301ac92c69699..980c5d30cfaaf386057b24528cb4095c949be54c 100644 GIT binary patch delta 1440 zcmah}TTmNi6rSDGGzm!w0Ry>_4UtQdC4@^9f-saaU@I*KXUgRPyJR=8W5|YNfiPJ=Ng>Tb)CDO&rcI1`*|AolqZDi!tMN{a9@mXE z&YU-<1`A1<^@_>3G%jVC;9QzZrG&JCzgs+OTNEj!JGE%nJ76(*$Tzx|Y4nelSlD2k zt`+@)Boy@89> zAL09G5%jfgd|h*qMC(c@ZEl+awMz$9{5s_PR_1>?%ySgR#z+U{Q}3lJDF(VJgXKUE zmV9M-^BUWiH!GVmIj=ayO$f81Fvske>>dFM?!Dm91e-JD=lW5thHVU?v&C7S>v~q0 zkEgjQA;Y9*5*a}WRqy&-`-4_e9G@pK5)P%ZOo(Z2PG#{^iwl)u7a0!!L7U_>m&_zM zSs1Ac`Oq=uw5BClJ*ua}u4CGY|8lLjUUwb{Zd7X(ULLNi$8^MDt#9Imi2^)Qw;hHr z+kEDKzl*=xh7N-Dt!hHVBZ2$D)ky7qAh{VaYVEu@EApx;3ah@0D431=9l0F|oyZF! zt1e?fQ0mxDx#-7yWV366!fL#Vyw?3H1$R#a26_TS=~)i?$5>E=MIMU2yBfD#P zC#8%m@N=R(xev*roDdY;?)4xvuSZeeG=8NlR6BXD@6Hi3sszNtrGj_FaweSj@)5gUS&m}8eI+~$|nCL8jA8c>8S z-h`_7S+W}cM2pTTgZg7JVSU7aPnRmlt*IAjXiRR3#phX@`QZHWbHJrJYw;m4wM{+U zOD$ckoJLYScaOsHY#Dx6jAU^BvxjiX gXe3?F_i4z7OGC6;H@sY>%k7L!foGW^!^>vsAIr-LZU6uP delta 1282 zcmb7DU2Icj7|wUvo=X4LpZ(OXj?>Pv9m*;FVQuLlh@0CGV=WP+grC_zwKC2rYX`$^ zty>7j1jfpf7)OY3!3~KC=!aY_a$`(1{_Mg?7)%$#g^7k}xF9jcdAe){p*P%oU-G=~ z`@GNl_t8n_*Ha9&livx3`)o+{HBz-|E88NbFz3~g(Ai287T;Fm z8-o=)j8-CIo6(7g(S~zLAL2S4W|Ds5!#``DMm)*F;B9-tU@Ulh@M+nqb1`kTV|e`#qy_ zA(hFOj>iJyy z-fUp$&FA(LEQC5?$$IGS=T8&D;g{}>%4_NI5{_=^DHDA0Vhf2tEqk%>!dF=8Jx1T} zyRW9dz2ssr+3RA0JoND_E^bdF*wu)y2P_!dWl(-APQUsT&At*LxUox%n~6iXusu`9 zNsApj&)`~OJ-xM4R;`lu?>=G3=8J{F)bW@kOF3`}J3Qmf7<*YyRj*0R%1%A9_A84{ zXObp0s)7@oR*m^^11{{-qm6B)ngc%&oC#>K#F}tBY+5#ax8I3PT~_>ja2R(7E-Tme zz=f&TD|O0p&|vBk!9=gSR=Pi9$G!C7dVaW)$Epx z{qbMBZ>{u!-jRPIt38qy zh=%Sv`nd+??lyejY@>lOQMD{%HLDM%cOCRvrGdfs6D^96dlMYyCYp&zO_OHwFZa^M AUH||9 diff --git a/dist/main.js b/dist/main.js index a2b128b4f6d3506ebc959cc7e88cb9dd46b5fdd4..06eb4ff8f62df1e85e1b8aedeacc41d9b87efeb7 100644 GIT binary patch delta 2680 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 Zx9J^aT!l;L84b*P3ye^pUu7zq{|S7gPO<<1 diff --git a/php/modules/Album.php b/php/modules/Album.php index a45d398..5c74a84 100644 --- a/php/modules/Album.php +++ b/php/modules/Album.php @@ -154,8 +154,15 @@ class Album extends Module { # Call plugins $this->plugins(__METHOD__, 0, func_get_args()); + # Initialize return var + $return = array( + 'smartalbums' => null, + 'albums' => null, + 'num' => 0 + ); + # Get SmartAlbums - if ($public===false) $return = $this->getSmartInfo(); + if ($public===false) $return['smartalbums'] = $this->getSmartInfo(); # Albums query $query = Database::prepare($this->database, 'SELECT id, title, public, sysstamp, password FROM ? WHERE public = 1 AND visible <> 0', array(LYCHEE_TABLE_ALBUMS)); @@ -192,7 +199,7 @@ class Album extends Module { } # Add to return - $return['content'][$album['id']] = $album; + $return['albums'][$album['id']] = $album; } @@ -211,29 +218,25 @@ class Album extends Module { # Check dependencies self::dependencies(isset($this->database, $this->settings)); + # Initialize return var + $return = array( + 'unsorted' => null, + 'public' => null, + 'starred' => null, + 'recent' => null + ); + # Unsorted $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE album = 0 ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); $unsorted = $this->database->query($query); $i = 0; while($row = $unsorted->fetch_object()) { if ($i<3) { - $return["unsortedThumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row->thumbUrl; + $return['unsorted']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row->thumbUrl; $i++; } else break; } - $return['unsortedNum'] = $unsorted->num_rows; - - # Public - $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE public = 1 ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); - $public = $this->database->query($query); - $i = 0; - while($row2 = $public->fetch_object()) { - if ($i<3) { - $return["publicThumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row2->thumbUrl; - $i++; - } else break; - } - $return['publicNum'] = $public->num_rows; + $return['unsorted']['num'] = $unsorted->num_rows; # Starred $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE star = 1 ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); @@ -241,11 +244,23 @@ class Album extends Module { $i = 0; while($row3 = $starred->fetch_object()) { if ($i<3) { - $return["starredThumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; + $return['starred']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; $i++; } else break; } - $return['starredNum'] = $starred->num_rows; + $return['starred']['num'] = $starred->num_rows; + + # Public + $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE public = 1 ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); + $public = $this->database->query($query); + $i = 0; + while($row2 = $public->fetch_object()) { + if ($i<3) { + $return['public']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row2->thumbUrl; + $i++; + } else break; + } + $return['public']['num'] = $public->num_rows; # Recent $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE LEFT(id, 10) >= unix_timestamp(DATE_SUB(NOW(), INTERVAL 1 DAY)) ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); @@ -253,11 +268,11 @@ class Album extends Module { $i = 0; while($row3 = $recent->fetch_object()) { if ($i<3) { - $return["recentThumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; + $return['recent']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; $i++; } else break; } - $return['recentNum'] = $recent->num_rows; + $return['recent']['num'] = $recent->num_rows; return $return; diff --git a/src/scripts/album.js b/src/scripts/album.js index 61c52b9..b75460f 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -179,7 +179,7 @@ album.delete = function(albumIDs) { albumIDs.forEach(function(id) { albums.json.num--; view.albums.content.delete(id); - delete albums.json.content[id]; + delete albums.json.albums[id]; }); } else { @@ -209,7 +209,7 @@ album.delete = function(albumIDs) { // Get title if (album.json) albumTitle = album.json.title; - else if (albums.json) albumTitle = albums.json.content[albumIDs].title; + else if (albums.json) albumTitle = albums.json.albums[albumIDs].title; msg = "

Are you sure you want to delete the album '" + albumTitle + "' and all of the photos it contains? This action can't be undone!

"; @@ -253,7 +253,7 @@ album.setTitle = function(albumIDs) { // Get old title if only one album is selected if (album.json) oldTitle = album.json.title; - else if (albums.json) oldTitle = albums.json.content[albumIDs].title; + else if (albums.json) oldTitle = albums.json.albums[albumIDs].title; if (!oldTitle) oldTitle = ''; oldTitle = oldTitle.replace("'", '''); @@ -280,13 +280,13 @@ album.setTitle = function(albumIDs) { if (albums.json) { var id = albumIDs[0]; - albums.json.content[id].title = newTitle; + albums.json.albums[id].title = newTitle; } } else if (visible.albums()) { albumIDs.forEach(function(id) { - albums.json.content[id].title = newTitle; + albums.json.albums[id].title = newTitle; view.albums.content.title(id); }); diff --git a/src/scripts/albums.js b/src/scripts/albums.js index 8a447ea..a93f176 100644 --- a/src/scripts/albums.js +++ b/src/scripts/albums.js @@ -25,44 +25,44 @@ albums.load = function() { api.post('Album::getAll', {}, function(data) { /* Smart Albums */ - data.unsortedAlbum = { + data.smartalbums.unsorted = { id: 0, title: 'Unsorted', - sysdate: data.unsortedNum + ' photos', + sysdate: data.smartalbums.unsorted.num + ' photos', unsorted: '1', - thumb0: data.unsortedThumb0, - thumb1: data.unsortedThumb1, - thumb2: data.unsortedThumb2 + thumb0: data.smartalbums.unsorted.thumb0, + thumb1: data.smartalbums.unsorted.thumb1, + thumb2: data.smartalbums.unsorted.thumb2 }; - data.starredAlbum = { + data.smartalbums.starred = { id: 'f', title: 'Starred', - sysdate: data.starredNum + ' photos', + sysdate: data.smartalbums.starred.num + ' photos', star: '1', - thumb0: data.starredThumb0, - thumb1: data.starredThumb1, - thumb2: data.starredThumb2 + thumb0: data.smartalbums.starred.thumb0, + thumb1: data.smartalbums.starred.thumb1, + thumb2: data.smartalbums.starred.thumb2 }; - data.publicAlbum = { + data.smartalbums.public = { id: 's', title: 'Public', - sysdate: data.publicNum + ' photos', + sysdate: data.smartalbums.public.num + ' photos', public: '1', - thumb0: data.publicThumb0, - thumb1: data.publicThumb1, - thumb2: data.publicThumb2 + thumb0: data.smartalbums.public.thumb0, + thumb1: data.smartalbums.public.thumb1, + thumb2: data.smartalbums.public.thumb2 }; - data.recentAlbum = { + data.smartalbums.recent = { id: 'r', title: 'Recent', - sysdate: data.recentNum + ' photos', + sysdate: data.smartalbums.recent.num + ' photos', recent: '1', - thumb0: data.recentThumb0, - thumb1: data.recentThumb1, - thumb2: data.recentThumb2 + thumb0: data.smartalbums.recent.thumb0, + thumb1: data.smartalbums.recent.thumb1, + thumb2: data.smartalbums.recent.thumb2 }; albums.json = data; @@ -79,7 +79,7 @@ albums.load = function() { setTimeout(function() { header.setMode('albums'); view.albums.init(); - lychee.animate('.album, .photo', 'contentZoomIn'); + lychee.animate('.album', 'contentZoomIn'); }, waitTime); }); diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index 9659fb9..2a3e70f 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -82,7 +82,7 @@ contextMenu.albumTitle = function(albumID, e) { items.push({ type: 'separator' }); // Generate list of albums - $.each(data.content, function(index) { + $.each(data.albums, function(index) { var that = this, title = ''; @@ -220,7 +220,7 @@ contextMenu.move = function(photoIDs, e) { } else { // Generate list of albums - $.each(data.content, function(index) { + $.each(data.albums, function(index) { var that = this; diff --git a/src/scripts/password.js b/src/scripts/password.js index 10440c6..6267559 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -16,7 +16,7 @@ password.get = function(albumID, callback) { if (!lychee.publicMode) callback(); else if (album.json&&album.json.password==false) callback(); - else if (albums.json&&albums.json.content[albumID].password==false) callback(); + else if (albums.json&&albums.json.albums[albumID].password==false) callback(); else if (!albums.json&&!album.json) { // Continue without password diff --git a/src/scripts/view.js b/src/scripts/view.js index 2668b71..8385358 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -49,16 +49,21 @@ view.albums = { albumsData = ''; /* Smart Albums */ - albums.parse(albums.json.unsortedAlbum); - albums.parse(albums.json.publicAlbum); - albums.parse(albums.json.starredAlbum); - albums.parse(albums.json.recentAlbum); - if (!lychee.publicMode) smartData = build.divider('Smart Albums') + build.album(albums.json.unsortedAlbum) + build.album(albums.json.starredAlbum) + build.album(albums.json.publicAlbum) + build.album(albums.json.recentAlbum); + if (!lychee.publicMode) { + + albums.parse(albums.json.smartalbums.unsorted); + albums.parse(albums.json.smartalbums.public); + albums.parse(albums.json.smartalbums.starred); + albums.parse(albums.json.smartalbums.recent); + + smartData = build.divider('Smart Albums') + build.album(albums.json.smartalbums.unsorted) + build.album(albums.json.smartalbums.public) + build.album(albums.json.smartalbums.starred) + build.album(albums.json.smartalbums.recent); + + } /* Albums */ - if (albums.json.content&&albums.json.num!==0) { + if (albums.json.albums&&albums.json.num!==0) { - $.each(albums.json.content, function() { + $.each(albums.json.albums, function() { albums.parse(this); // Display albums in reverse order @@ -88,7 +93,7 @@ view.albums = { title: function(albumID) { var longTitle = '', - title = albums.json.content[albumID].title; + title = albums.json.albums[albumID].title; if (title!==null&&title.length>18) { longTitle = title; From b226f879b0027a13bbe9548c9aa4e051f6d6be6e Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 27 Feb 2015 21:16:22 +0100 Subject: [PATCH 089/190] Streamlines type of password --- dist/main.js | Bin 174199 -> 174382 bytes dist/view.js | Bin 93496 -> 93613 bytes php/modules/Album.php | 4 ++-- src/scripts/album.js | 10 +++++----- src/scripts/albums.js | 2 +- src/scripts/build.js | 20 ++++++++++---------- src/scripts/header.js | 2 +- src/scripts/password.js | 6 +++--- src/scripts/photo.js | 2 +- src/scripts/view.js | 9 +++++---- 10 files changed, 28 insertions(+), 27 deletions(-) diff --git a/dist/main.js b/dist/main.js index 06eb4ff8f62df1e85e1b8aedeacc41d9b87efeb7..f44d49812ebb8888fc76ccc2aee145048a7be943 100644 GIT binary patch delta 616 zcmex;k%a{yIZ0eKK*tRQ6&31%Q`yTCF=KW0{2TU$kg?Qts^x!Bl%%7NVJ8S5EkIl$uf z8mZF{Tw@g3K4(2+I;Q|cK2@(EvADQAzbIw;=^cz3+pTsoT5wJF3FNRX%g;R5YnX5*exzkr4VeA3>2idGlh*=G%8CkcNA7xa4_!y#MJJ7ZoMpCRWKE>G1 z3Jg4}%;^u0Fp5mSc#5$E!^&c?mD_<<_9{cem-juR1MBp4Ul}E~r+i`bVw}Dm7(LsM zePxWW0C|~J+`dFZ(<(71sWewFt2jSTO$`)Rz_JqvzX-g0EgAc{{R30 delta 407 zcmZ2?iR=3Xu7)j)&zCS7PJgw8QD%DJQbw)mMoSrIG8#-Tn8_s0Y-nXL{o@iwQ7E6$ zV7tOHMnC51DWOaz+n29oyv8bz)hDx@!wyAmriN(d``9;$O{Ta2kANOZ8=bG#j$YEcWpP8ay z0927!lwO*fnpaXBZ5V5>XlRAZ*U7V0Qqsu;64phjC8b4q3MD`tiiT=x(|!CHB^fiP zOD8c(O%IM@yaO^+jW|Q6?@wTqnC>6VSi+8M+V;oMj1J7GLeBAwC5$8*-7cYIpk!5K jtK^rjWSvx$nwV{!oLHO+43FtCiHxPF7JN)(bms;D2F78z delta 251 zcmZ2`n{~%6)`l&N{r>!^dIgEa#pU@$DYmw@iU!jQ{TRij=lU}WZ9neMXu&nvdlr|W zl9EoQt&);;QEEwPQJzAHB1om0T25thMk-K$X;MyRvTuG$DpXt}bGl&+qxAIZD8}0$ z{nOi`8M|chYTB+F!|2S+3RW}SJBd+x`-FJL5=O9YlSIZ=F-1eGB3mWDd?o9oqSVA} g>*U1ZRG@1wCNh>P;x$=KO(PNH9Qo~SNsQ{;0Mg7(SO5S3 diff --git a/php/modules/Album.php b/php/modules/Album.php index 5c74a84..7ed8d76 100644 --- a/php/modules/Album.php +++ b/php/modules/Album.php @@ -83,7 +83,7 @@ class Album extends Module { $albums = $this->database->query($query); $return = $albums->fetch_assoc(); $return['sysdate'] = date('d M. Y', $return['sysstamp']); - $return['password'] = ($return['password']=='' ? false : true); + $return['password'] = ($return['password']=='' ? '0' : '1'); $query = Database::prepare($this->database, "SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE album = '?' " . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS, $this->albumIDs)); break; @@ -180,7 +180,7 @@ class Album extends Module { # Parse info $album['sysdate'] = date('F Y', $album['sysstamp']); - $album['password'] = ($album['password'] != ''); + $album['password'] = ($album['password']=='' ? '0' : '1'); # Thumbs if (($public===true&&$album['password']===false)||($public===false)) { diff --git a/src/scripts/album.js b/src/scripts/album.js index b75460f..cd604bc 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -456,10 +456,10 @@ album.setPublic = function(albumID, e) { if ($('.basicModal .choice input[name="password"]:checked').length===1) { password = $('.basicModal .choice input[data-name="password"]').val(); - album.json.password = 1; + album.json.password = '1'; } else { password = ''; - album.json.password = 0; + album.json.password = '0'; } if ($('.basicModal .choice input[name="listed"]:checked').length===1) listed = true; @@ -469,8 +469,8 @@ album.setPublic = function(albumID, e) { if (visible.album()) { - album.json.public = (album.json.public==0) ? 1 : 0; - album.json.password = (album.json.public==0) ? 0 : album.json.password; + album.json.public = (album.json.public==='0') ? '1' : '0'; + album.json.password = (album.json.public==='0') ? '0' : album.json.password; view.album.public(); view.album.password(); @@ -526,7 +526,7 @@ album.getArchive = function(albumID) { if (location.href.indexOf('index.html')>0) link = location.href.replace(location.hash, '').replace('index.html', url); else link = location.href.replace(location.hash, '') + url; - if (lychee.publicMode) link += '&password=' + password.value; + if (lychee.publicMode===true) link += '&password=' + password.value; location.href = link; diff --git a/src/scripts/albums.js b/src/scripts/albums.js index a93f176..b0a0289 100644 --- a/src/scripts/albums.js +++ b/src/scripts/albums.js @@ -96,7 +96,7 @@ albums.load = function() { albums.parse = function(album) { - if (album.password&&lychee.publicMode) { + if (album.password==='1'&&lychee.publicMode===true) { album.thumb0 = 'src/images/password.svg'; album.thumb1 = 'src/images/password.svg'; album.thumb2 = 'src/images/password.svg'; diff --git a/src/scripts/build.js b/src/scripts/build.js index 9fcd1c3..15fd865 100644 --- a/src/scripts/build.js +++ b/src/scripts/build.js @@ -92,7 +92,7 @@ build.album = function(data) { if (data.public==='1') html += `${ build.iconic('eye') }`; if (data.unsorted==='1') html += `${ build.iconic('list') }`; if (data.recent==='1') html += `${ build.iconic('clock') }`; - if (data.password===true) html += `${ build.iconic('lock-locked') }`; + if (data.password==='1') html += `${ build.iconic('lock-locked') }`; } @@ -244,12 +244,12 @@ build.uploadModal = function(title, files) { } -build.tags = function(tags, forView) { +build.tags = function(tags, forView = false) { var html = '', editTagsHTML = ''; - if (forView!==true&&lychee.publicMode!==true) editTagsHTML = ' ' + build.editIcon('edit_tags'); + if (forView===false&&lychee.publicMode===false) editTagsHTML = ' ' + build.editIcon('edit_tags'); if (tags!=='') { @@ -271,7 +271,7 @@ build.tags = function(tags, forView) { } -build.infoboxPhoto = function(data, forView) { +build.infoboxPhoto = function(data, forView = false) { var html = '', visible = '', @@ -293,7 +293,7 @@ build.infoboxPhoto = function(data, forView) { } - if (forView!==true&&lychee.publicMode!==true) { + if (forView===false&&lychee.publicMode===false) { editTitleHTML = ' ' + build.editIcon('edit_title'); editDescriptionHTML = ' ' + build.editIcon('edit_description'); } @@ -355,7 +355,7 @@ build.infoboxPhoto = function(data, forView) { case 'Tags': // Tags - if (forView!==true&&lychee.publicMode===false) { + if (forView===false&&lychee.publicMode===false) { html += ` @@ -395,7 +395,7 @@ build.infoboxPhoto = function(data, forView) { } -build.infoboxAlbum = function(data, forView) { +build.infoboxAlbum = function(data, forView = false) { var html = '', visible = '', @@ -418,9 +418,9 @@ build.infoboxAlbum = function(data, forView) { switch (data.password) { - case false: password = 'No'; + case '0': password = 'No'; break; - case true: password = 'Yes'; + case '1': password = 'Yes'; break; default: password = '-'; break; @@ -438,7 +438,7 @@ build.infoboxAlbum = function(data, forView) { } - if (forView!==true&&lychee.publicMode!==true) { + if (forView===false&&lychee.publicMode===false) { editTitleHTML = ' ' + build.editIcon('edit_title_album'); editDescriptionHTML = ' ' + build.editIcon('edit_description_album'); } diff --git a/src/scripts/header.js b/src/scripts/header.js index 9d4aa90..e03da05 100644 --- a/src/scripts/header.js +++ b/src/scripts/header.js @@ -91,7 +91,7 @@ header.setMode = function(mode) { album.json.content === false ? $('#button_archive').hide() : $('#button_archive').show(); // Hide download button when not logged in and album not downloadable - if (lychee.publicMode&&album.json.downloadable==='0') $('#button_archive').hide(); + if (lychee.publicMode===true&&album.json.downloadable==='0') $('#button_archive').hide(); if (albumID==='s'||albumID==='f'||albumID==='r') { $('#button_info_album, #button_trash_album, #button_share_album').hide(); diff --git a/src/scripts/password.js b/src/scripts/password.js index 6267559..247c39f 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -14,9 +14,9 @@ password.get = function(albumID, callback) { var passwd = $('.basicModal input.text').val(), params; - if (!lychee.publicMode) callback(); - else if (album.json&&album.json.password==false) callback(); - else if (albums.json&&albums.json.albums[albumID].password==false) callback(); + if (lychee.publicMode===false) callback(); + else if (album.json&&album.json.password==='0') callback(); + else if (albums.json&&albums.json.albums[albumID].password==='0') callback(); else if (!albums.json&&!album.json) { // Continue without password diff --git a/src/scripts/photo.js b/src/scripts/photo.js index df69c58..bb9d21a 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -698,7 +698,7 @@ photo.getArchive = function(photoID) { if (location.href.indexOf('index.html')>0) link = location.href.replace(location.hash, '').replace('index.html', url); else link = location.href.replace(location.hash, '') + url; - if (lychee.publicMode) link += '&password=' + password.value; + if (lychee.publicMode===true) link += '&password=' + password.value; location.href = link; diff --git a/src/scripts/view.js b/src/scripts/view.js index 8385358..1b7280e 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -49,7 +49,7 @@ view.albums = { albumsData = ''; /* Smart Albums */ - if (!lychee.publicMode) { + if (lychee.publicMode===false) { albums.parse(albums.json.smartalbums.unsorted); albums.parse(albums.json.smartalbums.public); @@ -70,7 +70,8 @@ view.albums = { albumsData = build.album(this) + albumsData; }); - if (!lychee.publicMode) albumsData = build.divider('Albums') + albumsData; + // Add divider + if (lychee.publicMode===false) albumsData = build.divider('Albums') + albumsData; } @@ -275,8 +276,8 @@ view.album = { password: function() { - if (album.json.password==1) $('#infobox .attr_password').html('Yes'); - else $('#infobox .attr_password').html('No'); + if (album.json.password==='1') $('#infobox .attr_password').html('Yes'); + else $('#infobox .attr_password').html('No'); }, From 138bf714c5d938bb7aa4266ac70f3aa75659827b Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 27 Feb 2015 22:14:19 +0100 Subject: [PATCH 090/190] Streamlined type of star and public --- dist/main.js | Bin 174382 -> 174298 bytes src/scripts/album.js | 4 +- src/scripts/albums.js | 84 ++++++++++++++++++++++-------------------- src/scripts/photo.js | 10 ++--- src/scripts/view.js | 8 ++-- 5 files changed, 56 insertions(+), 50 deletions(-) diff --git a/dist/main.js b/dist/main.js index f44d49812ebb8888fc76ccc2aee145048a7be943..922236e310c5a11b59c4a7eb87e124364af9091f 100644 GIT binary patch delta 661 zcmZ2?iR;!yu7)j)=JQyT43uoA7tCZ5o4((biEVqxJVrha79~Td;P%R8jNB~KAD(8E z&`8WlD$Om{i%%{}O)NtaY76c2u1rb>(-RjniBF#}jftHDF165_Nq9R@)|3ev*$bG&5VHJpm?WU_4HTaa zjBnxTQ{0(!rk`HQC@?*LF%#$XsOd~R2n|5vM7RHTXZohO{Zk>+LqJ2M$jGAad zuh%l_7@?@rE6pp;FDgk*(JRR)%}p}U0aJ!nD2k>Vu49zYK@mdJXH<(SJw0|EhUM++ z7}e3-vwj_;xIe17#U+VFMKI?WLY!lS>Kr{3H5gWZT*s(|W{=EzM%`Q#d!m&JN|SOj zla*rec^q98cK4vG0=a1V#6BkB=`+_eDlkIX2iG$yLfHc7c7jzyMG3l9suFOEW=?g8H#HQ!FFtIWNg|}C`FnKUB8cb(&XA+YIDby*;OfA;~ zn}G0_hNg}oNJ%Kn1kvgLr!jG{fK8USW)j^#!=34yCL`DOzCxyljN1!}nU*Ut8^UZe sp2oBh#uMER)G5paOtWG$nf|jeg3T41p8J_mYP#-BCc*8o3z%v-08@V!Z diff --git a/src/scripts/album.js b/src/scripts/album.js index cd604bc..00ced60 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -384,7 +384,7 @@ album.setPublic = function(albumID, e) { albums.refresh(); - if (!basicModal.visible()&&album.json.public==0) { + if (!basicModal.visible()&&album.json.public==='0') { var msg = '', action; @@ -475,7 +475,7 @@ album.setPublic = function(albumID, e) { view.album.public(); view.album.password(); - if (album.json.public==1) contextMenu.shareAlbum(albumID, e); + if (album.json.public==='1') contextMenu.shareAlbum(albumID, e); } diff --git a/src/scripts/albums.js b/src/scripts/albums.js index b0a0289..72dbb81 100644 --- a/src/scripts/albums.js +++ b/src/scripts/albums.js @@ -25,45 +25,7 @@ albums.load = function() { api.post('Album::getAll', {}, function(data) { /* Smart Albums */ - data.smartalbums.unsorted = { - id: 0, - title: 'Unsorted', - sysdate: data.smartalbums.unsorted.num + ' photos', - unsorted: '1', - thumb0: data.smartalbums.unsorted.thumb0, - thumb1: data.smartalbums.unsorted.thumb1, - thumb2: data.smartalbums.unsorted.thumb2 - }; - - data.smartalbums.starred = { - id: 'f', - title: 'Starred', - sysdate: data.smartalbums.starred.num + ' photos', - star: '1', - thumb0: data.smartalbums.starred.thumb0, - thumb1: data.smartalbums.starred.thumb1, - thumb2: data.smartalbums.starred.thumb2 - }; - - data.smartalbums.public = { - id: 's', - title: 'Public', - sysdate: data.smartalbums.public.num + ' photos', - public: '1', - thumb0: data.smartalbums.public.thumb0, - thumb1: data.smartalbums.public.thumb1, - thumb2: data.smartalbums.public.thumb2 - }; - - data.smartalbums.recent = { - id: 'r', - title: 'Recent', - sysdate: data.smartalbums.recent.num + ' photos', - recent: '1', - thumb0: data.smartalbums.recent.thumb0, - thumb1: data.smartalbums.recent.thumb1, - thumb2: data.smartalbums.recent.thumb2 - }; + if (lychee.publicMode===false) albums._createSmartAlbums(data.smartalbums); albums.json = data; @@ -108,6 +70,50 @@ albums.parse = function(album) { } +albums._createSmartAlbums = function(data) { + + data.unsorted = { + id: 0, + title: 'Unsorted', + sysdate: data.unsorted.num + ' photos', + unsorted: '1', + thumb0: data.unsorted.thumb0, + thumb1: data.unsorted.thumb1, + thumb2: data.unsorted.thumb2 + }; + + data.starred = { + id: 'f', + title: 'Starred', + sysdate: data.starred.num + ' photos', + star: '1', + thumb0: data.starred.thumb0, + thumb1: data.starred.thumb1, + thumb2: data.starred.thumb2 + }; + + data.public = { + id: 's', + title: 'Public', + sysdate: data.public.num + ' photos', + public: '1', + thumb0: data.public.thumb0, + thumb1: data.public.thumb1, + thumb2: data.public.thumb2 + }; + + data.recent = { + id: 'r', + title: 'Recent', + sysdate: data.recent.num + ' photos', + recent: '1', + thumb0: data.recent.thumb0, + thumb1: data.recent.thumb1, + thumb2: data.recent.thumb2 + }; + +} + albums.refresh = function() { albums.json = null; diff --git a/src/scripts/photo.js b/src/scripts/photo.js index bb9d21a..9755c44 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -393,12 +393,12 @@ photo.setStar = function(photoIDs) { if (!photoIDs) return false; if (visible.photo()) { - photo.json.star = (photo.json.star==0) ? 1 : 0; + photo.json.star = (photo.json.star==='0') ? '1' : '0'; view.photo.star(); } photoIDs.forEach(function(id, index, array) { - album.json.content[id].star = (album.json.content[id].star==0) ? 1 : 0; + album.json.content[id].star = (album.json.content[id].star==='0') ? '1' : '0'; view.album.content.star(id); }); @@ -449,13 +449,13 @@ photo.setPublic = function(photoID, e) { if (visible.photo()) { - photo.json.public = (photo.json.public==0) ? 1 : 0; + photo.json.public = (photo.json.public==='0') ? '1' : '0'; view.photo.public(); - if (photo.json.public==1) contextMenu.sharePhoto(photoID, e); + if (photo.json.public==='1') contextMenu.sharePhoto(photoID, e); } - album.json.content[photoID].public = (album.json.content[photoID].public==0) ? 1 : 0; + album.json.content[photoID].public = (album.json.content[photoID].public==='0') ? '1' : '0'; view.album.content.public(photoID); albums.refresh(); diff --git a/src/scripts/view.js b/src/scripts/view.js index 1b7280e..745087a 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -209,14 +209,14 @@ view.album = { star: function(photoID) { $('.photo[data-id="' + photoID + '"] .iconic-star').remove(); - if (album.json.content[photoID].star==1) $('.photo[data-id="' + photoID + '"]').append("" + build.iconic('star') + ""); + if (album.json.content[photoID].star==='1') $('.photo[data-id="' + photoID + '"]').append("" + build.iconic('star') + ""); }, public: function(photoID) { $('.photo[data-id="' + photoID + '"] .iconic-share').remove(); - if (album.json.content[photoID].public==1) $('.photo[data-id="' + photoID + '"]').append(""); + if (album.json.content[photoID].public==='1') $('.photo[data-id="' + photoID + '"]').append(""); }, @@ -253,7 +253,7 @@ view.album = { public: function() { - if (album.json.public==1) { + if (album.json.public==='1') { $('#button_share_album') .addClass('active') @@ -378,7 +378,7 @@ view.photo = { public: function() { - if (photo.json.public==1||photo.json.public==2) { + if (photo.json.public==='1'||photo.json.public==='2') { // Photo public $('#button_share') .addClass('active') From 1490dcbe9e34b2a12154371498b48de3efc80dee Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 27 Feb 2015 22:39:07 +0100 Subject: [PATCH 091/190] Removed md5 from search, renamed code var to hash --- php/modules/misc.php | 10 ++++++++++ src/bower.json | 1 - src/gulpfile.js | 1 - src/scripts/lychee.js | 4 ++-- src/scripts/search.js | 32 ++++++++++++++++---------------- src/scripts/visible.js | 2 +- 6 files changed, 29 insertions(+), 21 deletions(-) diff --git a/php/modules/misc.php b/php/modules/misc.php index c449e4a..2094790 100755 --- a/php/modules/misc.php +++ b/php/modules/misc.php @@ -13,6 +13,13 @@ function search($database, $settings, $term) { $return['albums'] = ''; + # Initialize return var + $return = array( + 'photos' => null, + 'albums' => null, + 'hash' => '' + ); + # Photos $query = Database::prepare($database, "SELECT id, title, tags, public, star, album, thumbUrl FROM ? WHERE title LIKE '%?%' OR description LIKE '%?%' OR tags LIKE '%?%'", array(LYCHEE_TABLE_PHOTOS, $term, $term, $term)); $result = $database->query($query); @@ -48,6 +55,9 @@ function search($database, $settings, $term) { } + # Hash + $return['hash'] = md5(json_encode($return)); + return $return; } diff --git a/src/bower.json b/src/bower.json index 13a28eb..892d78a 100644 --- a/src/bower.json +++ b/src/bower.json @@ -3,7 +3,6 @@ "private": true, "dependencies": { "jQuery": "~2.1.3", - "js-md5": "~1.1.0", "mousetrap": "~1.4.6", "basicContext": "~2.0.2", "basicModal": "~2.0.3" diff --git a/src/gulpfile.js b/src/gulpfile.js index fbec696..08ba53a 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -59,7 +59,6 @@ paths.main = { ], scripts: [ 'bower_components/jQuery/dist/jquery.min.js', - 'bower_components/js-md5/js/md5.min.js', 'bower_components/mousetrap/mousetrap.min.js', 'bower_components/mousetrap/plugins/global-bind/mousetrap-global-bind.min.js', 'bower_components/basicContext/dist/basicContext.min.js', diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index af2d130..6cda479 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -201,9 +201,9 @@ lychee.load = function() { } else { // Trash albums.json when filled with search results - if (search.code!=='') { + if (search.hash!==null) { albums.json = null; - search.code = ''; + search.hash = null; } // Trash data diff --git a/src/scripts/search.js b/src/scripts/search.js index 987d569..10c181c 100755 --- a/src/scripts/search.js +++ b/src/scripts/search.js @@ -5,15 +5,15 @@ search = { - code: null + hash: null } search.find = function(term) { - var albumsData = '', - photosData = '', - code; + var albumsData = '', + photosData = '', + html = ''; clearTimeout($(window).data('timeout')); $(window).data('timeout', setTimeout(function() { @@ -24,8 +24,8 @@ search.find = function(term) { // Build albums if (data&&data.albums) { - albums.json = { content: data.albums }; - $.each(albums.json.content, function() { + albums.json = { albums: data.albums }; + $.each(albums.json.albums, function() { albums.parse(this); albumsData += build.album(this); }); @@ -43,28 +43,28 @@ search.find = function(term) { // 2. Only photos found // 3. Only albums found // 4. Albums and photos found - if (albumsData===''&&photosData==='') code = 'error'; - else if (albumsData==='') code = build.divider('Photos') + photosData; - else if (photosData==='') code = build.divider('Albums') + albumsData; - else code = build.divider('Photos') + photosData + build.divider('Albums') + albumsData; + if (albumsData===''&&photosData==='') html = 'error'; + else if (albumsData==='') html = build.divider('Photos') + photosData; + else if (photosData==='') html = build.divider('Albums') + albumsData; + else html = build.divider('Photos') + photosData + build.divider('Albums') + albumsData; // Only refresh view when search results are different - if (search.code!==md5(code)) { + if (search.hash!==data.hash) { $('.no_content').remove(); lychee.animate('.album, .photo', 'contentZoomOut'); lychee.animate('.divider', 'fadeOut'); - search.code = md5(code); + search.hash = data.hash; setTimeout(function() { - if (code==='error') { + if (html==='error') { lychee.content.html(''); $('body').append(build.no_content('magnifying-glass')); } else { - lychee.content.html(code); + lychee.content.html(html); lychee.animate('.album, .photo', 'contentZoomIn'); $('img[data-type!="svg"]').retina(); } @@ -86,13 +86,13 @@ search.reset = function() { $('#search').val(''); $('.no_content').remove(); - if (search.code!=='') { + if (search.hash!==null) { // Trash data albums.json = null; album.json = null; photo.json = null; - search.code = ''; + search.hash = null; lychee.animate('.divider', 'fadeOut'); albums.load(); diff --git a/src/scripts/visible.js b/src/scripts/visible.js index 15ad6d3..58a40ca 100755 --- a/src/scripts/visible.js +++ b/src/scripts/visible.js @@ -21,7 +21,7 @@ visible.photo = function() { } visible.search = function() { - if (search.code!==null&&search.code!=='') return true; + if (search.hash!==null) return true; return false; } From 4d16696c527e8d1fc9e0527c4364ba3049cc024d Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 28 Feb 2015 21:36:04 +0100 Subject: [PATCH 092/190] Don't show thumbs of protected albums when logged out --- php/modules/Album.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php/modules/Album.php b/php/modules/Album.php index 7ed8d76..afea752 100644 --- a/php/modules/Album.php +++ b/php/modules/Album.php @@ -183,7 +183,7 @@ class Album extends Module { $album['password'] = ($album['password']=='' ? '0' : '1'); # Thumbs - if (($public===true&&$album['password']===false)||($public===false)) { + if (($public===true&&$album['password']==='0')||($public===false)) { # Execute query $query = Database::prepare($this->database, "SELECT thumbUrl FROM ? WHERE album = '?' ORDER BY star DESC, " . substr($this->settings['sorting'], 9) . " LIMIT 3", array(LYCHEE_TABLE_PHOTOS, $album['id'])); From e7cb1b1c773532a9508e98f1a435f63e678d41c4 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 28 Feb 2015 21:36:59 +0100 Subject: [PATCH 093/190] Fixed sharing information in album infobox --- dist/main.js | Bin 174298 -> 170766 bytes src/scripts/album.js | 19 +++++++++++++++---- src/scripts/view.js | 11 +++++++++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/dist/main.js b/dist/main.js index 922236e310c5a11b59c4a7eb87e124364af9091f..2cbb05da48900173eeddce336c4c4b1d39be9bc3 100644 GIT binary patch delta 1614 zcmZuwZERCj7|we-DC^1w?4uiFA1$M4!&%pj=|;z0ZDv{S*lyJ+`)uH@yKMcsceJvN`yp(+^5#_1;7a*!U(^{;a%I`!FRp(axij*xyxyqfw5#_tW zT=m7G*K)wGTrUj+r})bL0N9VNNPqjGW~LyYwcGs;*@1zP2db-(@N5hS_AQVS%6u04L@itt8yRjd$n8QA`(_dwze6h{} zD(_O~zNHaHc7>B<%mT%V)YUqPxlv;9PND4vh-QOonr%g`sFz?pgr4g_sbMrG%b{OS_+d zO8>_cW6#Hw^JZUZxf2KU&PQaIEF@(I=L$)p%!kFK)2sNViqw_8#6X3g9f;@Xqf%B6 zHiAzH3?8B2kAqtl!1`eG!Xh5*quI}cnD+88Xj(#tI6rhZm+tPyR>3lE67P^gsid+K z7p|)o7=~e8d`J$D3;vi87ev`^cUW21D4*P{mr+C1CQ;H)c`sQ;omMWUX6ZLFzL%bO zfBYEa_^^nT_NGeZ%!EGWpC{U=uG7uMYWuFrT8OASW=`r(8fK^T@b=m5)+)cu)NOJM z45mH7_0BrX>f4Nct#>fJzNL;jQ*n6>J>7HpZ@urPD-69bsVg1JR&kFb|qlnfrHzo^mBMyOTk-Sm$lY8fYQj7OnjP%-^`|Tj;=RNE-(4hQzEf=C%7+`~$ z##77T+p4^X$keTCaMz9CsP=L#T&90(9d)o-kB8k*1I2!k+2i&!xZSwEpNhhv=4W{S1ZVT8fvxo(=eM4Cavd9xK&ABo`x!;*TFMZHzu{e zfW^$%>TOPsj?^z8WZ5)rVtN{sYytUt8Y&EKn`dEXJ%ZMf{u#(C84n9-7ato+#a+Wv zT8v5jFh3L{w~wJBa%-A0zA^*t0dnPcuxPg)fq6NF<`9}MTqUMrF)PC)1wIiP)i3HO z`Ktt#=jtm)Pio~B^pZCxn~}Go8gilo<&!g8k+w8Tm?V4;sw8&~AUm1qL8Bm&f?i~) zmKd9jz6UzgY!tmVA(4<0HqQd=C9n3PQd-(wqmrJ94JRd@>4JBF=uryWHEt5P?GnUhjL3~XCE2?iL5*ag{1WmR1I&L7mbybjHQNR;gHSg8kOTQhpkUY+MG^m#|bK` z@g5YDw@#x1VwpnqmH#Q_Bw9I%$M|G2EhUD@#p85p`=?Nod68p67A{(h{L4kEZbOB3 QVG4bdmo-CsX9juDKb?{rP5=M^ delta 5163 zcmZ`-ZEPIH8P=>F9GegVNgxT3*e1E|;_-QBzt{HKwZakn5gQ0nK=vhE&g2O%W6cBntd0I*F6|qZO@6KWIyl3RDyoQ9&y}swkrEpH}HJd;Yld z1zGak&b;%^^FHr0v+wM8UTJ&x&9)ykwUN1UbDP{u=1Th3d&q3*s{=dBPj4L)$ZYwO zZT}QXqdQtlA8tQc`t$bI^1VC0(M*O*@9fHwq0-Rqf0Oa&tUXQmZQpW~43{6jWugVs zKG^^KwObRh*svH#G;o4KAyIllJ3_|GA8YRu82s9Ji;zV58LRhdH18fvlAUvOmL8pVD3)Y(-n*_XHjXiqRoD;;e`Ec<@va{qL9>Lg;4<90lk}!T? zQ^N7-P>GH|(LC;S%$0vJzMlZuCli;j@Hg*zS!fy`3`#Fg+*levGD3#R-#@aiX<{h8 zkP6ZnH(w|W#ZS8@=CZ-zYR3_G-c1L7jt?yO4_=|yZ|p0z9Q_&AeDD5UH%WAYM}9Jh z2W~zPhvI493sPAxFAbK4p4?Hs?!K@Iz+aqPXy#Ov_DpGHyfiWOU3C6+YP8zPl2-M{ zLh^o${xV4s%NNPEO(5~|iH}8nJ&G$^aB3Ro_Yu#KRtDkG>=n{mJXSFOV6F* zEdS%oLEw7E+F3qyc5gSCE6+Ut6whSS3s3Uq2QNO*v2QqVdiur5snfm5E~$qm_+ue< z>)_PsuD%{*=9brQhWFmr|I6bx-*6z9r8h=4Uq7@$kt@Yw9TUN%I9z`7ojC!v&b!Ok zw$6zzu=szG{`=^=OU_Hmi)Cp(8d=bYTD$TDS$qT+|POcUX67+DY#UM$vm zIvZpT=GAHinBafZhZFc zB{z50apU`)5s8j0OSEHV$wN+kPjsboolAMQJs;$<>7cW3b)Y=}SAlfyR4Ui*IijKK zsvdKtu9aWdjlLtg0|U%JU$D}8QQMbugQc9;?ic&}nNg@t^_JH>V^QvT#mepP4+?NJ zpeo(Lx{(hfpJr)_=4o!tI1oKCz@JZD90y_wLlVtPG%Kyo%yRcgbCwqCC;MU$^9tvK zSe9~&>frjk)Y`npY1x7oJAdVA`7fVVJmwv{@}%6CPV$b4LE(H>x+27RO!K63?j(rT zlLdzDKvk$aDSBOo1{&@Deog9PTGH`~eLQGQiBWPRRQq-iHZmz)_o?JU4~ zR$QbRIztzL#!pg{7P}2gwoJoT4GB)OBCH|{jCZjl_6hA)En7D<-GapoEck40!z~n8 znADIBChHcnB|y%K)ddzK12st%xL~rT>58tZvQ&?v2qzi`g5V5|S(a@!;?N@;4Et8L zWKFpO4kNgvnJTnj#xmVt!8p%NZb*dYd zrXd)NH=uxvhzw?1$Qk#D zOV;iquih22U-|jHVQs#dM4Bhm9~8-!cXTr=|uZ2z4VJTpwV=wsEdo zI2||{xmtN7Dd*F+3{}RS;Z)@6^Z~|;j7wcHESqU8LXoQ@gXf+_TIc&gv*l>#=IZnT zpbCP4#8kd{8(>5SDkO%3U4u}~==@kgQpC%UZ+=cX*SckEz>60eCu9Q@ezbEavd(lR z+A#Gv_}L!G9XJ)FKgvuUA^a7?wT@Rhg9>3#+{j5pJ3kHaPKAD=ty_=Lo!P-;rzRq@ zOohj@5ecNoIZ=@sP+!$Z0FBIZ(?HB5X_|Wtkn|-kkN^UimR8Es$(3Ryxn2RLc{R*S zCX|m(Cu(8TJ^^ZrgCx4w5m^zS>8K#9BB~-O zI3hsA+;}>Z${qBl-67P=J(eV)%m%_MfScyvR*LboI4^RrwCbLFm!!~}AbW~V)Su#4 zkv#rIP*Rgnl#`GCuYk|4#>5QVJ+jWcn5}aLX5~I+40wH@kV&aYFX`Agc@;&ojAL0m z(md~D&^eA{OR=KPzT)bo0v=QR0-R0-fEu9w*O}5~-4?7YEKwdre$~X6P#nlo&HW%# zlMGy9I%Sk7nr@huojQ@8c4sujL1!E22b)^ z#ab>Gqq%g3bF{AUQ*|~OkfgzhYbwA0f?VFdt+TVkaq?~|m(D;k({A|wX5psI{1-$Zh0l)(9hC#Ef;!k7 zjZWPu>@Uq9-z;=?hVAbWDSYKl;X(`l9)oLrI65rs4L=;ls^{>Jc;SU%Aw&G|rwkoFixtyQt?5%c(@eyJ7X21I6hZA@byxy>9MA#+xUEy75cYCx3 zE0BX_Py`0TscVFe@a+-dXj=q68VK)xn(PWEM#05BUl#_#a8$UB1mW*Sgn0PbsPK4W z^rbPO58*`7UmO);mH&+i$9IAHDOY%HOXb#_@bK>Nd`Z|5ZYc?S!aqDB9OIAs!rLDe Zl9jf{gx9XVflucl))QO#<0YY2_&>TQ?g{_^ diff --git a/src/scripts/album.js b/src/scripts/album.js index 00ced60..7987cba 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -454,6 +454,7 @@ album.setPublic = function(albumID, e) { if (basicModal.visible()) { + // Set password if ($('.basicModal .choice input[name="password"]:checked').length===1) { password = $('.basicModal .choice input[data-name="password"]').val(); album.json.password = '1'; @@ -462,18 +463,28 @@ album.setPublic = function(albumID, e) { album.json.password = '0'; } - if ($('.basicModal .choice input[name="listed"]:checked').length===1) listed = true; - if ($('.basicModal .choice input[name="downloadable"]:checked').length===1) downloadable = true; + // Set downloadable + if ($('.basicModal .choice input[name="downloadable"]:checked').length===1) { + downloadable = true; + album.json.downloadable = '1'; + } else { + downloadable = false; + album.json.downloadable = '0'; + } + + if ($('.basicModal .choice input[name="listed"]:checked').length===1) listed = true; } if (visible.album()) { - album.json.public = (album.json.public==='0') ? '1' : '0'; - album.json.password = (album.json.public==='0') ? '0' : album.json.password; + album.json.public = (album.json.public==='0') ? '1' : '0'; + album.json.password = (album.json.public==='0') ? '0' : album.json.password; + album.json.downloadable = (album.json.public==='0') ? '0' : album.json.downloadable; view.album.public(); view.album.password(); + view.album.downloadable(); if (album.json.public==='1') contextMenu.shareAlbum(albumID, e); diff --git a/src/scripts/view.js b/src/scripts/view.js index 745087a..bae1e52 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -261,7 +261,7 @@ view.album = { $('.photo .iconic-share').remove(); - if (album.json.init) $('#infobox .attr_visibility').html('Public'); + if (album.json.init) $('#infobox .attr_public').html('Yes'); } else { @@ -269,7 +269,7 @@ view.album = { .removeClass('active') .attr('title', 'Make Public'); - if (album.json.init) $('#infobox .attr_visibility').html('Private'); + if (album.json.init) $('#infobox .attr_public').html('No'); } }, @@ -281,6 +281,13 @@ view.album = { }, + downloadable: function() { + + if (album.json.downloadable==='1') $('#infobox .attr_downloadable').html('Yes'); + else $('#infobox .attr_downloadable').html('No'); + + }, + infobox: function() { if ((visible.album()||!album.json.init)&&!visible.photo()) lychee.infobox.find('.wrapper').html(build.infoboxAlbum(album.json)); From d7ba8b127b1663439ef853ba9edb26773fd71a81 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 28 Feb 2015 21:38:25 +0100 Subject: [PATCH 094/190] Fixed sharing information in photo infobox --- dist/main.js | Bin 170766 -> 170750 bytes src/scripts/view.js | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/main.js b/dist/main.js index 2cbb05da48900173eeddce336c4c4b1d39be9bc3..f88c2f6cff67bd59ceb3cd278f5367fe918d694e 100644 GIT binary patch delta 39 tcmeC%#`SM2S3?Wq7N#GQrt9@E@lW5;%_K2hZ8B2?h%2^z?qsGyb^uDR4;ugg delta 77 zcmeyjm8)+XS3?Wq7N#GQB+D|3Gm|oNGD|9zH1#q{a&t740!ou|GLxrsO=ilK!X{mm PS(aFmy1ipEQyDt|q?R2r diff --git a/src/scripts/view.js b/src/scripts/view.js index bae1e52..55f23fa 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -390,13 +390,13 @@ view.photo = { $('#button_share') .addClass('active') .attr('title', 'Share Photo'); - if (photo.json.init) $('#infobox .attr_visibility').html('Public'); + if (photo.json.init) $('#infobox .attr_public').html('Yes'); } else { // Photo private $('#button_share') .removeClass('active') .attr('title', 'Make Public'); - if (photo.json.init) $('#infobox .attr_visibility').html('Private'); + if (photo.json.init) $('#infobox .attr_public').html('No'); } }, From e39d70ab15dfb9cab343817186a0ca73039148ef Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 28 Feb 2015 23:37:35 +0100 Subject: [PATCH 095/190] Removed unused data attribute --- src/scripts/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/build.js b/src/scripts/build.js index 15fd865..1f8aa3b 100644 --- a/src/scripts/build.js +++ b/src/scripts/build.js @@ -76,7 +76,7 @@ build.album = function(data) { if (data.thumb0.split('.').pop()==='svg') typeThumb = 'nonretina'; html = ` -
+
thumb thumb thumb From 389142385ddc610f6aece10714e87b9d0a8e7dc9 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 28 Feb 2015 23:39:28 +0100 Subject: [PATCH 096/190] Improved if-conditions --- src/scripts/init.js | 8 ++++---- src/scripts/photo.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/scripts/init.js b/src/scripts/init.js index 935f3d3..4468f51 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -19,12 +19,12 @@ $(document).ready(function() { else contextMenu.albumTitle(album.getID(), e); }); header.dom('#button_share').on(eventName, function(e) { - if (photo.json.public==1||photo.json.public==2) contextMenu.sharePhoto(photo.getID(), e); - else photo.setPublic(photo.getID(), e); + if (photo.json.public==='1'||photo.json.public==='2') contextMenu.sharePhoto(photo.getID(), e); + else photo.setPublic(photo.getID(), e); }); header.dom('#button_share_album').on(eventName, function(e) { - if (album.json.public==1) contextMenu.shareAlbum(album.getID(), e); - else album.setPublic(album.getID(), e); + if (album.json.public==='1') contextMenu.shareAlbum(album.getID(), e); + else album.setPublic(album.getID(), true, e); }); header.dom('#button_signin') .on(eventName, lychee.loginDialog); header.dom('#button_settings') .on(eventName, contextMenu.settings); diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 9755c44..9a7749f 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -418,7 +418,7 @@ photo.setStar = function(photoIDs) { photo.setPublic = function(photoID, e) { - if (photo.json.public==2) { + if (photo.json.public==='2') { var action; From 87537eba2dd24065e2509d4f2ccfd7494feb94b7 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 28 Feb 2015 23:42:13 +0100 Subject: [PATCH 097/190] Feature: Edit sharing properties of album --- dist/main.js | Bin 170750 -> 171291 bytes dist/view.js | Bin 93613 -> 93582 bytes php/access/Admin.php | 2 +- php/modules/Album.php | 42 +++++++------------ src/scripts/album.js | 82 ++++++++++++++++++++++++------------- src/scripts/contextMenu.js | 3 +- 6 files changed, 71 insertions(+), 58 deletions(-) diff --git a/dist/main.js b/dist/main.js index f88c2f6cff67bd59ceb3cd278f5367fe918d694e..86557f86d9598e9520f7ce0f9daade9bfc31be59 100644 GIT binary patch delta 1965 zcmZWoYitx%6waAaN*CHv+fp8F*_~=TV{eCTDN+W9+5#fQU5l>qv8*uNy=!L}XV#f% zi(!ixpHbws*jr=NsPPdMg=}<16JLn|Owd4l@bCx5fGBEwq2deAY+E#Of1I6r?svZP zoyYzA72hMT`*s!hAd;Qn>nH#{v!q0aQ0C>5yCIU9SNaxu&Xl&Hy|`=++8fK7(B9*H zXJ0Lw#v$}T`2q-Ki!QheK!0je1>oVq%E#&vK-z23m+fBgd{K=q+0;;7ZGc8;G#HcI z+fp<}97Rp1^~}`H50UkFXEWN;t}cvO*>$NGx_R-_P^gm-iDcWCK02{Lca@C)Kvm}3 z6)DVo)0G;E+;`=si4nz>G>4_Cp(<;I>QF;wb66@4xuQrql|Ur>UO0_>nXaB8v~TxZ zjP`U-=VV<dshx%-Xkk#d+EP5goyz$iy7*h51RIi?f)5{QNp5EjE z{`iLT;oslCg!$RJsZhzV;T_#qUP)9HXNHZ-8? zqgrTf)5Rv9Cq_pSx6!eT0eYS0_6aEx?I$|HG0WbCPUG≤v`8Tn7o1@OT~U#Idjt z4*~3k#lzmRkQr@>H8dE}))-0&v8DCUT!GHHIADSAbKR88dl$L8>*2KtvvhGi_BSB3 zF1k$=-9FnI^y>>vp}B?Vx$6a(RS1!s+YH#$NUnPhT<-mE3qrCA)Bm;<&P*uLMH+Qu z9i|cp$~ybK8y>@}hgX2Z6@@U7+Yw?FVc3B(p9@16W&Rol9w9TY0<&@kJrIv^E2eYYeXMQvB3j^9f9-9F9nt444CEv#-8$Jg?rES%@@D5$^FyUo+E zzqUYofENjhTV)pG@6wb%Zm5on91M}R1}YerqgUAgP8@mWbCS8s4pM$^RY%ziW^#d zEra{GO7{IGZVESwX(=AR64=%qaE|K`*g*!B(-ppjC;2)h-NDB(My0S7!_atM>pKrY zI0bU`Hg`<;2b;K)oB#j- delta 1623 zcmYjReQXnD7|(NCH`dV&*ai&N(cZA!vD?v>5w^}_A25}VD;u7I)WXVoO|O)@*}H9! zbrPdMqI?Vryd6f28i*K)l12|TLH;4YANUpggMbOf=qB?k#-T{E_}s|Ae}3)ryuasp ze$V@R+t)v}PkdzmFwYK&T)w?I55&wWM*^hG2aY|E$Sf=Q95dr3^@xj0mmqE~twr2x zeb0SdI-5f3wV90|wd`eD645d#F$suo; zH+J>NVNMq!>9m-c(fTEJz1>=eSkl&pHJxpbTcrnAo&uZ5Nn9e=(Edh2o@fXe*R_hw zuWNg7@|JZ9ioCLJe?dYpcts~YbD$!piPfkfb1=vkNe0Vut%5s|yA(`gzf4=lAmYW2 z#fW1at;HfAQ`9KGdKEX7-PYNMb8mDmu*Top@S+`=JHspnZ->uXeLJ?EL!`P^&X5>` zZA!^TZ%TEkgPfRqrmMgj@_Yo_=k`S$6zXL&ErHp&v)$viQjzb`<=&{Khvcxe^*JSh zysE@Kt7vx8k8M{cHB5byw4BJ@({56aig?wC3u5Mn)KkdjbRIFJFRZXONE&iV7aq39 zU5@Goo);NtU+${0kiy`%zAD7xem7!W|Gw(~8Ilt82Y#?ktP*3GB+mJ!pTXMu{bQCV zBd2IeGBOaZ$hc0o<6DWH{<;}`Zuse2%kGlV_W_Og?C0mOq~gvDYah?plgLxY_FIJe zzfgAkn7A9H7l^7L^GU56--4#{@su3nBvt5Bd3mSY&4^@sC2RnZT&M&mNan3dcp253 zT~$yCj405m)~%_AtQvG+skdGb1i5)KYwXaXN=%WXbO4*Y=?++CoGc z+#nH+hRdar8uEobo@B@$Mkx|$uYtNUOfE%(89HtlJptM}F!$8J`TY4JJAn7=X8bF5 zv8)kKY5gv-NoDGMoM>)hV7?6!rcnoYsR?t<5_rP;JnV&71&;rx9mew=A}fcCaI-47 zy#bN@y9Q3;(ePT(sX_?{8O;(Y3&K&9`EC$`DD&?i&`6oL9#mVgC=3j8lHm4n2{R+X z%Dk!sr%qb$7PhC;y^PGJ(@HuW!IzDcKQ}_lax(E4Rpb!x+7zoWfaTva2<@t#=2_#ngaKUf4=`fg`(*gOmJq z3~m>qyFOg~LFPJv8cLfCmJvP+F3`yOEI9KYQO+NOaxzR{mW{z>yySOOU*x0NfED_z zu&RLN9`cLT$PQVcC#90_36xL6fp`^OmOwLAMnVUmn7o>W60)U(1GJZP zW}%WiI}Bd(M;6u-ZZAbo>xt-kzm|%U6T{%7Xdk(l#T%(=qROUEF3HH8^`Aw)qp3NS zT%V#V+mdoX;i6i?0dQ3#VuBQVb# s7==xayg`)p(vPr+OpL=Fu$!ZIA=n0fGtfv~X*Bb6N&w8Z7}QPXKUcyQN&o-= diff --git a/dist/view.js b/dist/view.js index 21537be3d8af79bff80a60a2a1bd819576ddbb1c..aebc24e3fe7b2d4ec1f3859cb80053c43e146b5d 100644 GIT binary patch delta 22 ecmZ2`o3-yYYr_`Coj%jg1Tac%|K!8CTLA!g^9j`e delta 53 zcmeCX&ARqBYr_`Coj!63DTyVCx&?{F#pU@$DYoiL+NpXlp0?6-L0?Ac?U#KRcPjt@ DE8G)x diff --git a/php/access/Admin.php b/php/access/Admin.php index c53b619..d7705cc 100644 --- a/php/access/Admin.php +++ b/php/access/Admin.php @@ -111,7 +111,7 @@ class Admin extends Access { Module::dependencies(isset($_POST['albumID'], $_POST['password'], $_POST['visible'], $_POST['downloadable'])); $album = new Album($this->database, $this->plugins, $this->settings, $_POST['albumID']); - echo $album->setPublic($_POST['password'], $_POST['visible'], $_POST['downloadable']); + echo $album->setPublic($_POST['public'], $_POST['password'], $_POST['visible'], $_POST['downloadable']); } diff --git a/php/modules/Album.php b/php/modules/Album.php index afea752..e2dec88 100644 --- a/php/modules/Album.php +++ b/php/modules/Album.php @@ -498,7 +498,7 @@ class Album extends Module { } - public function setPublic($password, $visible, $downloadable) { + public function setPublic($public, $password, $visible, $downloadable) { # Check dependencies self::dependencies(isset($this->database, $this->albumIDs)); @@ -506,39 +506,27 @@ class Album extends Module { # Call plugins $this->plugins(__METHOD__, 0, func_get_args()); - # Get public - $query = Database::prepare($this->database, "SELECT id, public FROM ? WHERE id IN (?)", array(LYCHEE_TABLE_ALBUMS, $this->albumIDs)); - $albums = $this->database->query($query); + # Convert values + $public = ($public==='1' ? 1 : 0); + $visible = ($visible==='1' ? 1 : 0); + $downloadable = ($downloadable==='1' ? 1 : 0); - while ($album = $albums->fetch_object()) { + # Set public + $query = Database::prepare($this->database, "UPDATE ? SET public = '?', visible = '?', downloadable = '?', password = NULL WHERE id IN (?)", array(LYCHEE_TABLE_ALBUMS, $public, $visible, $downloadable, $this->albumIDs)); + $result = $this->database->query($query); + if (!$result) { + Log::error($this->database, __METHOD__, __LINE__, $this->database->error); + return false; + } - # Invert public - $public = ($album->public=='0' ? 1 : 0); - - # Convert visible - $visible = ($visible==='true' ? 1 : 0); - - # Convert downloadable - $downloadable = ($downloadable==='true' ? 1 : 0); - - # Set public - $query = Database::prepare($this->database, "UPDATE ? SET public = '?', visible = '?', downloadable = '?', password = NULL WHERE id = '?'", array(LYCHEE_TABLE_ALBUMS, $public, $visible, $downloadable, $album->id)); + # Reset permissions for photos + if ($public===1) { + $query = Database::prepare($this->database, "UPDATE ? SET public = 0 WHERE album IN (?)", array(LYCHEE_TABLE_PHOTOS, $this->albumIDs)); $result = $this->database->query($query); if (!$result) { Log::error($this->database, __METHOD__, __LINE__, $this->database->error); return false; } - - # Reset permissions for photos - if ($public===1) { - $query = Database::prepare($this->database, "UPDATE ? SET public = 0 WHERE album = '?'", array(LYCHEE_TABLE_PHOTOS, $album->id)); - $result = $this->database->query($query); - if (!$result) { - Log::error($this->database, __METHOD__, __LINE__, $this->database->error); - return false; - } - } - } # Call plugins diff --git a/src/scripts/album.js b/src/scripts/album.js index 7987cba..3569512 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -375,33 +375,41 @@ album.setDescription = function(albumID) { } -album.setPublic = function(albumID, e) { +album.setPublic = function(albumID, modal, e) { var params, - password = '', - listed = false, - downloadable = false; + password = ''; albums.refresh(); - if (!basicModal.visible()&&album.json.public==='0') { + if (modal===true) { - var msg = '', - action; + let msg = '', + text = '', + action = {}; - action = function() { + action.fn = function() { - basicModal.close(); - album.setPublic(album.getID(), e); + // Current function without showing the modal + album.setPublic(album.getID(), false, e); }; + // Album public = Editing a shared album + if (album.json.public==='1') { + action.title = 'Edit Sharing'; + text = 'The sharing-properties of this album will be changed to the following:'; + } else { + action.title = 'Share Album'; + text = 'This album will be shared with the following properties:'; + } + msg = ` -

This album will be shared with the following properties:

+

${ text }

@@ -431,8 +439,8 @@ album.setPublic = function(albumID, e) { body: msg, buttons: { action: { - title: 'Share Album', - fn: action + title: action.title, + fn: action.fn }, cancel: { title: 'Cancel', @@ -441,6 +449,11 @@ album.setPublic = function(albumID, e) { } }); + // Active visible by default (public = 0) + if ((album.json.public==='1'&&album.json.visible==='1')|| + (album.json.public==='0')) $('.basicModal .choice input[name="visible"]').click(); + if (album.json.downloadable==='1') $('.basicModal .choice input[name="downloadable"]').click(); + $('.basicModal .choice input[name="password"]').on('change', function() { if ($(this).prop('checked')===true) $('.basicModal .choice input[data-name="password"]').show().focus(); @@ -452,8 +465,20 @@ album.setPublic = function(albumID, e) { } + // Set data if (basicModal.visible()) { + // Visible modal => Set album public + album.json.public = '1'; + + // Set visible + if ($('.basicModal .choice input[name="visible"]:checked').length===1) album.json.visible = '1'; + else album.json.visible = '0'; + + // Set downloadable + if ($('.basicModal .choice input[name="downloadable"]:checked').length===1) album.json.downloadable = '1'; + else album.json.downloadable = '0'; + // Set password if ($('.basicModal .choice input[name="password"]:checked').length===1) { password = $('.basicModal .choice input[data-name="password"]').val(); @@ -463,28 +488,26 @@ album.setPublic = function(albumID, e) { album.json.password = '0'; } - // Set downloadable - if ($('.basicModal .choice input[name="downloadable"]:checked').length===1) { - downloadable = true; - album.json.downloadable = '1'; - } else { - downloadable = false; - album.json.downloadable = '0'; - } + // Modal input has been processed, now it can be closed + basicModal.close(); - if ($('.basicModal .choice input[name="listed"]:checked').length===1) listed = true; + } else { + + // Modal not visible => Set album private + album.json.public = '0'; } + // Set data and refresh view if (visible.album()) { - album.json.public = (album.json.public==='0') ? '1' : '0'; - album.json.password = (album.json.public==='0') ? '0' : album.json.password; + album.json.visible = (album.json.public==='0') ? '0' : album.json.visible; album.json.downloadable = (album.json.public==='0') ? '0' : album.json.downloadable; + album.json.password = (album.json.public==='0') ? '0' : album.json.password; view.album.public(); - view.album.password(); view.album.downloadable(); + view.album.password(); if (album.json.public==='1') contextMenu.shareAlbum(albumID, e); @@ -492,9 +515,10 @@ album.setPublic = function(albumID, e) { params = { albumID, - password, - visible: listed, - downloadable + public: album.json.public, + password: password, + visible: album.json.visible, + downloadable: album.json.downloadable } api.post('Album::setPublic', params, function(data) { diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index 2a3e70f..45ed35f 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -274,7 +274,8 @@ contextMenu.shareAlbum = function(albumID, e) { { type: 'item', title: build.iconic('facebook', file, file) + 'Facebook', fn: function() { album.share(1) } }, { type: 'item', title: build.iconic('envelope-closed') + 'Mail', fn: function() { album.share(2) } }, { type: 'separator' }, - { type: 'item', title: build.iconic('ban') + 'Make Private', fn: function() { album.setPublic(albumID) } } + { type: 'item', title: build.iconic('pencil') + 'Edit Sharing', fn: function() { album.setPublic(albumID, true, e) } }, + { type: 'item', title: build.iconic('ban') + 'Make Private', fn: function() { album.setPublic(albumID, false) } } ]; basicContext.show(items, e); From cfe99df0da91a6f716df36736d750425b49c7c7a Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 28 Feb 2015 23:42:28 +0100 Subject: [PATCH 098/190] Adjusted indention --- php/modules/Photo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/php/modules/Photo.php b/php/modules/Photo.php index 101f1fc..942c693 100755 --- a/php/modules/Photo.php +++ b/php/modules/Photo.php @@ -544,8 +544,8 @@ class Photo extends Module { if (strlen($photo['takestamp'])>1) $photo['takedate'] = date('d M. Y', $photo['takestamp']); # Parse medium - if ($photo['medium']==='1') $photo['medium'] = LYCHEE_URL_UPLOADS_MEDIUM . $photo['url']; - else $photo['medium'] = ''; + if ($photo['medium']==='1') $photo['medium'] = LYCHEE_URL_UPLOADS_MEDIUM . $photo['url']; + else $photo['medium'] = ''; # Parse paths $photo['url'] = LYCHEE_URL_UPLOADS_BIG . $photo['url']; From 61cf46be1fbe16242fa1c5075f544719c5211a1b Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 6 Mar 2015 22:48:41 +0100 Subject: [PATCH 099/190] Added loadingBar.dom, changed visible.header --- dist/main.js | Bin 171291 -> 171235 bytes src/scripts/header.js | 2 -- src/scripts/init.js | 2 +- src/scripts/loadingBar.js | 40 +++++++++++++++++++++++++------------- src/scripts/lychee.js | 1 - src/scripts/view.js | 2 +- src/scripts/visible.js | 4 ++-- 7 files changed, 30 insertions(+), 21 deletions(-) diff --git a/dist/main.js b/dist/main.js index 86557f86d9598e9520f7ce0f9daade9bfc31be59..f27e724e98f255c2f25fc0af930a072bc317e3e2 100644 GIT binary patch delta 3911 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 diff --git a/src/scripts/header.js b/src/scripts/header.js index e03da05..e63af5c 100644 --- a/src/scripts/header.js +++ b/src/scripts/header.js @@ -24,7 +24,6 @@ header.show = function() { lychee.imageview.removeClass('full'); header.dom().removeClass('hidden'); - lychee.loadingBar.css('opacity', 1); // Adjust position or size of photo if ($('#imageview #image.small').length>0) $('#imageview #image').css('margin-top', newMargin); @@ -46,7 +45,6 @@ header.hide = function(e, delay) { lychee.imageview.addClass('full'); header.dom().addClass('hidden'); - lychee.loadingBar.css('opacity', 0); // Adjust position or size of photo if ($('#imageview #image.small').length>0) $('#imageview #image').css('margin-top', newMargin); diff --git a/src/scripts/init.js b/src/scripts/init.js index 4468f51..ea99009 100755 --- a/src/scripts/init.js +++ b/src/scripts/init.js @@ -132,7 +132,7 @@ $(document).ready(function() { /* Fullscreen on mobile */ .on('touchend', '#image', function(e) { if (swipe.obj===null||(swipe.offset>=-5&&swipe.offset<=5)) { - if (visible.controls()) header.hide(e, 0); + if (visible.header()) header.hide(e, 0); else header.show(); } }) diff --git a/src/scripts/loadingBar.js b/src/scripts/loadingBar.js index 94a6287..4ed505b 100755 --- a/src/scripts/loadingBar.js +++ b/src/scripts/loadingBar.js @@ -5,7 +5,15 @@ loadingBar = { - status: null + status: null, + _dom: $('#loading') + +} + +loadingBar.dom = function(selector) { + + if (selector===undefined||selector===null||selector==='') return loadingBar._dom; + return loadingBar._dom.find(selector); } @@ -21,10 +29,10 @@ loadingBar.show = function(status, errorText) { if (!errorText) errorText = 'Whoops, it looks like something went wrong. Please reload the site and try again!'; // Move header down - if (visible.controls()) header.dom().addClass('error'); + if (visible.header()) header.dom().addClass('error'); // Modify loading - lychee.loadingBar + loadingBar.dom() .removeClass('loading uploading error') .addClass(status) .html('

Error: ' + errorText + '

') @@ -32,8 +40,12 @@ loadingBar.show = function(status, errorText) { .css('height', '40px'); // Set timeout - clearTimeout(lychee.loadingBar.data('timeout')); - lychee.loadingBar.data('timeout', setTimeout(function() { loadingBar.hide(true) }, 3000)); + clearTimeout(loadingBar._timeout); + loadingBar._timeout = setTimeout(function() { + + loadingBar.hide(true) + + }, 3000); return true; @@ -45,19 +57,19 @@ loadingBar.show = function(status, errorText) { loadingBar.status = 'loading'; // Set timeout - clearTimeout(lychee.loadingBar.data('timeout')); - lychee.loadingBar.data('timeout', setTimeout(function() { + clearTimeout(loadingBar._timeout); + loadingBar._timeout = setTimeout(function() { // Move header down - if (visible.controls()) header.dom().addClass('loading'); + if (visible.header()) header.dom().addClass('loading'); // Modify loading - lychee.loadingBar + loadingBar.dom() .removeClass('loading uploading error') .addClass('loading') .show(); - }, 1000)); + }, 1000); return true; @@ -73,16 +85,16 @@ loadingBar.hide = function(force) { loadingBar.status = null; // Move header up - if (visible.controls()) header.dom().removeClass('error loading'); + if (visible.header()) header.dom().removeClass('error loading'); // Modify loading - lychee.loadingBar + loadingBar.dom() .html('') .css('height', '3px'); // Set timeout - clearTimeout(lychee.loadingBar.data('timeout')); - setTimeout(function() { lychee.loadingBar.hide() }, 300); + clearTimeout(loadingBar._timeout); + setTimeout(function() { loadingBar.dom().hide() }, 300); } diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 6cda479..d80f32f 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -25,7 +25,6 @@ lychee = { dropbox: false, dropboxKey: '', - loadingBar: $('#loading'), content: $('#content'), imageview: $('#imageview'), infobox: $('#infobox') diff --git a/src/scripts/view.js b/src/scripts/view.js index 55f23fa..b664974 100644 --- a/src/scripts/view.js +++ b/src/scripts/view.js @@ -409,7 +409,7 @@ view.photo = { photo: function() { - lychee.imageview.html(build.imageview(photo.json, photo.getSize(), visible.controls())); + lychee.imageview.html(build.imageview(photo.json, photo.getSize(), visible.header())); var $nextArrow = lychee.imageview.find('a#next'), $previousArrow = lychee.imageview.find('a#previous'), diff --git a/src/scripts/visible.js b/src/scripts/visible.js index 58a40ca..82edfdd 100755 --- a/src/scripts/visible.js +++ b/src/scripts/visible.js @@ -37,8 +37,8 @@ visible.infoboxbutton = function() { return false; } -visible.controls = function() { - if (lychee.loadingBar.css('opacity')<1) return false; +visible.header = function() { + if (header.dom().hasClass('hidden')===true) return false; return true; } From b143de1050febea948dcd48577984299778a242e Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 6 Mar 2015 22:50:09 +0100 Subject: [PATCH 100/190] Updated deps --- dist/main.css | Bin 33566 -> 33559 bytes src/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/main.css b/dist/main.css index 980c5d30cfaaf386057b24528cb4095c949be54c..f569b754518a3bc105e1e39bc6065b36f3adaa18 100644 GIT binary patch delta 123 zcmbQ&#x%W+X~Lb&5{#RopPcWfH@P!eW3x%(D@6cS(J#~h delta 134 zcmbQ<#x$>uX~G?8<>dUllGMBs9p%itwEU#}3I)CLqQruN)S~LiS;mSR?`-CtY!D$l z`G7Xp<{La~&J!9PbI>4KMa(F_+!lO diff --git a/src/package.json b/src/package.json index 8a9148b..9835eac 100644 --- a/src/package.json +++ b/src/package.json @@ -15,7 +15,7 @@ "gulp-babel": "^4.0.0", "gulp-concat": "^2.5.2", "gulp-load-plugins": "^0.8.1", - "gulp-minify-css": "^0.4.6", + "gulp-minify-css": "^0.5.1", "gulp-rimraf": "^0.1.1", "gulp-sass": "^1.3.3", "gulp-uglify": "^1.1.0" From d01e894220eeacc3becb38afa5a18465269f841d Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 6 Mar 2015 23:29:55 +0100 Subject: [PATCH 101/190] Simplified response of session init --- dist/main.js | Bin 171235 -> 171262 bytes php/access/Installation.php | 13 ++++++++-- php/define.php | 5 ++++ php/modules/Session.php | 8 +++--- src/scripts/lychee.js | 47 ++++++++++++++++++++++++------------ 5 files changed, 51 insertions(+), 22 deletions(-) diff --git a/dist/main.js b/dist/main.js index f27e724e98f255c2f25fc0af930a072bc317e3e2..20ca16406688a721825b9d8507bc6b048b3021d5 100644 GIT binary patch delta 147 zcmaF7lk4A3u7(!IEll4T1v1k#jBIUfQ}v2V5=%;pHK%JZG0mLb$joHGT2rHFpff#; znMqsBIyI*_RRO5h5JfE?6O)82T+RSlt|+ynv?xzuI!Fnl&h)2DOnHpf(>F0Qsq^Gi VCTFCk>gD7orf6(`&CK*;1^}`zFC+i} delta 153 zcmeyjlk4$Lu7(!IEll4TC+DZIYo+St4|@dbCreateConfig(); break; # Error - default: exit('Warning: No configuration!'); - return false; break; + default: $this->init(); break; } @@ -33,6 +32,16 @@ class Installation extends Access { } + private function init() { + + $return = array( + 'status' => LYCHEE_STATUS_NOCONFIG + ); + + echo json_encode($return); + + } + } ?> \ No newline at end of file diff --git a/php/define.php b/php/define.php index 80a18ba..fb045f2 100644 --- a/php/define.php +++ b/php/define.php @@ -8,6 +8,11 @@ # Define root define('LYCHEE', substr(__DIR__, 0, -3)); +# Define status +define('LYCHEE_STATUS_NOCONFIG', 0); +define('LYCHEE_STATUS_LOGGEDOUT', 1); +define('LYCHEE_STATUS_LOGGEDIN', 2); + # Define dirs define('LYCHEE_DATA', LYCHEE . 'data/'); define('LYCHEE_SRC', LYCHEE . 'src/'); diff --git a/php/modules/Session.php b/php/modules/Session.php index 74381c5..76e62d4 100755 --- a/php/modules/Session.php +++ b/php/modules/Session.php @@ -55,10 +55,13 @@ class Session extends Module { if ($public===false) { # Logged in - $return['loggedIn'] = true; + $return['status'] = LYCHEE_STATUS_LOGGEDIN; } else { + # Logged out + $return['status'] = LYCHEE_STATUS_LOGGEDOUT; + # Unset unused vars unset($return['config']['username']); unset($return['config']['thumbQuality']); @@ -68,9 +71,6 @@ class Session extends Module { unset($return['config']['location']); unset($return['config']['plugins']); - # Logged out - $return['loggedIn'] = false; - } # Call plugins diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index d80f32f..416b8cf 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -41,30 +41,45 @@ lychee.init = function() { api.post('Session::init', params, function(data) { - if (data.loggedIn!==true) { - lychee.setMode('public'); - } else { - lychee.username = data.config.username || ''; - lychee.sorting = data.config.sorting || ''; - lychee.dropboxKey = data.config.dropboxKey || ''; - lychee.location = data.config.location || ''; - } + // Check status + // 0 = No configuration + // 1 = Logged out + // 2 = Logged in + + if (data.status===2) { + + // Logged in + + lychee.username = data.config.username || ''; + lychee.sorting = data.config.sorting || ''; + lychee.dropboxKey = data.config.dropboxKey || ''; + lychee.location = data.config.location || ''; + lychee.checkForUpdates = data.config.checkForUpdates || true; + + // No username and password + if (data.config.login===false) settings.createLogin(); + + } else if (data.status===1) { + + // Logged out + + lychee.setMode('public'); + + } else if (data.status===0) { + + // No configuration + + lychee.setMode('public'); - // No configuration - if (data==='Warning: No configuration!') { header.dom().hide(); lychee.content.hide(); $('body').append(build.no_content('cog')); settings.createConfig(); + return true; + } - // No login - if (data.config.login===false) { - settings.createLogin(); - } - - lychee.checkForUpdates = data.config.checkForUpdates; $(window).bind('popstate', lychee.load); lychee.load(); From a57b2d0127fa2c5eb1cff5c12f73350efd316d1b Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 8 Mar 2015 23:14:20 +0100 Subject: [PATCH 102/190] Removed "cursor: pointer" Lychee now feels faster and more like a webapp --- dist/main.css | Bin 33559 -> 33401 bytes src/styles/_content.scss | 1 - src/styles/_contextmenu.scss | 2 +- src/styles/_header.scss | 5 ----- src/styles/_imageview.scss | 1 - src/styles/_infobox.scss | 3 --- src/styles/_message.scss | 1 + 7 files changed, 2 insertions(+), 11 deletions(-) diff --git a/dist/main.css b/dist/main.css index f569b754518a3bc105e1e39bc6065b36f3adaa18..3ea76a7707014db6450fd4a001ee7d3d15ce9b85 100644 GIT binary patch delta 108 zcmV-y0F(chh64G70IZD|ClQ>V! zvlLK71e0e}ss6dJQ1a`+GBlRp%)Pwprbn0!uweX@Zs>*NAHj?J3<{Hl|`O7d^EFew$9 z%;+Jq`GT7_Grx6mX;E>0kyT1+T4HHV$!2M7C#Wo-G zcVR&noXi@s3SDgT`VduCK2!rYUygKU!%!%eP|AcZIGHh7V)Nppy)5V^#Hat{oV>13 KVRL)oCjkI&h+}I2 diff --git a/src/styles/_content.scss b/src/styles/_content.scss index b085045..57ed598 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -26,7 +26,6 @@ width: 202px; height: 202px; margin: 30px 0 0 30px; - cursor: pointer; img { position: absolute; diff --git a/src/styles/_contextmenu.scss b/src/styles/_contextmenu.scss index fbf5d3f..1240128 100644 --- a/src/styles/_contextmenu.scss +++ b/src/styles/_contextmenu.scss @@ -31,6 +31,7 @@ color: white(1); border-radius: 0; transition: none; + cursor: default; &:hover { background: linear-gradient(to bottom, $colorBlue, darken($colorBlue, 5%)); } } @@ -78,7 +79,6 @@ /* No Hover ------------------------------------------------*/ tr.noHover td:hover { background: none; - cursor: default; } } \ No newline at end of file diff --git a/src/styles/_header.scss b/src/styles/_header.scss index 6524d53..cc5e1d3 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -50,8 +50,6 @@ header { &:hover .iconic { fill: white(1); } - &.editable { cursor: pointer; } - &.editable .iconic { display: inline-block; } } @@ -70,7 +68,6 @@ header { display: inline-block; padding: 17px 8px 15px; width: 15px; - cursor: pointer; &--left { float: left; } @@ -128,7 +125,6 @@ header { font-size: 20px; opacity: 0; transition: opacity .2s ease-out, color .2s ease-out; - cursor: pointer; &:hover { color: #fff; @@ -146,7 +142,6 @@ header { text-shadow: $shadow; border-radius: 100px; display: none; - cursor: pointer; &:hover { background-color: black(.3); } } diff --git a/src/styles/_imageview.scss b/src/styles/_imageview.scss index a9c85f8..72b2209 100644 --- a/src/styles/_imageview.scss +++ b/src/styles/_imageview.scss @@ -69,7 +69,6 @@ // background-image: linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url(''); background-size: 100% 100%; border: 1px solid white(.8); - cursor: pointer; opacity: .6; z-index: 2; transition: transform .2s ease-out, opacity .2s ease-out; diff --git a/src/styles/_infobox.scss b/src/styles/_infobox.scss index 041c9d5..ceacf8b 100644 --- a/src/styles/_infobox.scss +++ b/src/styles/_infobox.scss @@ -39,7 +39,6 @@ display: inline-block; margin-left: 3px; width: 10px; - cursor: pointer; .iconic { fill: white(.5); @@ -80,7 +79,6 @@ float: right; padding: 16px 65px 12px 15px; width: 15px; - cursor: pointer; .iconic { fill: #888; @@ -162,7 +160,6 @@ padding: 0; margin: 0 0 -2px 0; width: 0; - cursor: pointer; overflow: hidden; transform: scale(0); transition: width .3s, margin .3s, transform .3s; diff --git a/src/styles/_message.scss b/src/styles/_message.scss index bfa8a4b..2b7ba51 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -52,6 +52,7 @@ text-shadow: $shadow; border-top: 1px solid black(.2); box-shadow: inset 0 1px 0 white(.02); + cursor: default; &:hover { background: white(.02); } From 25fe449d8007d209f1e55f28af7d9a1b83626a83 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 8 Mar 2015 23:35:36 +0100 Subject: [PATCH 103/190] Added ":active" to clickable areas --- dist/main.css | Bin 33401 -> 34182 bytes src/styles/_content.scss | 11 +++++------ src/styles/_contextmenu.scss | 2 ++ src/styles/_header.scss | 10 ++++++++++ src/styles/_infobox.scss | 25 +++++++++++++++++++++---- src/styles/_message.scss | 5 ++++- 6 files changed, 42 insertions(+), 11 deletions(-) diff --git a/dist/main.css b/dist/main.css index 3ea76a7707014db6450fd4a001ee7d3d15ce9b85..48188218a17f509065235f8c9e3155d559e1a825 100644 GIT binary patch delta 627 zcmey_!qnEyv_Z#A-6}D;B(p44Au~5!M>#n^uOv0EL_x10BflgcNve8so12D6QhrfN zYLRYoeolUom9jyaSz?mWW*M_zOq(}Y`m%2Jv0uPAS=nA=a!#`9WOc*jtdOU{Z-^qK z3DhUHIm$hpdGbZCl+8=LH!)4VAE!FG!CPgrski>*9=~`2n8WolfgZ|C20MOoK!7-t zh34kFe!Cgr8s-P+<5j#rU?1;h-gs-q$!|w)|tdpYx1h5*!lx#JbCz+2Q8WmWaJ=rkX4ivPTbCLs?Cs&IqPgcwj zo_s!oZSs$_>wHGVI=P8O>6v*7dO+sn55l61I+OFgWtGb_Q%W+xf=KcuMTvREY57ID zP}ND&leIFIDku~eB<5LVxuDZpHimYI`drJQPLYHpf3Ss_CbYhdv}R3#Z185o%Z eRf%jqpP|n=S=mx(@(eez$rlR5H;Wdf2mk=OB;7#( delta 434 zcmY+AJuCxp0L61heN~aP2`Z#o;_G^cMssZwA)y^Ar3*0#*WTe&@3=c3C4xjmA_iVe zA~XgTA^sKy>sA{NqFznTCaY_>m zSylXOlO8ZMLDA)J`On8|sX3_>v3URs%3rHO zDu$#O4px+>Wl_=?m#hq{F?IIWna8tk$7N>$-CRfRTGJFsw{a#khpeP5SWl7LP=5xT z9VJ`AY#g~N@M5(h6*i-*B_B$-9IFuyr%^Lhk;76Xi>!ywXe>syiQauoAr|$Lx9Eul z7efUUgUh%BR|Dnv7%E1mP=#GFmmCfTC=`CJEQ>YR6lzcsyFq0~=~gg@JjQ4$)5Y^V zUV9q9fIhTK9;Dlx Date: Wed, 11 Mar 2015 22:32:57 +0100 Subject: [PATCH 104/190] Improved cursor --- src/styles/_content.scss | 1 + src/styles/_header.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/src/styles/_content.scss b/src/styles/_content.scss index c212891..fab4714 100644 --- a/src/styles/_content.scss +++ b/src/styles/_content.scss @@ -26,6 +26,7 @@ width: 202px; height: 202px; margin: 30px 0 0 30px; + cursor: default; img { position: absolute; diff --git a/src/styles/_header.scss b/src/styles/_header.scss index 3b9e582..23bd833 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -38,6 +38,7 @@ header { text-align: center; text-shadow: $shadow; z-index: 1; + cursor: default; .iconic { display: none; From 2ced366b8d5094ceda44a8c5d33f110f22beb365 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Wed, 11 Mar 2015 22:33:11 +0100 Subject: [PATCH 105/190] Rebuild --- dist/main.css | Bin 34182 -> 34212 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.css b/dist/main.css index 48188218a17f509065235f8c9e3155d559e1a825..ca280e90db2290b73befa338e6835a88655b38ee 100644 GIT binary patch delta 58 zcmZqcW?ItCw86rJ-#WRps5rmKDkU{7u{5V-vZJlYW*?JGNj_AG$#s6>n@{`hHU|K6 C1QrJX delta 23 fcmZ3|&D7S-w86q;@?AlAAC4UNi>)ZT<;# From 2001f172fa13669be23602c834b99dce1c982186 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Wed, 11 Mar 2015 23:00:17 +0100 Subject: [PATCH 106/190] Fixed checkForUpdates and improved version number in login --- dist/main.css | Bin 34212 -> 34265 bytes dist/main.js | Bin 171262 -> 171317 bytes src/scripts/lychee.js | 8 +++++--- src/styles/_message.scss | 9 +++++---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dist/main.css b/dist/main.css index ca280e90db2290b73befa338e6835a88655b38ee..6033d6da7d57bb8795fd11142d978eb2f736b344 100644 GIT binary patch delta 105 zcmZ3|&2+PyX@g5GM_Fo7ab|v=&g6Hsl9To7I46fV3NaaLPCi&6I@!B6RW~=WC_OXJ zO4qcYLcu`6z`7tYB_%U2-O510*Z?R5A`~-o3-XIf67xzXpR1K-DauUGnEa;JbhAfY G3_Ab?xF)Xv delta 78 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 F`Cs-wY<&O# delta 3411 zcmZ`+Ym6J!71nh&%Vsw~9=j}gtk<3--kErIV&}D6n^|YsBnkx56hZ@xT$o&6+mp=B zI5TsTbz>6*5{-C7g+X;%9!0HM6$k-pzyzkUbG;uw+xx`d77`x5zi@!i=ECk+1cyY=cC3eb(&uxf=z6lF zr&L$x;ln*^2yedD)972kRoX1|e~rYsez`_{UuLRQu>6W`RwYHHy5zVHlXM+Y7hW`S z0aqog9Pwji;5m%EN=JX4i4etpvUrsE#_f)%*&hmTB)Weak5sLB3Yw;SH+? zAkJ5(uzr8_CamXHt7BXZ@=C_jJa&-LV80cV;TNM#RfDqS*XzPJT&s9)#m@@Y?vW|p z)rUsU<0@0d{_xPyI8}G3Tv0FAEPp3=sIXP;C?os;AARcqXuJDXh{?l99Cq+5tgD;-S2{tRA5ldVUAZhBJ(Ur;r+3&1L zbVIk^^--+K`UkQ8bo~slKbed!!q1JHiy}{6*=kPmPoOnAnpN<0UN0vrve+ouqFxQO zfcb&U5HczUTE+C36YK%pm0B%OrvY$ltiAx3{Uvh}8F(Z+CNks9CEpw1#>PA}+L#ya zvJE${bCoyCdPFcBn%IiY32S7FQs;Am>V4H_N75d2qm`(E{ z$ErpdySyHkkBD9Pb}n|D>ky=RwPRC9raC7B1aZF%ewx<{O4gJeZrf^A2ywht7l8i% z(lXc091CPuEhw3axN%}M4Mkjl2wM0C4{zG`+5)bZLsIPz4@@otB>3bc>}*X=^ibU> z%K|t5nY;-fYM0*LPv`V;l)A?P?m02>dF9kp4_A&IF})ZK+0+=sADG&Rb#`i~AKDp3 z5g62fV{j_~LqoECMUJYz>H!`0+?7LwD? z^X%bu+rNq@ezhIXH5czFi-7W7@i5pm*nDi);$=8Kcm1iAT;q;kwu*u5KnHj$YXg4( zBoA$4#c}~gB{NUDDmR+W@a8FFe6HI5vN%MtR6k(s0;Xm0gZx5P>(pSNAO>Z`HYIM` ziSmGiP%ED$gvs*t@Y`+W;dNY>gSl(OkGMv`9k8k+uRyZ-YWcpN7?+Ek0;C+9^D^GR zySC{E87?wZ7X|6A<99&U6*tdBkd*h_;`dz0^*Ga9hq6RMBuUtR$DJ4QTqpfScJuJ@JKh8P z{dW!vJ)Xa72iC|*k*HrdIfB(ZInp2BOC z3GDef6pi`v?kZ}aiCKf(syUbj z{EA6MokXI!Z9bpb=&LRmWoi9-2{a%gPPGmlymF=87tm(Rg=!kMg&WR{A)uu*Ux%kY zI^(p>upa*tJhuA@hVX_@{%~uQB7mA%sn}K7SDkj@Oe9c}5NS~&7B<&_QE7e)cl@N8 z#LS=yB~ZG;e>E=!@sg)bV14PSi6x@Vvh5g!%z&2B!nf^Zl%Hs8LEa8XNMwS>V5GF+`s=tG@)?z#XF&V{_LJE z#PIYhYXwB#_}N=sZOb12#r@Fqir2#)bZn$*7M+vy9UyS&P`zd$T>K)nSJZ^QNkO2 ziwI7w`xg-zP!`7>jov=82Yb-2Z#DbK7;0kc-3!P@z`GS)O3v#hw3Qen>4o^cb~U+* z5ZZWjhy?hFMaeisuZxlmt7xW#0c~0-+dW{~V2Z6JAFQDcDt^XF$^~Z*VV07U5>iIWNlH?>L6?%WwRs(RSSay_ z1c{$d)q+-LW`TLWK^u!l2#RN;G(y&P)4W^&>2B;{$ulG5g(a|HW}N)FTj+q%8}K$V_+Lu*#~=5yU9owvYs}K-DEEa zr+1ST`2O;4@=xK`=dL7m+&sRAynPMIBWgBc$S?UM(UZwepM$!&}S8!~d zcMW+@DE8r(Nd-S_Kgr^d z$TAE5F4>V=1Q7l@9oaC9o}Zc@1}Iz_$H?Nd_CFDq2QqJsJCWl8+CMrRsVDyn@RM;e diff --git a/src/scripts/lychee.js b/src/scripts/lychee.js index 416b8cf..682b57e 100644 --- a/src/scripts/lychee.js +++ b/src/scripts/lychee.js @@ -17,7 +17,7 @@ lychee = { viewMode: false, debugMode: false, - checkForUpdates:false, + checkForUpdates:'1', username: '', sorting: '', location: '', @@ -54,15 +54,17 @@ lychee.init = function() { lychee.sorting = data.config.sorting || ''; lychee.dropboxKey = data.config.dropboxKey || ''; lychee.location = data.config.location || ''; - lychee.checkForUpdates = data.config.checkForUpdates || true; + lychee.checkForUpdates = data.config.checkForUpdates || '1'; - // No username and password + // Show dialog when there is no username and password if (data.config.login===false) settings.createLogin(); } else if (data.status===1) { // Logged out + lychee.checkForUpdates = data.config.checkForUpdates || '1'; + lychee.setMode('public'); } else if (data.status===0) { diff --git a/src/styles/_message.scss b/src/styles/_message.scss index 37c3611..ff93ec4 100644 --- a/src/styles/_message.scss +++ b/src/styles/_message.scss @@ -174,14 +174,15 @@ /* Version ------------------------------------------------*/ .version { - padding: 0px 30px 20px; - color: #888; + margin: -5px 0 0; + padding: 0 30px 30px !important; + color: white(.3); font-size: 12px; - text-align: left; + text-align: right; span { display: none; } - span a { color: #888; } + span a { color: white(.3); } } /* Title ------------------------------------------------*/ From f35c1465781ef6125f148f05f86c95abffbafbb8 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 12 Mar 2015 00:07:20 +0100 Subject: [PATCH 107/190] Added search input to header, removed search icon --- index.html | 7 ++----- src/styles/_header.scss | 24 ++++++++++++++---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/index.html b/index.html index 1dd1fbe..d41d3ee 100644 --- a/index.html +++ b/index.html @@ -45,11 +45,8 @@ - - - - + + ×
diff --git a/src/styles/_header.scss b/src/styles/_header.scss index 23bd833..a3df403 100644 --- a/src/styles/_header.scss +++ b/src/styles/_header.scss @@ -114,15 +114,21 @@ header { width: 80px; margin: 12px 12px 0 0; padding: 5px 12px 6px 12px; - background-color: #222; + background-color: #1d1d1d; color: #fff; - border: 0; + border: 1px solid black(.9); + box-shadow: 0 1px 0 white(.04); outline: none; border-radius: 50px; opacity: .6; - transition: opacity .3s ease-out, transform .3s ease-out, box-shadow .3s ease-out, width .2s ease-out; + transition: opacity .3s ease-out, box-shadow .3s ease-out, width .2s ease-out; - &:focus { width: 140px; } + &:focus { + width: 140px; + border-color: $colorBlue; + box-shadow: 0 1px 0 white(0); + opacity: 1; + } &:focus ~ #clearSearch { opacity: 1; } } @@ -132,15 +138,13 @@ header { top: 13px; right: 78px; padding: 0; - color: #888; + color: white(.5); font-size: 20px; opacity: 0; - transition: opacity .2s ease-out, color .2s ease-out; + transition: color .2s ease-out; + cursor: default; - &:hover { - color: #fff; - opacity: 1; - } + &:hover { color: white(1); } } /* Hosted with Lychee ------------------------------------------------*/ From e8cc2e919246798a1058dc8939dbfade031ec0e2 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 12 Mar 2015 00:11:16 +0100 Subject: [PATCH 108/190] Streamlined prepare process of photo data --- php/modules/Album.php | 39 +++++++++++++++++---------------------- php/modules/Photo.php | 40 ++++++++++++++++++++++++++++++++++++++++ php/modules/misc.php | 11 ++++++----- src/scripts/build.js | 2 +- 4 files changed, 64 insertions(+), 28 deletions(-) diff --git a/php/modules/Album.php b/php/modules/Album.php index e2dec88..6ba81e0 100644 --- a/php/modules/Album.php +++ b/php/modules/Album.php @@ -94,20 +94,14 @@ class Album extends Module { $previousPhotoID = ''; while ($photo = $photos->fetch_assoc()) { - # Parse - $photo['sysdate'] = date('d F Y', substr($photo['id'], 0, -4)); - $photo['previousPhoto'] = $previousPhotoID; - $photo['nextPhoto'] = ''; - $photo['thumbUrl'] = LYCHEE_URL_UPLOADS_THUMB . $photo['thumbUrl']; + # Turn data from the database into a front-end friendly format + $photo = Photo::prepareData($photo); - # Parse url - $photo['url'] = LYCHEE_URL_UPLOADS_BIG . $photo['url']; - - if (isset($photo['takestamp'])&&$photo['takestamp']!=='0') { - $photo['cameraDate'] = 1; - $photo['sysdate'] = date('d F Y', $photo['takestamp']); - } + # Set previous and next photoID for navigation purposes + $photo['previousPhoto'] = $previousPhotoID; + $photo['nextPhoto'] = ''; + # Set current photoID as nextPhoto of previous photo if ($previousPhotoID!=='') $return['content'][$previousPhotoID]['nextPhoto'] = $photo['id']; $previousPhotoID = $photo['id']; @@ -183,18 +177,19 @@ class Album extends Module { $album['password'] = ($album['password']=='' ? '0' : '1'); # Thumbs - if (($public===true&&$album['password']==='0')||($public===false)) { + if (($public===true&&$album['password']==='0')|| + ($public===false)) { - # Execute query - $query = Database::prepare($this->database, "SELECT thumbUrl FROM ? WHERE album = '?' ORDER BY star DESC, " . substr($this->settings['sorting'], 9) . " LIMIT 3", array(LYCHEE_TABLE_PHOTOS, $album['id'])); - $thumbs = $this->database->query($query); + # Execute query + $query = Database::prepare($this->database, "SELECT thumbUrl FROM ? WHERE album = '?' ORDER BY star DESC, " . substr($this->settings['sorting'], 9) . " LIMIT 3", array(LYCHEE_TABLE_PHOTOS, $album['id'])); + $thumbs = $this->database->query($query); - # For each thumb - $k = 0; - while ($thumb = $thumbs->fetch_object()) { - $album["thumb$k"] = LYCHEE_URL_UPLOADS_THUMB . $thumb->thumbUrl; - $k++; - } + # For each thumb + $k = 0; + while ($thumb = $thumbs->fetch_object()) { + $album["thumb$k"] = LYCHEE_URL_UPLOADS_THUMB . $thumb->thumbUrl; + $k++; + } } diff --git a/php/modules/Photo.php b/php/modules/Photo.php index 942c693..8bdd7d4 100755 --- a/php/modules/Photo.php +++ b/php/modules/Photo.php @@ -526,6 +526,46 @@ class Photo extends Module { } + public static function prepareData($data) { + + # This function requires the following photo-attributes and turns them + # into a front-end friendly format: id, title, tags, public, star, album, thumbUrl, takestamp, url + # Note that some attributes remain unchanged + + # Init + $photo = null; + + # Set unchanged attribute + $photo['id'] = $data['id']; + $photo['title'] = $data['title']; + $photo['tags'] = $data['tags']; + $photo['public'] = $data['public']; + $photo['star'] = $data['star']; + $photo['album'] = $data['album']; + + # Parse urls + $photo['thumbUrl'] = LYCHEE_URL_UPLOADS_THUMB . $data['thumbUrl']; + $photo['url'] = LYCHEE_URL_UPLOADS_BIG . $data['url']; + + # Use takestamp as sysdate when possible + if (isset($data['takestamp'])&&$data['takestamp']!=='0') { + + # Use takestamp + $photo['cameraDate'] = '1'; + $photo['sysdate'] = date('d F Y', $data['takestamp']); + + } else { + + # Use sysstamp from the id + $photo['cameraDate'] = '0'; + $photo['sysdate'] = date('d F Y', substr($data['id'], 0, -4)); + + } + + return $photo; + + } + public function get($albumID) { # Check dependencies diff --git a/php/modules/misc.php b/php/modules/misc.php index 2094790..462f51e 100755 --- a/php/modules/misc.php +++ b/php/modules/misc.php @@ -21,12 +21,13 @@ function search($database, $settings, $term) { ); # Photos - $query = Database::prepare($database, "SELECT id, title, tags, public, star, album, thumbUrl FROM ? WHERE title LIKE '%?%' OR description LIKE '%?%' OR tags LIKE '%?%'", array(LYCHEE_TABLE_PHOTOS, $term, $term, $term)); + $query = Database::prepare($database, "SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE title LIKE '%?%' OR description LIKE '%?%' OR tags LIKE '%?%'", array(LYCHEE_TABLE_PHOTOS, $term, $term, $term)); $result = $database->query($query); - while($row = $result->fetch_assoc()) { - $return['photos'][$row['id']] = $row; - $return['photos'][$row['id']]['thumbUrl'] = LYCHEE_URL_UPLOADS_THUMB . $row['thumbUrl']; - $return['photos'][$row['id']]['sysdate'] = date('d M. Y', substr($row['id'], 0, -4)); + while($photo = $result->fetch_assoc()) { + + $photo = Photo::prepareData($photo); + $return['photos'][$photo['id']] = $photo; + } # Albums diff --git a/src/scripts/build.js b/src/scripts/build.js index 1f8aa3b..565eec4 100644 --- a/src/scripts/build.js +++ b/src/scripts/build.js @@ -124,7 +124,7 @@ build.photo = function(data) {

${ title }

` - if (data.cameraDate===1) html += `
${ build.iconic('camera-slr') }${ data.sysdate }`; + if (data.cameraDate==='1') html += `${ build.iconic('camera-slr') }${ data.sysdate }`; else html += `${ data.sysdate }`; html += '
'; From f36b84ecdf1091d71bf7deef2e0989b770d03be1 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 12 Mar 2015 00:11:37 +0100 Subject: [PATCH 109/190] Fixed editing tags while searching --- src/scripts/photo.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 9a7749f..6c019af 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -529,8 +529,9 @@ photo.editTags = function(photoIDs) { // Get tags if (visible.photo()) oldTags = photo.json.tags; if (visible.album()&&photoIDs.length===1) oldTags = album.json.content[photoIDs].tags; + if (visible.search()&&photoIDs.length===1) oldTags = album.json.content[photoIDs].tags; if (visible.album()&&photoIDs.length>1) { - var same = true; + let same = true; photoIDs.forEach(function(id, index, array) { if(album.json.content[id].tags===album.json.content[photoIDs[0]].tags&&same===true) same = true; else same = false; From 8102574b8523f85cdbadd8943e8a442bacb1641c Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 12 Mar 2015 00:11:46 +0100 Subject: [PATCH 110/190] Rebuild --- dist/main.css | Bin 34265 -> 34327 bytes dist/main.js | Bin 171317 -> 171398 bytes dist/view.js | Bin 93582 -> 93584 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/main.css b/dist/main.css index 6033d6da7d57bb8795fd11142d978eb2f736b344..8afd3190cfc6a1081b1922bf0d179f65947b21a7 100644 GIT binary patch delta 144 zcmccF%{0A-X@ht$n_&tFPX6zy$!IxQ(@TTNM02uUaNy*5!QMcuHF>Td=Vap$2~q2$ z{Gyc9BHiTtoctmyWg{a?V^`A-yegWTO(!`&C%$jAH^Cmr!Q{1eX{>0za3ai~$C>SwaFCFaZje Na&iK!w;yu?7AjknGCTkP delta 160 zcmV;R0AK%xy9%|s3V^f$`mF&mxBaaF&5#jkW+)+LDRO0Wb#iVYF*|8ymu@WrA(!+% z0&AC^KLQgYDSLKdav*6vAuu~-E@p3XMPXxTC}wqTV{~b6ZYXpqductF!7Tz4m-9aY zDG+HrJv|{XKOrzWAu)X^ENPc4KmsJUQ$PaQ0hcm^0T!3tV*(nNVL}2!x2Qq_8!(r| OassRY3b$}`0v0MYcQ#Z2 diff --git a/dist/view.js b/dist/view.js index aebc24e3fe7b2d4ec1f3859cb80053c43e146b5d..e0630c130a5527c4aa22036edd17a41673646354 100644 GIT binary patch delta 21 ccmeCX%{t*WYr_^s>p*5DL#6FDfs8>i09hCY%K!iX delta 19 acmbPmo3-yYYr_^s>p(`s?RJ5TK{5bMfd+>F From ea149b68af0db94fba071ce16f602bfe8db1d80b Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Thu, 12 Mar 2015 12:57:48 +0100 Subject: [PATCH 111/190] Added Album::prepareData and improved thumbs response from API --- dist/main.js | Bin 171398 -> 171259 bytes dist/view.js | Bin 93584 -> 93596 bytes php/modules/Album.php | 86 +++++++++++++++++++++++++++++++------ php/modules/Photo.php | 5 ++- src/scripts/albums.js | 28 +++++------- src/scripts/build.js | 8 ++-- src/scripts/contextMenu.js | 8 ++-- 7 files changed, 96 insertions(+), 39 deletions(-) diff --git a/dist/main.js b/dist/main.js index e67a3469244578de3e905a4b55a102e485d2c9ff..9f079ff9b56c65b54693d75adc91df7f82ccb9d1 100644 GIT binary patch delta 348 zcmZqM&GmaHSHl*@zy&PD(FU>8OBXOI0a=D{mQn2V84DOygg~-2H5#dUB^jl;Nno`n zAmWB7;y|5HaU&FQpg9@~8D|L>Tczri<`w4`m87OX&6>`>h%rbABvD+FSX6`%pS_4N zQUoX-tyEB&l#`jP6bsW~vzReZ5Tv6hH90k}1S-7!%woo9R)|M5Rx)M*SwL&wtYnOU zcnQh^dK1Vp*iZPN4hvHa-y6Hf5 M;@i(%W!!Nb00C)&=>Px# delta 487 zcmeypldEkvSHl*@zy*v3(-$sal$xHufRTgI5Q%LBVyo~N)YNFC>Xl@a<|Y|T=UoUC zF+_+MLPU%ZB1Rw)nd$Kh8S7jPtWxz#^NRC}N>WpxCg^|-GQ^NDgh&`+NEl83u#hpx z31n1pNn%kE7L!oKkqkl+H<})@h%wRwXil_JL1|J>X0lQ&x|`5t5N4sv7)?L8h%wL} z8*Nu!%oxoIjDV&Uj9H98pRQnx07e0rG5}E~+wZJod@2u) n1DF-lFP~%#XEfNZcZ#uy3sq**6~8GkqAdfGnff>AJp*5kQt9oCTBxikWQR<;!?Y9soSZ B650R& delta 45 ucmbPpn{~o%)`l&N89s~#({p?nvlxx0-|}IMU^IkK1|Z60`!Qd}Yw`enXb?33 diff --git a/php/modules/Album.php b/php/modules/Album.php index 6ba81e0..dc690b0 100644 --- a/php/modules/Album.php +++ b/php/modules/Album.php @@ -52,6 +52,36 @@ class Album extends Module { } + public static function prepareData($data) { + + # This function requires the following album-attributes and turns them + # into a front-end friendly format: id, title, public, sysstamp, password + # Note that some attributes remain unchanged + + # Check dependencies + self::dependencies(isset($data)); + + # Init + $album = null; + + # Set unchanged attributes + $album['id'] = $data['id']; + $album['title'] = $data['title']; + $album['public'] = $data['public']; + + # Parse date + $album['sysdate'] = date('F Y', $data['sysstamp']); + + # Parse password + $album['password'] = ($data['password']=='' ? '0' : '1'); + + # Set placeholder for thumbs + $album['thumbs'] = array(); + + return $album; + + } + public function get() { # Check dependencies @@ -172,9 +202,8 @@ class Album extends Module { # For each album while ($album = $albums->fetch_assoc()) { - # Parse info - $album['sysdate'] = date('F Y', $album['sysstamp']); - $album['password'] = ($album['password']=='' ? '0' : '1'); + # Turn data from the database into a front-end friendly format + $album = Album::prepareData($album); # Thumbs if (($public===true&&$album['password']==='0')|| @@ -187,7 +216,7 @@ class Album extends Module { # For each thumb $k = 0; while ($thumb = $thumbs->fetch_object()) { - $album["thumb$k"] = LYCHEE_URL_UPLOADS_THUMB . $thumb->thumbUrl; + $album['thumbs'][$k] = LYCHEE_URL_UPLOADS_THUMB . $thumb->thumbUrl; $k++; } @@ -221,54 +250,87 @@ class Album extends Module { 'recent' => null ); + ### # Unsorted + ### + $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE album = 0 ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); $unsorted = $this->database->query($query); $i = 0; + + $return['unsorted'] = array( + 'thumbs' => array(), + 'num' => $unsorted->num_rows + ); + while($row = $unsorted->fetch_object()) { if ($i<3) { - $return['unsorted']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row->thumbUrl; + $return['unsorted']['thumbs'][$i] = LYCHEE_URL_UPLOADS_THUMB . $row->thumbUrl; $i++; } else break; } - $return['unsorted']['num'] = $unsorted->num_rows; + ### # Starred + ### + $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE star = 1 ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); $starred = $this->database->query($query); $i = 0; + + $return['starred'] = array( + 'thumbs' => array(), + 'num' => $starred->num_rows + ); + while($row3 = $starred->fetch_object()) { if ($i<3) { - $return['starred']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; + $return['starred']['thumbs'][$i] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; $i++; } else break; } - $return['starred']['num'] = $starred->num_rows; + ### # Public + ### + $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE public = 1 ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); $public = $this->database->query($query); $i = 0; + + $return['public'] = array( + 'thumbs' => array(), + 'num' => $public->num_rows + ); + while($row2 = $public->fetch_object()) { if ($i<3) { - $return['public']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row2->thumbUrl; + $return['public']['thumbs'][$i] = LYCHEE_URL_UPLOADS_THUMB . $row2->thumbUrl; $i++; } else break; } - $return['public']['num'] = $public->num_rows; + ### # Recent + ### + $query = Database::prepare($this->database, 'SELECT thumbUrl FROM ? WHERE LEFT(id, 10) >= unix_timestamp(DATE_SUB(NOW(), INTERVAL 1 DAY)) ' . $this->settings['sorting'], array(LYCHEE_TABLE_PHOTOS)); $recent = $this->database->query($query); $i = 0; + + $return['recent'] = array( + 'thumbs' => array(), + 'num' => $recent->num_rows + ); + while($row3 = $recent->fetch_object()) { if ($i<3) { - $return['recent']["thumb$i"] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; + $return['recent']['thumbs'][$i] = LYCHEE_URL_UPLOADS_THUMB . $row3->thumbUrl; $i++; } else break; } - $return['recent']['num'] = $recent->num_rows; + # Return SmartAlbums return $return; } diff --git a/php/modules/Photo.php b/php/modules/Photo.php index 8bdd7d4..c23ad4c 100755 --- a/php/modules/Photo.php +++ b/php/modules/Photo.php @@ -532,10 +532,13 @@ class Photo extends Module { # into a front-end friendly format: id, title, tags, public, star, album, thumbUrl, takestamp, url # Note that some attributes remain unchanged + # Check dependencies + self::dependencies(isset($data)); + # Init $photo = null; - # Set unchanged attribute + # Set unchanged attributes $photo['id'] = $data['id']; $photo['title'] = $data['title']; $photo['tags'] = $data['tags']; diff --git a/src/scripts/albums.js b/src/scripts/albums.js index 72dbb81..9db151f 100644 --- a/src/scripts/albums.js +++ b/src/scripts/albums.js @@ -59,13 +59,13 @@ albums.load = function() { albums.parse = function(album) { if (album.password==='1'&&lychee.publicMode===true) { - album.thumb0 = 'src/images/password.svg'; - album.thumb1 = 'src/images/password.svg'; - album.thumb2 = 'src/images/password.svg'; + album.thumbs[0] = 'src/images/password.svg'; + album.thumbs[1] = 'src/images/password.svg'; + album.thumbs[2] = 'src/images/password.svg'; } else { - if (!album.thumb0) album.thumb0 = 'src/images/no_images.svg'; - if (!album.thumb1) album.thumb1 = 'src/images/no_images.svg'; - if (!album.thumb2) album.thumb2 = 'src/images/no_images.svg'; + if (!album.thumbs[0]) album.thumbs[0] = 'src/images/no_images.svg'; + if (!album.thumbs[1]) album.thumbs[1] = 'src/images/no_images.svg'; + if (!album.thumbs[2]) album.thumbs[2] = 'src/images/no_images.svg'; } } @@ -77,9 +77,7 @@ albums._createSmartAlbums = function(data) { title: 'Unsorted', sysdate: data.unsorted.num + ' photos', unsorted: '1', - thumb0: data.unsorted.thumb0, - thumb1: data.unsorted.thumb1, - thumb2: data.unsorted.thumb2 + thumbs: data.unsorted.thumbs }; data.starred = { @@ -87,9 +85,7 @@ albums._createSmartAlbums = function(data) { title: 'Starred', sysdate: data.starred.num + ' photos', star: '1', - thumb0: data.starred.thumb0, - thumb1: data.starred.thumb1, - thumb2: data.starred.thumb2 + thumbs: data.starred.thumbs }; data.public = { @@ -97,9 +93,7 @@ albums._createSmartAlbums = function(data) { title: 'Public', sysdate: data.public.num + ' photos', public: '1', - thumb0: data.public.thumb0, - thumb1: data.public.thumb1, - thumb2: data.public.thumb2 + thumbs: data.public.thumbs }; data.recent = { @@ -107,9 +101,7 @@ albums._createSmartAlbums = function(data) { title: 'Recent', sysdate: data.recent.num + ' photos', recent: '1', - thumb0: data.recent.thumb0, - thumb1: data.recent.thumb1, - thumb2: data.recent.thumb2 + thumbs: data.recent.thumbs }; } diff --git a/src/scripts/build.js b/src/scripts/build.js index 565eec4..159c846 100644 --- a/src/scripts/build.js +++ b/src/scripts/build.js @@ -73,13 +73,13 @@ build.album = function(data) { } - if (data.thumb0.split('.').pop()==='svg') typeThumb = 'nonretina'; + if (data.thumbs[0].split('.').pop()==='svg') typeThumb = 'nonretina'; html = `
- thumb - thumb - thumb + thumb + thumb + thumb

${ title }

${ data.sysdate } diff --git a/src/scripts/contextMenu.js b/src/scripts/contextMenu.js index 45ed35f..f966643 100644 --- a/src/scripts/contextMenu.js +++ b/src/scripts/contextMenu.js @@ -87,9 +87,9 @@ contextMenu.albumTitle = function(albumID, e) { var that = this, title = ''; - if (!that.thumb0) that.thumb0 = 'src/images/no_cover.svg'; + if (!that.thumbs[0]) that.thumbs[0] = 'src/images/no_cover.svg'; - title = "
" + that.title + "
"; + title = "
" + that.title + "
"; if (that.id!=albumID) items.push({ type: 'item', title, fn: function() { lychee.goto(that.id) } }); @@ -224,8 +224,8 @@ contextMenu.move = function(photoIDs, e) { var that = this; - if (!that.thumb0) that.thumb0 = 'src/images/no_cover.svg'; - that.title = "
" + that.title + "
"; + if (!that.thumbs[0]) that.thumbs[0] = 'src/images/no_cover.svg'; + that.title = "
" + that.title + "
"; if (that.id!=album.getID()) items.push({ type: 'item', title: that.title, fn: function() { photo.setAlbum(photoIDs, that.id) } }); From c9f5d112d421d3a4fe00208254456447419127a2 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Fri, 13 Mar 2015 21:32:39 +0100 Subject: [PATCH 112/190] Use Album::prepareData in search --- php/modules/misc.php | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/php/modules/misc.php b/php/modules/misc.php index 462f51e..66734b9 100755 --- a/php/modules/misc.php +++ b/php/modules/misc.php @@ -20,9 +20,13 @@ function search($database, $settings, $term) { 'hash' => '' ); + ### # Photos + ### + $query = Database::prepare($database, "SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE title LIKE '%?%' OR description LIKE '%?%' OR tags LIKE '%?%'", array(LYCHEE_TABLE_PHOTOS, $term, $term, $term)); $result = $database->query($query); + while($photo = $result->fetch_assoc()) { $photo = Photo::prepareData($photo); @@ -30,29 +34,31 @@ function search($database, $settings, $term) { } + ### # Albums + ### + $query = Database::prepare($database, "SELECT id, title, public, sysstamp, password FROM ? WHERE title LIKE '%?%' OR description LIKE '%?%'", array(LYCHEE_TABLE_ALBUMS, $term, $term)); $result = $database->query($query); - $i = 0; - while($row = $result->fetch_object()) { - # Info - $return['albums'][$row->id]['id'] = $row->id; - $return['albums'][$row->id]['title'] = $row->title; - $return['albums'][$row->id]['public'] = $row->public; - $return['albums'][$row->id]['sysdate'] = date('F Y', $row->sysstamp); - $return['albums'][$row->id]['password'] = ($row->password=='' ? false : true); + while($album = $result->fetch_assoc()) { + + # Turn data from the database into a front-end friendly format + $album = Album::prepareData($album); # Thumbs - $query = Database::prepare($database, "SELECT thumbUrl FROM ? WHERE album = '?' " . $settings['sorting'] . " LIMIT 0, 3", array(LYCHEE_TABLE_PHOTOS, $row->id)); - $result2 = $database->query($query); - $k = 0; - while($row2 = $result2->fetch_object()){ - $return['albums'][$row->id]["thumb$k"] = LYCHEE_URL_UPLOADS_THUMB . $row2->thumbUrl; + $query = Database::prepare($database, "SELECT thumbUrl FROM ? WHERE album = '?' " . $settings['sorting'] . " LIMIT 0, 3", array(LYCHEE_TABLE_PHOTOS, $album['id'])); + $thumbs = $database->query($query); + + # For each thumb + $k = 0; + while ($thumb = $thumbs->fetch_object()) { + $album['thumbs'][$k] = LYCHEE_URL_UPLOADS_THUMB . $thumb->thumbUrl; $k++; } - $i++; + # Add to return + $return['albums'][$album['id']] = $album; } From 26cdd98dfcabbeffa09fe82f10bf348fbf05ecd2 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sat, 14 Mar 2015 22:34:15 +0100 Subject: [PATCH 113/190] Fixed fading divider in infobox --- src/scripts/album.js | 2 +- src/scripts/albums.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scripts/album.js b/src/scripts/album.js index 3569512..f616fbb 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -37,7 +37,7 @@ album.load = function(albumID, refresh) { if (!refresh) { lychee.animate('.album, .photo', 'contentZoomOut'); - lychee.animate('.divider', 'fadeOut'); + lychee.animate('#content .divider', 'fadeOut'); } startTime = new Date().getTime(); diff --git a/src/scripts/albums.js b/src/scripts/albums.js index 9db151f..d38140c 100644 --- a/src/scripts/albums.js +++ b/src/scripts/albums.js @@ -16,7 +16,7 @@ albums.load = function() { waitTime; lychee.animate('.album, .photo', 'contentZoomOut'); - lychee.animate('.divider', 'fadeOut'); + lychee.animate('#content .divider', 'fadeOut'); startTime = new Date().getTime(); From 7410cf773e246bb7e8c35c5f4b03ee821bbbe273 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 15 Mar 2015 00:39:45 +0100 Subject: [PATCH 114/190] Return true/false in header functions --- src/scripts/header.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/scripts/header.js b/src/scripts/header.js index e63af5c..f970761 100644 --- a/src/scripts/header.js +++ b/src/scripts/header.js @@ -29,15 +29,15 @@ header.show = function() { if ($('#imageview #image.small').length>0) $('#imageview #image').css('margin-top', newMargin); else $('#imageview #image').removeClass('full'); + return true; + } -header.hide = function(e, delay) { +header.hide = function(e, delay = 500) { - var newMargin = -1*($('#imageview #image').height()/2); + if (visible.photo()&&!visible.sidebar()&&!visible.contextMenu()&&!visible.message()) { - if (delay===undefined) delay = 500; - - if (visible.photo()&&!visible.infobox()&&!visible.contextMenu()&&!visible.message()) { + var newMargin = -1*($('#imageview #image').height()/2); clearTimeout($(window).data('timeout')); @@ -52,17 +52,22 @@ header.hide = function(e, delay) { }, delay)); + return true; + } + return false; + } -header.setTitle = function(title) { +header.setTitle = function(title = 'Untitled') { - var $title = header.dom('#title'), - title = title || 'Untitled'; + var $title = header.dom('#title'); $title.html(title + build.iconic('caret-bottom')); + return true; + } header.setMode = function(mode) { @@ -77,6 +82,7 @@ header.setMode = function(mode) { $('#tools_album, #tools_photo').hide(); $('#tools_albums').show(); + return true; break; case 'album': @@ -100,6 +106,7 @@ header.setMode = function(mode) { $('#button_info_album, #button_trash_album, #button_share_album').show(); } + return true; break; case 'photo': @@ -108,10 +115,13 @@ header.setMode = function(mode) { $('#tools_albums, #tools_album').hide(); $('#tools_photo').show(); + return true; break; } + return false; + } header.setEditable = function(editable) { @@ -124,4 +134,6 @@ header.setEditable = function(editable) { if (editable) $title.addClass('editable'); else $title.removeClass('editable'); + return true; + } \ No newline at end of file From 7314245e60bec2ae6b9af5c629197642f57555d2 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 15 Mar 2015 00:43:28 +0100 Subject: [PATCH 115/190] Improved getID --- src/scripts/album.js | 11 +++++------ src/scripts/photo.js | 10 +++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/scripts/album.js b/src/scripts/album.js index f616fbb..a1e8226 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -11,18 +11,17 @@ album = { album.getID = function() { - var id; + var id = null; if (photo.json) id = photo.json.album; else if (album.json) id = album.json.id; - else id = $('.album:hover, .album.active').attr('data-id'); // Search - if (!id) id = $('.album:hover, .album.active').attr('data-id'); - if (!id) id = $('.photo:hover, .photo.active').attr('data-album-id'); + if ($.isNumeric(id)===false) id = $('.album:hover, .album.active').attr('data-id'); + if ($.isNumeric(id)===false) id = $('.photo:hover, .photo.active').attr('data-album-id'); - if (id) return id; - else return false; + if ($.isNumeric(id)===true) return id; + else return false; } diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 6c019af..7a83f01 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -12,13 +12,13 @@ photo = { photo.getID = function() { - var id; + var id = null; - if (photo.json) id = photo.json.id; - else id = $('.photo:hover, .photo.active').attr('data-id'); + if (photo.json) id = photo.json.id; + else id = $('.photo:hover, .photo.active').attr('data-id'); - if (id) return id; - else return false; + if ($.isNumeric(id)===false) return id; + else return false; } From 56443a16c26465488ef0d280916e90442b535143 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 15 Mar 2015 01:07:41 +0100 Subject: [PATCH 116/190] Fixed photo.getID --- src/scripts/photo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scripts/photo.js b/src/scripts/photo.js index 7a83f01..bad5bf6 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -17,8 +17,8 @@ photo.getID = function() { if (photo.json) id = photo.json.id; else id = $('.photo:hover, .photo.active').attr('data-id'); - if ($.isNumeric(id)===false) return id; - else return false; + if ($.isNumeric(id)===true) return id; + else return false; } From 2b39f64c3471339053afd089341b1f6c910aa151 Mon Sep 17 00:00:00 2001 From: Tobias Reich Date: Sun, 15 Mar 2015 01:48:11 +0100 Subject: [PATCH 117/190] Infobox to Sidebar (rewrite) - Sidebar now visible along content - Interact with the content while the sidebar stays open - Fixed "ctrl+a also selects the "about" tab #230" - Sidebar redesign - Own module for the sidebar --- dist/main.css | Bin 34327 -> 34559 bytes dist/main.js | Bin 171259 -> 171551 bytes dist/view.js | Bin 93596 -> 93522 bytes index.html | 11 +- src/scripts/build.js | 10 +- src/scripts/init.js | 25 +---- src/scripts/lychee.js | 5 +- src/scripts/multiselect.js | 8 +- src/scripts/sidebar.js | 88 ++++++++++++++++ src/scripts/view.js | 75 +++++-------- src/scripts/visible.js | 6 +- src/styles/_content.scss | 2 + src/styles/_header.scss | 2 + src/styles/{_infobox.scss => _sidebar.scss} | 111 ++++++++++---------- src/styles/main.scss | 2 +- 15 files changed, 197 insertions(+), 148 deletions(-) create mode 100644 src/scripts/sidebar.js rename src/styles/{_infobox.scss => _sidebar.scss} (76%) diff --git a/dist/main.css b/dist/main.css index 8afd3190cfc6a1081b1922bf0d179f65947b21a7..500a4a52bc77179b9d51f3d12df24ae9c5f0819b 100644 GIT binary patch delta 1043 zcmZ`%O=uHA7^THftx;)X(jTHuo7OflyCzwSHi2r?)SN~Fg)Hj^L=mLo3(qbzwWob z{3s#Op$aKsdu5p_Ov}nxmxt4-)F2X&luB8Z>U(Lnqs>1AC&phx{!*x#m{Zgj(; zi8k1X9fh4xsHzq^+WG~78mcK`nb9SJL@JvGl~+`%>)BW)Gb)W=sA|(Y?Y!f|WE8do zQCPe7v=w3t zI#C%+v0i{%Ax|C@XGQohFC6rz_!7Yt5SSenqzt?()X}SC_vsqv4OorUZx|+@hG`J^8IMkRppPzErp>Uya>Ak`+;m)VPOVM0sr>&E z*8opT({S>3IGAKMHXIAv#9+`;81hJIH_46g>`Pk}fyj2UpLh*crFj|q_*UX9LJQci0=v#HG*Bkktpk?L*P5^4ga$Q=_@mP>t2FYjQ*A7 zsZlS>2gS2|#yYuko;OnHlKW3>_ea=ur&s)-z4xWu)GLCcVN+SIx!QQ&fI4@8w;>8; zke-adk7Bfm{WckcG5m~=|B6x5i9DI%Of7uKp9{fbwUgg@qmJ)uOr9$r=aswVL`x2~ zG`6|a>K*e0DXUclQ1U>6v%_ delta 845 zcmZ9J-*3`T6vqRRp>q%gBm*H75kpyvEk7KTM4fR)U82rpMkZ5R`f~zppaM!v)Mt&F zqw#Um_+m6>5ube9U!cAi;}bmjV3zpo%WQ>Sj5$s3=j5Jy?)iT2_Cx#g2lkDxnfKXq zd!0&MR5`T+OYsT0mdA)Eww;SFp zP4ylv{GRB2yf~OdEuRn}=sQC2edR}R)cKm)5*k(ZR`)ik)On%9WQw5GqVUe?ffE5g zXm01hJbuR-1eIlrn%Y!!MXfWU(h+#*UyXw8-u`rkB8Fe8kjIOL5V9$=yxL|+TI*mG zmNxzkiDMHKVMb~ehsA{?L`o63;PXSM6rDu3r2uRBV2yA)E+@!B8t#_Ec4JvD2V8}8 zd^{Bt_|OiTqT(R($B^1DLLTuR@skUADe#I8FBStkEmh!>N^Z2x-K=Q>B<&Gzj?y}4 znBg11aeg0!*;!|d7R`X4XQ>eqF`6}FJeT!sm`uZ9&U?7VHYBCa&^g0{3>C-zLWQkX z5@tqXX=4K~wiRBNnXI9P=8hr-E$$@ZP3{}w^$L#obA?0vmcNf!6P6Lzq#49((!8w* zeS8{L|+7GXk4b=9^YR2N;v(>oGN?`NGQ^e&eiTH69&D7hfdV+rd`Oq(| diff --git a/dist/main.js b/dist/main.js index 9f079ff9b56c65b54693d75adc91df7f82ccb9d1..6673c02ca79e13b14214be73c7bc8f1a1a4edc0c 100644 GIT binary patch delta 3940 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 S>AQf#$F71&^B+XNg#Q697zPsn diff --git a/dist/view.js b/dist/view.js index a33cc7ef3589cdb8fa5ae711f2cc4821ac602cce..cad47666cebccdb6029758f52cf5364e73c8f747 100644 GIT binary patch delta 340 zcmbPpoAuHy)(x|Hc;id-N>YnUG!iw{)WSEf;CaH#7{9q!;Ef1l_~a^8TeW!G=vW;m z+jza=oXq4@ohl$JIX^Esu|y{V$Sf!=&d>?9jo*A%br&-~P*HwSiB53=NU2r)=4F~Q zg&5-}JJ=Ke4clnb<Yh(Kdk%$XVn(1xT8^+yIgSt{JT1wgx)!n`>QXDhY+FspUi) z#_FWm=0qFB+S=NNPu9pt2CD1HumqCFGCG0A1Y`!6@P(Jy>c{0K7NuwA=>v6dygQp0 zDCPV5Y8Yeqc4a38`GfPZ{I4Yr8Qri}Dm_rlck%76oMFm*h`&3>4n(8_k%` zDymeglT@0SlcEQecg#sD%>~I%2g=)Rw@hTTVPsL#)G3~>5W^@nJvN4spRsg$VGN_< R_6tdj?-;k=O<~;60RTTVbddl6 delta 403 zcmca~i*?Rz)(x|Hc*9HdN>YnUG!iw{)Z#a<;CaH#7{0kz;Ef1l{NyTCTeWc8=vW;m z+i<<&oXq4@ohl$JIX^Esu|y{V$Sf!=&d>?94c~lMbr&-~P*HwSiB53=NU2r$=4F~Q zg&4ypJJ=Ke4clnb<bi(Kdk%$XVn(1xT8^+yIgSt{JTHwgx)kn`>QXDhb7_spUi) z#_FWm=0qFB+S=O2Pu9pt2CD1HumqCFGCG0A1Y`!6@Wq$d>c{0K7NuwA=>v6dygQp0 zDCPV5Y8Yeuc4a38`GfPZ`6vYr8Qri}GaVrR68(R|I6_m*h`&3>4n(8_k%` zYGRX;S*DPjlUQ7AtDaPvTaa3$ZfBzp6ts)U - + @@ -80,7 +80,7 @@ - + @@ -103,13 +103,10 @@
- -
+ +