photos/js/photos-src_patchedRequest_j...

1 line
77 KiB
XML

{"version":3,"file":"photos-src_patchedRequest_js-node_modules_moment_locale_sync_recursive_-src_views_Timeline_vue.js?v=7e7cfd3153be8bb76487","mappings":";yKAsBA,MAAMA,EAAUC,EAAQ,OAElBC,EAA2BF,EAAQG,sBAMzCH,EAAQG,sBAAwB,SAASC,EAAgBC,GAEpDA,EAAcC,aAAoD,iBAA9BD,EAAcC,cACrDF,EAAeE,YAAcD,EAAcC,aAI5CJ,EAAyBE,EAAgBC,GAGrCA,EAAcE,QAA0C,iBAAzBF,EAAcE,SAChDH,EAAeG,OAASF,EAAcE,SAIxCC,EAAOC,QAAUT,kHCjBDU,IAAAA,aACRC,MAAM,UAAWC,EAAAA,SAGzB,MAAMC,GAASC,EAAAA,EAAAA,mBAAkB,OAC3BC,EAASL,IAAAA,aAAoBG,GAGnC,GAD0BG,GAAAA,CAASH,GAAQI,SAC3C,iDCfA,MAAMC,EAAS,8RClBXC,QAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACZ,EAAOa,GAAI,oCAAqC,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,yCAAyC,MAAQ,GAAG,SAAW,4BAA4B,eAAiB,CAAC,kqBAAkvB,WAAa,MAEr9B,4FCJIF,QAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACZ,EAAOa,GAAI,8GAA+G,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,+CAA+C,MAAQ,GAAG,SAAW,6CAA6C,eAAiB,CAAC,40BAA45B,WAAa,MAEhuC,4FCJIF,QAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACZ,EAAOa,GAAI,mHAAoH,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,8CAA8C,MAAQ,GAAG,SAAW,wDAAwD,eAAiB,CAAC,qgCAAqlC,WAAa,MAEx6C,4FCJIF,QAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACZ,EAAOa,GAAI,ujCAAwjC,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,wCAAwC,sCAAsC,MAAQ,GAAG,SAAW,8SAA8S,eAAiB,CAAC,82CAA82C,i0CAA+4C,WAAa,MAE1yI,2BCPA,IAAIC,EAAM,CACT,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,MACX,aAAc,MACd,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,gBAAiB,MACjB,aAAc,MACd,gBAAiB,MACjB,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,MACX,aAAc,MACd,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,WAAY,MACZ,cAAe,MACf,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,YAAa,MACb,eAAgB,MAChB,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,QAAS,MACT,aAAc,MACd,gBAAiB,MACjB,WAAY,MACZ,UAAW,KACX,aAAc,KACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,YAAa,MACb,eAAgB,MAChB,UAAW,KACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,gBAAiB,MACjB,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,OAIf,SAASC,EAAeC,GACvB,IAAIH,EAAKI,EAAsBD,GAC/B,OAAOE,EAAoBL,GAE5B,SAASI,EAAsBD,GAC9B,IAAIE,EAAoBC,EAAEL,EAAKE,GAAM,CACpC,IAAII,EAAI,IAAIC,MAAM,uBAAyBL,EAAM,KAEjD,MADAI,EAAEE,KAAO,mBACHF,EAEP,OAAON,EAAIE,GAEZD,EAAeQ,KAAO,WACrB,OAAOC,OAAOD,KAAKT,IAEpBC,EAAeU,QAAUR,EACzBjB,EAAOC,QAAUc,EACjBA,EAAeF,GAAK,mECnSpB,mGCyCea,eAAA,IAAoD,IAArCC,EAAqC,wDAAdC,EAAc,uDAAJ,GAG9DA,EAAUJ,OAAOK,OAAO,GAAI,CAC3BC,KAAM,EACNC,QAA2B,GAAlBC,EAAAA,MAAAA,IAAAA,MACTC,UAAWC,EAAAA,GACXC,WAAW,GACTP,GAEH,MAAMQ,EAAc,WAASC,EAAAA,EAAAA,kBAAiBC,MAIxCC,EAASX,EAAQK,UAAUO,QAAO,CAACC,EAAKC,IAAU,GAAED,iGAK3CC,kCAEZ,IAEGC,EAAchB,EAChB,yHAMD,GAEGQ,EAAYP,EAAQO,UACtB,SAAQS,MAAM,IAAIC,KAAK,GACxB/B,KAAI,CAACgC,EAAGC,KACR,MAAMC,EAAQC,GAAAA,CAAOC,KAAKC,OAAOC,QAAQ,OAAOC,SAAS,EAAG,KAAKA,SAASN,EAAQ,EAAG,KAC/EO,EAAML,GAAAA,CAAOC,KAAKC,OAAOI,MAAM,OAAOC,IAAI,EAAG,KAAKH,SAASN,EAAQ,EAAG,KAC5E,MAAQ,6HAKMC,EAAMS,OAAOR,IAAAA,oKAMbK,EAAIG,OAAOR,IAAAA,oEAGvBS,KAAK,eACP,GAEH9B,EAAUJ,OAAOK,OAAO,CACvB9B,OAAQ,SACR4D,QAAS,CACR,eAAgB,YAEjBC,KAAO,4XASAlD,EAAAA,qHAKQ0B,uLAOPG,2CAEDI,oBACAR,iRAUWP,EAAQG,qDACJH,EAAQE,KAAOF,EAAQG,qGAI7C8B,MAAM,EACNC,SAAS,GACPlC,GAEH,MAAMmC,QAAiBxD,EAAAA,EAAAA,qBAA4B,GAAIqB,GAEvD,OAAOmC,EAASH,KACd9C,KAAI8C,IAAQI,EAAAA,EAAAA,IAAYJ,KAExB9C,KAAI8C,GAAQpC,OAAOK,OAAO,GAAI+B,EAAM,CAAEK,SAAUL,EAAKK,SAASC,QAAQ9B,EAAY,6CCrHrF,MC/BuK,ED+BvK,CACA,oJErBIR,EAAU,GAEdA,EAAQuC,kBAAoB,IAC5BvC,EAAQwC,cAAgB,IAElBxC,EAAQyC,OAAS,SAAc,KAAM,QAE3CzC,EAAQ0C,OAAS,IACjB1C,EAAQ2C,mBAAqB,IAEhB,IAAI,IAAS3C,GAKJ,KAAW,YAAiB,0BCPlD,SAXgB,OACd,GCTW,WAAa,IAAI4C,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACE,YAAY,UAAU,CAACN,EAAIO,GAAG,QAAO,WAAW,MAAO,CAACH,EAAG,OAAO,CAACE,YAAY,sBAAqB,KACxL,IDWpB,EACA,KACA,KACA,MAI8B,wFEsChC,MCzD6K,EDyD7K,CACA,oBACA,YACA,QADA,UAEA,aAFA,eAGA,KAHA,IAIA,SAJA,IAKA,WALA,IAMA,qBAEA,OACA,WACA,WACA,iBAGA,SACA,iBAIA,mBAIA,oBAIA,yBAIA,qCE/EI,EAAU,GAEd,EAAQX,kBAAoB,IAC5B,EAAQC,cAAgB,IAElB,EAAQC,OAAS,SAAc,KAAM,QAE3C,EAAQC,OAAS,IACjB,EAAQC,mBAAqB,IAEhB,IAAI,IAAS,GAKJ,KAAW,YAAiB,WCPlD,SAXgB,OACd,GCTW,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACE,YAAY,iBAAiB,CAA2B,IAAzBN,EAAIQ,UAAUC,OAAcL,EAAG,UAAU,CAACM,MAAM,CAAC,aAAaV,EAAIW,EAAE,SAAU,OAAO,SAAU,IAAO,CAACP,EAAG,OAAO,CAACM,MAAM,CAAC,KAAO,QAAQE,KAAK,SAASZ,EAAIa,GAAG,KAAKT,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQV,EAAIW,EAAE,SAAU,iBAAiBG,GAAG,CAAC,MAAQd,EAAIe,eAAe,CAACX,EAAG,aAAa,CAACM,MAAM,CAAC,KAAO,QAAQE,KAAK,UAAU,GAAGZ,EAAIa,GAAG,KAAKT,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQV,EAAIW,EAAE,SAAU,qBAAqBG,GAAG,CAAC,MAAQd,EAAIgB,iBAAiB,CAACZ,EAAG,kBAAkB,CAACM,MAAM,CAAC,KAAO,QAAQE,KAAK,UAAU,IAAI,GAAG,CAACR,EAAG,UAAU,CAACM,MAAM,CAAC,eAAc,EAAK,SAAU,IAAO,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQV,EAAIW,EAAE,SAAU,iBAAiBG,GAAG,CAAC,MAAQd,EAAIiB,kBAAkB,CAACb,EAAG,OAAO,CAACM,MAAM,CAAC,KAAO,QAAQE,KAAK,UAAU,IAAI,GAAGZ,EAAIa,GAAG,KAAKT,EAAG,UAAU,CAACM,MAAM,CAAC,cAAa,IAAO,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQV,EAAIW,EAAE,SAAU,WAAWG,GAAG,CAAC,MAAQd,EAAIkB,kBAAkB,CAACd,EAAG,WAAW,CAACM,MAAM,CAAC,KAAO,QAAQE,KAAK,UAAU,IAAI,KAAK,KACnhC,IDWpB,EACA,KACA,WACA,MAI8B,QE+BzB,SAASO,EAAqBC,EAAOC,GAC3C,MAAMC,EAmBP,SAA4BF,GAC3B,OAAOA,EAAMpD,QAKZ,CAACsD,EAAcC,KACd,MAAMC,EAAQ,GAAEC,EAAWF,EAAKG,SAASC,QAAS,WAAWF,EAAWF,EAAKG,SAASC,QAAS,UAE/F,MAAO,IACHL,EACH,CAACE,GAAO,IAAKF,EAAaE,IAAS,GAAKD,MAG1C,IAjCoBK,CAAmBR,GAExC,OAAOpE,OAAOD,KAAKuE,GAActD,QAKhC,CAAC6D,EAAeC,KACR,IACHD,EACH,CAACC,GAAQC,EAAiBT,EAAaQ,GAAQT,MAE9C,IA8BL,SAASI,EAAWD,EAAMvC,GACzB,OAAOR,GAAAA,CAAO+C,GAAMvC,OAAOA,GAW5B,SAAS8C,EAAiBX,EAAOC,GAChC,GAAuB,IAAnBA,EACH,MAAO,GAGR,MAAMW,EAAO,GACb,IAAIC,EAAY,EAEhB,KAAOb,EAAMX,OAAS,GAAG,CAExB,MAAMyB,EAAW,GAGjB,GAECA,EAAS9F,KAAKgF,EAAMe,eACZf,EAAMX,OAAS,GAAK2B,EAAgB,IAAIF,EAAUd,EAAMA,EAAMX,OAAS,MAAQY,GAExFW,EAAKC,KAAe,CACnBb,MAAOc,EACPG,OAAQC,EAAiBJ,EAAUb,EAAiC,IAAjBD,EAAMX,SAI3D,OAAOuB,EASR,SAASI,EAAgBhB,GACxB,OAAOA,EACL9E,KAAIiF,GAA2BA,EAAKgB,MAAQhB,EAAKc,OAjG5B,MAkGrBrE,QAAO,CAACwE,EAAKC,IAAcD,EAAMC,IA0BpC,SAASH,EAAiBlB,EAAOC,EAAgBqB,GAKhD,IAAIC,EAAYtB,EAJQD,EACtB9E,KAAIiF,GAASA,EAAKgB,MAAQhB,EAAKc,SAC/BrE,QAAO,CAACwE,EAAKC,IAAcD,EAAMC,IAgBnC,OAVqB,IAAjBrB,EAAMX,QAAgBW,EAAM,GAAGmB,MAAQlB,IAC1CsB,EAAYtB,GAAkBD,EAAM,GAAGmB,MAAQnB,EAAM,GAAGiB,SAKrDK,IACHC,EAAYC,KAAKC,IA5IK,IA4IgBF,IAGhCA,ECrIR,MCrD4K,EDqD5K,CACA,mBACA,YACA,gBAEA,OAEA,OACA,WACA,aAEA,gBACA,cACA,aAEA,QACA,YACA,cAGA,UACA,CAEA,iBAEA,kBAGA,UACA,YACA,yEAGA,gBACA,2CAIA,UACA,sBACA,wDACA,6DAEA,gBACA,gEAEA,SAIA,uBACA,yDAGA,8CACA,mDEjGI,EAAU,GAEd,EAAQhD,kBAAoB,IAC5B,EAAQC,cAAgB,IAElB,EAAQC,OAAS,SAAc,KAAM,QAE3C,EAAQC,OAAS,IACjB,EAAQC,mBAAqB,IAEhB,IAAI,IAAS,GAKJ,KAAW,YAAiB,WCPlD,SAXgB,OACd,GCTW,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACA,EAAG,eAAe,CAACM,MAAM,CAAC,UAAYV,EAAIQ,aAAaR,EAAIa,GAAG,KAAKT,EAAG,MAAM,CAAC0C,IAAI,YAAYxC,YAAY,mBAAmBN,EAAI+C,GAAI/C,EAAiB,eAAE,SAASgD,EAAclB,GAAO,OAAO1B,EAAG,MAAM,CAAC6C,IAAInB,GAAO,CAAC1B,EAAG,KAAK,CAACE,YAAY,kBAAkB,CAACF,EAAG,IAAI,CAACJ,EAAIa,GAAGb,EAAIkD,GAAGpB,EAAMqB,MAAM,KAAK,OAAOnD,EAAIa,GAAG,IAAIb,EAAIkD,GAAGpB,EAAMqB,MAAM,KAAK,IAAI,cAAcnD,EAAIa,GAAG,KAAKb,EAAI+C,GAAG,GAAgB,SAASK,EAAIC,GAAO,OAAOjD,EAAG,MAAM,CAAC6C,IAAII,EAAM/C,YAAY,YAAYgD,MAAM,CAAEjB,OAAUe,EAAU,OAAI,OAASpD,EAAI+C,GAAIK,EAAS,OAAE,SAAS7B,GAAM,OAAOnB,EAAGmB,EAAKgC,gBAAgB,CAACN,IAAI1B,EAAKiC,OAAOC,IAAI,YAAYH,MAAM,CAAGf,MAASa,EAAIf,OAASd,EAAKgB,MAAQhB,EAAKc,OAAU,KAAOA,OAAUe,EAAU,OAAI,MAAQ1C,MAAM,CAAC,KAAOa,EAAK,UAAsD,IAA3CvB,EAAI0D,aAAanC,EAAKG,SAAS8B,SAAkB1C,GAAG,CAAC,iBAAiBd,EAAI2D,yBAAwB,OAAM,MAAK,IAAI,KACv5B,IDWpB,EACA,KACA,KACA,MAI8B,uBEqDhC,MCxEyK,GDwEzK,CACA,gBACA,YACA,aADA,IAEA,WAFA,IAGA,eAEA,aACA,OACA,SACA,aACA,aAEA,eACA,aACA,YAEA,WACA,WACA,kBAEA,WACA,YACA,aAEA,MACA,YACA,YAEA,WACA,aACA,aAIA,UACA,CACA,mBACA,QACA,WACA,OACA,oBAIA,cAEA,SACA,QACA,aAGA,WACA,qBACA,wBACA,kBAGA,cAaA,sCACA,WA6BA,OAZA,QACA,qBACA,aACA,EACA,mBACA,yBACA,YAEA,+BACA,iCACA,sBAEA,MAIA,UACA,kCAIA,OACA,YAEA,oBACA,mCAEA,mBAEA,kBAEA,kBACA,oBAIA,wBAEA,oBACA,mCAEA,kBACA,KAGA,gBAEA,oBACA,oCAIA,SAOA,oBACA,aACA,2BAIA,oBACA,mCAIA,0BACA,gCAIA,qCACA,qBAEA,gCAEA,IAEA,oCACA,eACA,UACA,yBACA,2BAaA,OATA,eACA,cAGA,yCACA,sCAEA,aAEA,EACA,mBAGA,oBACA,SAcA,OAbA,gCACA,yBACA,eACA,iBACA,6CACA,MAEA,cAKA,qCACA,oBAtCA,QAyCA,gCACA,0BAOA,aACA,sCACA,aACA,gBACA,YACA,oBACA,gCACA,wBACA,oCAIA,uBACA,mCEpSI,GAAU,GAEd,GAAQhE,kBAAoB,IAC5B,GAAQC,cAAgB,IAElB,GAAQC,OAAS,SAAc,KAAM,QAE3C,GAAQC,OAAS,IACjB,GAAQC,mBAAqB,IAEhB,IAAI,KAAS,IAKJ,MAAW,aAAiB,YCPlD,UAXgB,OACd,IrBTW,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAsB,MAAdF,EAAI4D,MAAexD,EAAG,eAAe,CAACM,MAAM,CAAC,oBAAoB,WAAW,CAACV,EAAIa,GAAG,OAAOb,EAAIkD,GAAGlD,EAAIW,EAAE,SAAU,+BAA+B,QAASX,EAAS,MAAEI,EAAG,eAAe,CAACJ,EAAIa,GAAG,OAAOb,EAAIkD,GAAGlD,EAAIW,EAAE,SAAU,sBAAsB,QAAQP,EAAG,MAAM,CAAEJ,EAAW,QAAEI,EAAG,aAAa,CAAC6C,IAAI,aAAavC,MAAM,CAAC,SAAWV,EAAI6D,KAAK,SAAW,IAAI,aAAa7D,EAAI8D,aAAa9D,EAAI+D,KAAK/D,EAAIa,GAAG,KAAMb,EAAW,QAAEI,EAAG,eAAe,CAACM,MAAM,CAAC,oBAAoB,UAAU,CAACV,EAAIa,GAAG,SAASb,EAAIkD,GAAGlD,EAAIW,EAAE,SAAU,sBAAsB,UAAUX,EAAI+D,KAAK/D,EAAIa,GAAG,KAAKT,EAAG,MAAM,CAACE,YAAY,kBAAkB,CAACF,EAAG,cAAc,CAAC0C,IAAI,cAAcpC,MAAM,CAAC,MAAQV,EAAIgE,YAAY,kBAAkBhE,EAAIiE,WAAW,OAASjE,EAAIkE,oBAAoB,IAAI,KAClzB,IqBWpB,EACA,KACA,WACA,MAI8B","sources":["webpack:///photos/src/patchedRequest.js","webpack:///photos/src/services/DavClient.js","webpack:///photos/src/services/DavRequest.js","webpack:///photos/src/components/Loader.vue?vue&type=style&index=0&lang=scss&","webpack:///photos/src/components/PhotosHeader.vue?vue&type=style&index=0&id=480e67f5&lang=scss&scoped=true&","webpack:///photos/src/components/TiledLayout.vue?vue&type=style&index=0&lang=scss&","webpack:///photos/src/views/Timeline.vue?vue&type=style&index=0&id=7f201254&lang=scss&scoped=true&","webpack:///photos/node_modules/moment/locale|sync|/^\\.\\/.*$","webpack:///photos/src/views/Timeline.vue?vue&type=template&id=7f201254&scoped=true&","webpack:///photos/src/services/PhotoSearch.js","webpack:///photos/src/components/Loader.vue","webpack:///photos/src/components/Loader.vue?vue&type=script&lang=js&","webpack://photos/./src/components/Loader.vue?eb1b","webpack://photos/./src/components/Loader.vue?5508","webpack:///photos/src/components/Loader.vue?vue&type=template&id=7bbb2dd6&","webpack:///photos/src/components/PhotosHeader.vue","webpack:///photos/src/components/PhotosHeader.vue?vue&type=script&lang=js&","webpack://photos/./src/components/PhotosHeader.vue?e591","webpack://photos/./src/components/PhotosHeader.vue?c20b","webpack:///photos/src/components/PhotosHeader.vue?vue&type=template&id=480e67f5&scoped=true&","webpack:///photos/src/services/TiledLayout.js","webpack:///photos/src/components/TiledLayout.vue","webpack:///photos/src/components/TiledLayout.vue?vue&type=script&lang=js&","webpack://photos/./src/components/TiledLayout.vue?f032","webpack://photos/./src/components/TiledLayout.vue?e02f","webpack:///photos/src/components/TiledLayout.vue?vue&type=template&id=4b10780a&","webpack:///photos/src/views/Timeline.vue","webpack:///photos/src/views/Timeline.vue?vue&type=script&lang=js&","webpack://photos/./src/views/Timeline.vue?7d25","webpack://photos/./src/views/Timeline.vue?2f21"],"sourcesContent":["/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst request = require('webdav/dist/node/request')\n\nconst oldPrepareRequestOptions = request.prepareRequestOptions\n\n// While we wait for official cancellable webdav requests\n// https://github.com/perry-mitchell/webdav-client/issues/179\n// let's properly forward our axios options through webdav to axios\n\nrequest.prepareRequestOptions = function(requestOptions, methodOptions) {\n\t// add our cancelToken support\n\tif (methodOptions.cancelToken && typeof methodOptions.cancelToken === 'object') {\n\t\trequestOptions.cancelToken = methodOptions.cancelToken\n\t}\n\n\t// exploit old method\n\toldPrepareRequestOptions(requestOptions, methodOptions)\n\n\t// allow us to override the request method\n\tif (methodOptions.method && typeof methodOptions.method === 'string') {\n\t\trequestOptions.method = methodOptions.method\n\t}\n}\n\nmodule.exports = request\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport webdav from 'webdav'\nimport axios from '@nextcloud/axios'\nimport parseUrl from 'url-parse'\nimport { generateRemoteUrl } from '@nextcloud/router'\n\n// force our axios\nconst patcher = webdav.getPatcher()\npatcher.patch('request', axios)\n\n// init webdav client on default dav endpoint\nconst remote = generateRemoteUrl('dav')\nconst client = webdav.createClient(remote)\n\nexport const remotePath = parseUrl(remote).pathname\nexport default client\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst props = `\n\t<oc:fileid />\n\t<d:getlastmodified />\n\t<d:getetag />\n\t<d:getcontenttype />\n\t<d:getcontentlength />\n\t<nc:has-preview />\n\t<nc:file-metadata-size />\n\t<oc:favorite />\n\t<d:resourcetype />`\n\nexport { props }\nexport default `<?xml version=\"1.0\"?>\n\t\t\t<d:propfind xmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<d:prop>\n\t\t\t\t\t${props}\n\t\t\t\t</d:prop>\n\t\t\t</d:propfind>`\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".loader{display:grid;height:60px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Loader.vue\"],\"names\":[],\"mappings\":\"AAsCA,QACC,YAAA,CACA,WAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.loader {\\n\\tdisplay: grid;\\n\\theight: 60px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".photos-header[data-v-480e67f5]{margin:16px 0;display:flex}.photos-header>*[data-v-480e67f5]{margin:0 16px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/PhotosHeader.vue\"],\"names\":[],\"mappings\":\"AAmGA,gCACC,aAAA,CACA,YAAA,CAEA,kCACC,aAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.photos-header {\\n\\tmargin: 16px 0;\\n\\tdisplay: flex;\\n\\n\\t& > * {\\n\\t\\tmargin: 0 16px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".items-row{display:flex;justify-content:space-around;width:fit-content}.items-row .section-header{margin:16px 0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/TiledLayout.vue\"],\"names\":[],\"mappings\":\"AAoHA,WACC,YAAA,CACA,4BAAA,CACA,iBAAA,CAGA,2BACC,aAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.items-row {\\n\\tdisplay: flex;\\n\\tjustify-content: space-around;\\n\\twidth: fit-content; // Prevent solitary image to be rendered in the middle because of the flex layout.\\n\\n\\t// Month and year.\\n\\t.section-header {\\n\\t\\tmargin: 16px 0;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@media(min-width: 0px)and (max-width: 400px){.grid-container[data-v-7f201254]{padding:0px 8px 256px 8px}}@media(min-width: 400px)and (max-width: 700px){.grid-container[data-v-7f201254]{padding:0px 8px 256px 8px}}@media(min-width: 700px)and (max-width: 1024px){.grid-container[data-v-7f201254]{padding:0px 44px 256px 44px}}@media(min-width: 1024px)and (max-width: 1280px){.grid-container[data-v-7f201254]{padding:0px 44px 256px 44px}}@media(min-width: 1280px)and (max-width: 1440px){.grid-container[data-v-7f201254]{padding:0px 66px 256px 66px}}@media(min-width: 1440px)and (max-width: 1600px){.grid-container[data-v-7f201254]{padding:0px 66px 256px 66px}}@media(min-width: 1600px)and (max-width: 2048px){.grid-container[data-v-7f201254]{padding:0px 66px 256px 66px}}@media(min-width: 2048px)and (max-width: 2560px){.grid-container[data-v-7f201254]{padding:0px 88px 256px 88px}}@media(min-width: 2560px)and (max-width: 3440px){.grid-container[data-v-7f201254]{padding:0px 88px 256px 88px}}@media(min-width: 3440px){.grid-container[data-v-7f201254]{padding:0px 88px 256px 88px}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/mixins/GridSizes.scss\",\"webpack://./src/views/Timeline.vue\"],\"names\":[],\"mappings\":\"AAoCG,6CCuRH,iCAEE,yBAAA,CAAA,CDzRC,+CCuRH,iCAEE,yBAAA,CAAA,CDzRC,gDCuRH,iCAEE,2BAAA,CAAA,CDzRC,iDCuRH,iCAEE,2BAAA,CAAA,CDzRC,iDCuRH,iCAEE,2BAAA,CAAA,CDzRC,iDCuRH,iCAEE,2BAAA,CAAA,CDzRC,iDCuRH,iCAEE,2BAAA,CAAA,CDzRC,iDCuRH,iCAEE,2BAAA,CAAA,CDzRC,iDCuRH,iCAEE,2BAAA,CAAA,CD7RC,0BC2RH,iCAEE,2BAAA,CAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @author John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @license AGPL-3.0-or-later\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\n@use 'sass:map';\\n\\n@mixin grid-sizes() {\\n\\t$previous: 0;\\n\\n\\t@each $size, $config in $sizes {\\n\\t\\t$count: map.get($config, 'count');\\n\\t\\t$marginTop: map.get($config, 'marginTop');\\n\\t\\t$marginW: map.get($config, 'marginW');\\n\\n\\t\\t@if $size == 'max' {\\n\\t\\t\\t@media (min-width: #{$previous}px) {\\n\\t\\t\\t\\t@content($marginTop, $marginW);\\n\\t\\t\\t}\\n\\t\\t} @else {\\n\\t\\t\\t@media (min-width: #{$previous}px) and (max-width: #{$size}px) {\\n\\t\\t\\t\\t@content($marginTop, $marginW);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t$previous: $size;\\n\\t}\\n}\\n\",\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n@import '../mixins/GridSizes';\\n\\n.grid-container {\\n\\t@include grid-sizes using ($marginTop, $marginW) {\\n\\t\\tpadding: 0px #{$marginW}px 256px #{$marginW}px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 2819,\n\t\"./hi.js\": 2819,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.error === 404)?_c('EmptyContent',{attrs:{\"illustration-name\":\"folder\"}},[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'This folder does not exist'))+\"\\n\")]):(_vm.error)?_c('EmptyContent',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'An error occurred'))+\"\\n\")]):_c('div',[(_vm.isEmpty)?_c('Navigation',{key:\"navigation\",attrs:{\"basename\":_vm.path,\"filename\":'/',\"root-title\":_vm.rootTitle}}):_vm._e(),_vm._v(\" \"),(_vm.isEmpty)?_c('EmptyContent',{attrs:{\"illustration-name\":\"empty\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('photos', 'No photos in here'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"grid-container\"},[_c('TiledLayout',{ref:\"virtualgrid\",attrs:{\"items\":_vm.contentList,\"update-function\":_vm.getContent,\"loader\":_vm.loaderComponent}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { genFileInfo } from '../utils/fileUtils'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { allMimes } from './AllowedMimes'\nimport client from './DavClient'\nimport { props } from './DavRequest'\nimport { sizes } from '../assets/grid-sizes'\nimport moment from '@nextcloud/moment'\n\n/**\n * List files from a folder and filter out unwanted mimes\n *\n * @param {boolean} [onlyFavorites=false] not used\n * @param {object} [options] used for the cancellable requests\n * @param {number} [options.page=0] which page to start (starts at 0)\n * @param {number} [options.perPage] how many to display per page default is 5 times the max number per line from the grid-sizes config file\n * @param {boolean} [options.full=false] get full data of the files\n * @param {boolean} [options.onThisDay=false] get only items from this day of year\n * @return {Array} the file list\n */\nexport default async function(onlyFavorites = false, options = {}) {\n\n\t// default function options\n\toptions = Object.assign({}, {\n\t\tpage: 0, // start at the first page\n\t\tperPage: sizes.max.count * 10, // ten rows of the max width\n\t\tmimesType: allMimes, // all mimes types\n\t\tonThisDay: false,\n\t}, options)\n\n\tconst prefixPath = `/files/${getCurrentUser().uid}`\n\n\t// generating the search or condition\n\t// based on the allowed mimetypes\n\tconst orMime = options.mimesType.reduce((str, mime) => `${str}\n\t\t<d:eq>\n\t\t\t<d:prop>\n\t\t\t\t<d:getcontenttype/>\n\t\t\t</d:prop>\n\t\t\t<d:literal>${mime}</d:literal>\n\t\t</d:eq>\n\t`, '')\n\n\tconst eqFavorites = onlyFavorites\n\t\t? `<d:eq>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<oc:favorite/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:literal>1</d:literal>\n\t\t\t</d:eq>`\n\t\t: ''\n\n\tconst onThisDay = options.onThisDay\n\t\t? `<d:or>${Array(20).fill(1)\n\t\t\t.map((_, years) => {\n\t\t\t\tconst start = moment(Date.now()).startOf('day').subtract(3, 'd').subtract(years + 1, 'y')\n\t\t\t\tconst end = moment(Date.now()).endOf('day').add(3, 'd').subtract(years + 1, 'y')\n\t\t\t\treturn `<d:and>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified />\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${start.format(moment.defaultFormatUtc)}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t\t<d:lt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified />\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${end.format(moment.defaultFormatUtc)}</d:literal>\n\t\t\t\t</d:lt>\n\t\t\t</d:and>`\n\t\t\t}).join('\\n')}</d:or>`\n\t\t: ''\n\n\toptions = Object.assign({\n\t\tmethod: 'SEARCH',\n\t\theaders: {\n\t\t\t'content-Type': 'text/xml',\n\t\t},\n\t\tdata: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\t\t\t<d:searchrequest xmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\txmlns:ns=\"https://github.com/icewind1991/SearchDAV/ns\"\n\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<d:basicsearch>\n\t\t\t\t\t<d:select>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t${props}\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t</d:select>\n\t\t\t\t\t<d:from>\n\t\t\t\t\t\t<d:scope>\n\t\t\t\t\t\t\t<d:href>${prefixPath}</d:href>\n\t\t\t\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t\t\t\t</d:scope>\n\t\t\t\t\t</d:from>\n\t\t\t\t\t<d:where>\n\t\t\t\t\t\t<d:and>\n\t\t\t\t\t\t\t<d:or>\n\t\t\t\t\t\t\t\t${orMime}\n\t\t\t\t\t\t\t</d:or>\n\t\t\t\t\t\t\t${eqFavorites}\n\t\t\t\t\t\t\t${onThisDay}\n\t\t\t\t\t\t</d:and>\n\t\t\t\t\t</d:where>\n\t\t\t\t\t<d:orderby>\n\t\t\t\t\t\t<d:order>\n\t\t\t\t\t\t\t<d:prop><d:getlastmodified/></d:prop>\n\t\t\t\t\t\t\t<d:descending/>\n\t\t\t\t\t\t</d:order>\n\t\t\t\t\t</d:orderby>\n\t\t\t\t\t<d:limit>\n\t\t\t\t\t\t<d:nresults>${options.perPage}</d:nresults>\n\t\t\t\t\t\t<ns:firstresult>${options.page * options.perPage}</ns:firstresult>\n\t\t\t\t\t</d:limit>\n\t\t\t\t</d:basicsearch>\n\t\t\t</d:searchrequest>`,\n\t\tdeep: true,\n\t\tdetails: true,\n\t}, options)\n\n\tconst response = await client.getDirectoryContents('', options)\n\n\treturn response.data\n\t\t.map(data => genFileInfo(data))\n\t\t// remove prefix path from full file path\n\t\t.map(data => Object.assign({}, data, { filename: data.filename.replace(prefixPath, '') }))\n\n}\n","<!--\n - @copyright Copyright (c) 2020 Corentin Mors\n -\n - @license AGPL-3.0-or-later\n -\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"loader\">\n\t\t<slot name=\"icon\">\n\t\t\t<span class=\"icon-loading\" />\n\t\t</slot>\n\t</div>\n</template>\n\n<script>\nexport default {\n\tname: 'Loader',\n}\n</script>\n\n<style lang=\"scss\">\n.loader {\n\tdisplay: grid;\n\theight: 60px;\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js&\"","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=style&index=0&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=style&index=0&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Loader.vue?vue&type=template&id=7bbb2dd6&\"\nimport script from \"./Loader.vue?vue&type=script&lang=js&\"\nexport * from \"./Loader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Loader.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"loader\"},[_vm._t(\"icon\",function(){return [_c('span',{staticClass:\"icon-loading\"})]})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 Louis Chemineau <louis@chmn.me>\n -\n - @author Louis Chemineau <louis@chmn.me>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<div class=\"photos-header\">\n\t\t<Actions v-if=\"selection.length === 0\" :menu-title=\"t('photos', 'Add')\" :primary=\"true\">\n\t\t\t<Plus slot=\"icon\" />\n\t\t\t<ActionButton :title=\"t('photos', 'Upload media')\" @click=\"openUploader\">\n\t\t\t\t<FileUpload slot=\"icon\" />\n\t\t\t</ActionButton>\n\t\t\t<ActionButton :title=\"t('photos', 'Create new album')\" @click=\"createNewAlbum\">\n\t\t\t\t<PlusBoxMultiple slot=\"icon\" />\n\t\t\t</ActionButton>\n\t\t</Actions>\n\t\t</Actions>\n\n\t\t<template v-else>\n\t\t\t<Actions :force-title=\"true\" :primary=\"true\">\n\t\t\t\t<ActionButton :title=\"t('photos', 'Add to album')\" @click=\"openAlbumPicker\">\n\t\t\t\t\t<Plus slot=\"icon\" />\n\t\t\t\t</ActionButton>\n\t\t\t</Actions>\n\t\t\t<Actions :force-menu=\"true\">\n\t\t\t\t<ActionButton :title=\"t('photos', 'Delete')\" @click=\"deleteSelection\">\n\t\t\t\t\t<TrashCan slot=\"icon\" />\n\t\t\t\t</ActionButton>\n\t\t\t</Actions>\n\t\t</template>\n\t</div>\n</template>\n<script>\n\nimport Plus from 'vue-material-design-icons/Plus'\nimport TrashCan from 'vue-material-design-icons/TrashCan.vue'\nimport PlusBoxMultiple from 'vue-material-design-icons/PlusBoxMultiple'\nimport FileUpload from 'vue-material-design-icons/FileUpload.vue'\n\nimport { Actions, ActionButton } from '@nextcloud/vue'\n\nexport default {\n\tname: 'PhotosHeader',\n\tcomponents: {\n\t\tActions,\n\t\tActionButton,\n\t\tPlus,\n\t\tTrashCan,\n\t\tFileUpload,\n\t\tPlusBoxMultiple,\n\t},\n\tprops: {\n\t\tselection: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\tmethods: {\n\t\topenUploader() {\n\n\t\t},\n\n\t\tcreateNewAlbum() {\n\n\t\t},\n\n\t\topenAlbumPicker() {\n\n\t\t},\n\n\t\tmoveSelectionToAlbum() {\n\n\t\t},\n\n\t\tdeleteSelection() {\n\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.photos-header {\n\tmargin: 16px 0;\n\tdisplay: flex;\n\n\t& > * {\n\t\tmargin: 0 16px;\n\t}\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosHeader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosHeader.vue?vue&type=script&lang=js&\"","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosHeader.vue?vue&type=style&index=0&id=480e67f5&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosHeader.vue?vue&type=style&index=0&id=480e67f5&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./PhotosHeader.vue?vue&type=template&id=480e67f5&scoped=true&\"\nimport script from \"./PhotosHeader.vue?vue&type=script&lang=js&\"\nexport * from \"./PhotosHeader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PhotosHeader.vue?vue&type=style&index=0&id=480e67f5&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"480e67f5\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"photos-header\"},[(_vm.selection.length === 0)?_c('Actions',{attrs:{\"menu-title\":_vm.t('photos', 'Add'),\"primary\":true}},[_c('Plus',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}),_vm._v(\" \"),_c('ActionButton',{attrs:{\"title\":_vm.t('photos', 'Upload media')},on:{\"click\":_vm.openUploader}},[_c('FileUpload',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1),_vm._v(\" \"),_c('ActionButton',{attrs:{\"title\":_vm.t('photos', 'Create new album')},on:{\"click\":_vm.createNewAlbum}},[_c('PlusBoxMultiple',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1)],1):[_c('Actions',{attrs:{\"force-title\":true,\"primary\":true}},[_c('ActionButton',{attrs:{\"title\":_vm.t('photos', 'Add to album')},on:{\"click\":_vm.openAlbumPicker}},[_c('Plus',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1)],1),_vm._v(\" \"),_c('Actions',{attrs:{\"force-menu\":true}},[_c('ActionButton',{attrs:{\"title\":_vm.t('photos', 'Delete')},on:{\"click\":_vm.deleteSelection}},[_c('TrashCan',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1)],1)]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2022 Louis Chemineau <louis@chmn.me>\n *\n * @author Louis Chemineau <louis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * @typedef {object} TiledItem\n * @property {string} id\n * @property {object} injected\n * @property {array} injected.list\n * @property {string} injected.lastmod\n * @property {function} injected.loadMore\n * @property {boolean} injected.canLoop\n * @property {number} width Real width of the item.\n * @property {number} height Real height of the item.\n * @property {Vue.Component} renderComponent The Vue component used to render the item.\n */\n\n/**\n * @typedef {object} TiledRow\n * @property {TiledItem[]} items -\n * @property {number} height -\n */\n\nimport moment from '@nextcloud/moment'\n\nconst BASE_ROW_HEIGHT = 200\n\n/**\n * @param {TiledItem[]} items The list of items to display.\n * @param {number} containerWidth The width of the row.\n * @return {Object<string, TiledRow[]>}\n */\nexport function computeLayoutByMonth(items, containerWidth) {\n\tconst itemsByMonth = splitItemsByMonths(items)\n\n\treturn Object.keys(itemsByMonth).reduce(\n\t\t/**\n\t\t * @param {Object<string, TiledRow[]>} layoutByMonth -\n\t\t * @param {string} month -\n\t\t */\n\t\t(layoutByMonth, month) => {\n\t\t\treturn {\n\t\t\t\t...layoutByMonth,\n\t\t\t\t[month]: splitItemsInRows(itemsByMonth[month], containerWidth),\n\t\t\t}\n\t\t}, {})\n}\n\n/**\n * @param {TiledItem[]} items The list of items to split.\n * @return {Object<string, TiledItem[]>}\n */\nfunction splitItemsByMonths(items) {\n\treturn items.reduce(\n\t\t/**\n\t\t * @param {Object<string, TiledItem[]>} itemsByMonth -\n\t\t * @param {TiledItem} item -\n\t\t */\n\t\t(itemsByMonth, item) => {\n\t\t\tconst date = `${formatDate(item.injected.lastmod, 'YYYY')}-${formatDate(item.injected.lastmod, 'MMMM')}`\n\n\t\t\treturn {\n\t\t\t\t...itemsByMonth,\n\t\t\t\t[date]: [...(itemsByMonth[date] ?? []), item],\n\t\t\t}\n\t\t},\n\t\t{}\n\t)\n}\n\n/**\n * @param {string} date The date as a string.\n * @param {string} format Date format to use (ie. 'YYYY', 'M', 'DD', ...).\n * @return {string}\n */\nfunction formatDate(date, format) {\n\treturn moment(date).format(format)\n}\n\n/**\n * Split items in rows of equal width.\n * The last row will not be forced to match containerWidth.\n *\n * @param {TiledItem[]} items The list of item to split in row of equal width.\n * @param {number} containerWidth The width of a row.\n * @return {TiledRow[]}\n */\nfunction splitItemsInRows(items, containerWidth) {\n\tif (containerWidth === 0) {\n\t\treturn []\n\t}\n\n\tconst rows = []\n\tlet rowNumber = 0\n\n\twhile (items.length > 0) {\n\t\t/** @type { TiledItem[] } items */\n\t\tconst rowItems = []\n\n\t\t// Fill the row with new items as long as the width is less than containerWidth.\n\t\tdo {\n\t\t\t// @ts-ignore - We know that items.shift() is not undefined as we always check that items.length > 0.\n\t\t\trowItems.push(items.shift())\n\t\t} while (items.length > 0 && computeRowWidth([...rowItems, items[items.length - 1]]) <= containerWidth)\n\n\t\trows[rowNumber++] = {\n\t\t\titems: rowItems,\n\t\t\theight: computeRowHeight(rowItems, containerWidth, items.length === 0),\n\t\t}\n\t}\n\n\treturn rows\n}\n\n/**\n * Compute the row width based on its items with the assumption that their height is BASE_ROW_HEIGHT.\n *\n * @param {TiledItem[]} items The list of items in the row.\n * @return {number} The width of the row\n */\nfunction computeRowWidth(items) {\n\treturn items\n\t\t.map(item => BASE_ROW_HEIGHT * (item.width / item.height))\n\t\t.reduce((sum, itemRatio) => sum + itemRatio)\n}\n\n/**\n * Compute the row height based on its items and on the container's width.\n *\n * Math time !\n * With Rn the aspect ratio of item n\n * Wn the width of item n\n * Hn the height of item n\n * Wc the width of the container\n * Hr the height of the row\n * For n items we want: Wc = W1 + W2 + ... + Wn\n * We know Rn = Wn / Hn\n * So Wn = Rn * Hn\n * So Wc = (R1 * H1) + (R2 * H2) + ... + (Rn * Hn)\n * But we also want Hr === H1 === H2 === ... === Hn\n * So Wc = (R1 * Hr) + (R2 * Hr) + ... + (Rn * Hr)\n * So Wc = Hr * (R1 + R2 + ... + Rn)\n * So Hr = Wc / (R1 + R2 + ... + Rn)\n *\n * @param {TiledItem[]} items The list of items in the row.\n * @param {number} containerWidth The width of the row.\n * @param {boolean} isLastRow Whether we are computing the height for the last row.\n * @return {number} The height of the row\n */\nfunction computeRowHeight(items, containerWidth, isLastRow) {\n\tconst sumOfItemsRatio = items\n\t\t.map(item => (item.width / item.height))\n\t\t.reduce((sum, itemRatio) => sum + itemRatio)\n\n\tlet rowHeight = containerWidth / sumOfItemsRatio\n\n\t// Exception 1: there is only one item which is larger than containerWidth.\n\t// Limit its height so that itemWidth === containerWidth\n\tif (items.length === 1 && items[0].width > containerWidth) {\n\t\trowHeight = containerWidth / (items[0].width / items[0].height)\n\t}\n\n\t// Exception 2: we reached the last row.\n\t// Do force the items width to match containerWidth, and limit their heigh to BASE_ROW_HEIGHT.\n\tif (isLastRow) {\n\t\trowHeight = Math.min(BASE_ROW_HEIGHT, rowHeight)\n\t}\n\n\treturn rowHeight\n}\n","<!--\n - @copyright Copyright (c) 2019 Louis Chemineau <louis@chmn.me>\n -\n - @author Louis Chemineau <louis@chmn.me>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<div>\n\t\t<PhotosHeader :selection=\"selection\" />\n\n\t\t<div ref=\"container\" class=\"items-container\">\n\t\t\t<div v-for=\"(itemsForMonth, month) of layoutByMonth\"\n\t\t\t\t:key=\"month\">\n\t\t\t\t<h3 class=\"section-header\">\n\t\t\t\t\t<b>{{ month.split('-')[1] }}</b> {{ month.split('-')[0] }}\n\t\t\t\t</h3>\n\n\t\t\t\t<div v-for=\"(row, index) of itemsForMonth\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"items-row\"\n\t\t\t\t\t:style=\"{height: `${row.height}px`}\">\n\t\t\t\t\t<component :is=\"item.renderComponent\"\n\t\t\t\t\t\tv-for=\"item of row.items\"\n\t\t\t\t\t\t:key=\"item.fileid\"\n\t\t\t\t\t\t:item=\"item\"\n\t\t\t\t\t\t:selected=\"checkedItems[item.injected.fileid] === true\"\n\t\t\t\t\t\t:style=\"{ width: `${row.height * item.width / item.height}px`, height: `${row.height}px`}\"\n\t\t\t\t\t\t@select-toggled=\"onItemSelectToggle\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport PhotosHeader from '../components/PhotosHeader.vue'\nimport { computeLayoutByMonth } from '../services/TiledLayout.js'\n\nexport default {\n\tname: 'TiledLayout',\n\tcomponents: {\n\t\tPhotosHeader,\n\t},\n\tprops: {\n\t\t/** @type {Array<TiledRow>} */\n\t\titems: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tupdateFunction: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t\tloader: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\t/** @type {number} */\n\t\t\tcontainerWidth: 0,\n\t\t\t/** @type {Object<number, boolean>} */\n\t\t\tcheckedItems: {},\n\t\t}\n\t},\n\tcomputed: {\n\t\tselection() {\n\t\t\treturn Object.keys(this.checkedItems).filter(fileId => this.checkedItems[fileId])\n\t\t},\n\n\t\tlayoutByMonth() {\n\t\t\treturn computeLayoutByMonth(this.items, this.containerWidth)\n\t\t},\n\n\t},\n\tmounted() {\n\t\tthis.updateFunction()\n\t\tthis.containerWidth = this.$refs.container.clientWidth ?? 0\n\t\twindow.addEventListener('resize', this.updateContainerWidth)\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.updateContainerWidth)\n\t},\n\tmethods: {\n\t\t/**\n\t\t * @param {Event} event\n\t\t */\n\t\tupdateContainerWidth() {\n\t\t\tthis.containerWidth = this.$refs.container.clientWidth ?? 0\n\t\t},\n\n\t\tonItemSelectToggle({ fileid, value }) {\n\t\t\tthis.$set(this.checkedItems, fileid, value)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\">\n.items-row {\n\tdisplay: flex;\n\tjustify-content: space-around;\n\twidth: fit-content; // Prevent solitary image to be rendered in the middle because of the flex layout.\n\n\t// Month and year.\n\t.section-header {\n\t\tmargin: 16px 0;\n\t}\n}\n\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TiledLayout.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TiledLayout.vue?vue&type=script&lang=js&\"","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TiledLayout.vue?vue&type=style&index=0&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TiledLayout.vue?vue&type=style&index=0&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TiledLayout.vue?vue&type=template&id=4b10780a&\"\nimport script from \"./TiledLayout.vue?vue&type=script&lang=js&\"\nexport * from \"./TiledLayout.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TiledLayout.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('PhotosHeader',{attrs:{\"selection\":_vm.selection}}),_vm._v(\" \"),_c('div',{ref:\"container\",staticClass:\"items-container\"},_vm._l((_vm.layoutByMonth),function(itemsForMonth,month){return _c('div',{key:month},[_c('h3',{staticClass:\"section-header\"},[_c('b',[_vm._v(_vm._s(month.split('-')[1]))]),_vm._v(\" \"+_vm._s(month.split('-')[0])+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_vm._l((itemsForMonth),function(row,index){return _c('div',{key:index,staticClass:\"items-row\",style:({height: ((row.height) + \"px\")})},_vm._l((row.items),function(item){return _c(item.renderComponent,{key:item.fileid,tag:\"component\",style:({ width: ((row.height * item.width / item.height) + \"px\"), height: ((row.height) + \"px\")}),attrs:{\"item\":item,\"selected\":_vm.checkedItems[item.injected.fileid] === true},on:{\"select-toggled\":_vm.onItemSelectToggle}})}),1)})],2)}),0)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<!-- Errors handlers-->\n\t<EmptyContent v-if=\"error === 404\" illustration-name=\"folder\">\n\t\t{{ t('photos', 'This folder does not exist') }}\n\t</EmptyContent>\n\t<EmptyContent v-else-if=\"error\">\n\t\t{{ t('photos', 'An error occurred') }}\n\t</EmptyContent>\n\n\t<!-- Folder content -->\n\t<div v-else>\n\t\t<Navigation v-if=\"isEmpty\"\n\t\t\tkey=\"navigation\"\n\t\t\t:basename=\"path\"\n\t\t\t:filename=\"'/'\"\n\t\t\t:root-title=\"rootTitle\" />\n\n\t\t<EmptyContent v-if=\"isEmpty\" illustration-name=\"empty\">\n\t\t\t{{ t('photos', 'No photos in here') }}\n\t\t</EmptyContent>\n\n\t\t<div class=\"grid-container\">\n\t\t\t<TiledLayout ref=\"virtualgrid\"\n\t\t\t\t:items=\"contentList\"\n\t\t\t\t:update-function=\"getContent\"\n\t\t\t\t:loader=\"loaderComponent\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport moment from '@nextcloud/moment'\nimport { mapGetters } from 'vuex'\n\nimport getPhotos from '../services/PhotoSearch.js'\n\nimport EmptyContent from '../components/EmptyContent.vue'\nimport File from '../components/File.vue'\n// import SeparatorVirtualGrid from '../components/SeparatorVirtualGrid.vue'\n// import VirtualGrid from 'vue-virtual-grid.vue'\nimport Navigation from '../components/Navigation.vue'\nimport Loader from '../components/Loader.vue'\n\nimport cancelableRequest from '../utils/CancelableRequest.js'\nimport GridConfigMixin from '../mixins/GridConfig.js'\nimport { allMimes } from '../services/AllowedMimes.js'\nimport TiledLayout from '../components/TiledLayout.vue'\n// import PictureRenderer from '../components/PictureRenderer.vue'\n\nexport default {\n\tname: 'Timeline',\n\tcomponents: {\n\t\tEmptyContent,\n\t\tNavigation,\n\t\tTiledLayout,\n\t},\n\tmixins: [GridConfigMixin],\n\tprops: {\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t\tonlyFavorites: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tmimesType: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => allMimes,\n\t\t},\n\t\trootTitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tonThisDay: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tcancelRequest: null,\n\t\t\tdone: false,\n\t\t\terror: null,\n\t\t\tpage: 0,\n\t\t\tloaderComponent: Loader,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// global lists\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t\t'timeline',\n\t\t]),\n\t\t// list of loaded medias\n\t\tfileList() {\n\t\t\treturn this.timeline\n\t\t\t\t.map((fileId) => this.files[fileId])\n\t\t\t\t.filter((file) => !!file)\n\t\t},\n\t\t// list of displayed content in the grid (titles + medias)\n\t\tcontentList() {\n\t\t\t/**\n\t\t\t * The goal of this flat map is to return an array of images separated by titles (months)\n\t\t\t * ie: [{month1}, {image1}, {image2}, {month2}, {image3}, {image4}, {image5}]\n\t\t\t * First we get the current month+year of the image\n\t\t\t * We compare it to the previous image month+year\n\t\t\t * If there is a difference we have to insert a title object before the current image\n\t\t\t * If it's equal we just add the current image to the array\n\t\t\t * Note: the injected param of objects are used to pass custom params to the grid lib\n\t\t\t * In our case injected could be an image/video (aka file) or a title (year/month)\n\t\t\t * Note2: titles are rendered full width and images are rendered on 1 column and 256x256 ratio\n\t\t\t */\n\t\t\t// const lastSection = ''\n\t\t\treturn this.fileList.flatMap((file, index) => {\n\t\t\t\tconst finalArray = []\n\t\t\t\t// const currentSection = this.getFormatedDate(file.lastmod, 'YYYY MMMM')\n\t\t\t\t// if (lastSection !== currentSection) {\n\t\t\t\t// \tfinalArray.push({\n\t\t\t\t// \t\tid: `title-${index}`,\n\t\t\t\t// \t\tinjected: {\n\t\t\t\t// \t\t\tyear: this.getFormatedDate(file.lastmod, 'YYYY'),\n\t\t\t\t// \t\t\tmonth: this.getFormatedDate(file.lastmod, 'MMMM'),\n\t\t\t\t// \t\t\tonThisDay: this.onThisDay ? Math.round(moment(Date.now()).diff(moment(file.lastmod), 'years', true)) : false,\n\t\t\t\t// \t\t},\n\t\t\t\t// \t\theight: 90,\n\t\t\t\t// \t\tcolumnSpan: 0, // means full width\n\t\t\t\t// \t\tnewRow: true,\n\t\t\t\t// \t\trenderComponent: SeparatorVirtualGrid,\n\t\t\t\t// \t})\n\t\t\t\t// \tlastSection = currentSection // we keep track of the last section for the next batch\n\t\t\t\t// }\n\t\t\t\tfinalArray.push({\n\t\t\t\t\tid: `img-${file.fileid}`,\n\t\t\t\t\tinjected: {\n\t\t\t\t\t\t...file,\n\t\t\t\t\t\tlist: this.fileList,\n\t\t\t\t\t\tloadMore: this.getContent,\n\t\t\t\t\t\tcanLoop: false,\n\t\t\t\t\t},\n\t\t\t\t\twidth: file.fileMetadataSize.width,\n\t\t\t\t\theight: file.fileMetadataSize.height,\n\t\t\t\t\trenderComponent: File,\n\t\t\t\t})\n\t\t\t\treturn finalArray\n\t\t\t})\n\t\t},\n\t\t// is current folder empty?\n\t\tisEmpty() {\n\t\t\treturn this.fileList.length === 0\n\t\t},\n\t},\n\n\twatch: {\n\t\t$route(from, to) {\n\t\t\t// cancel any pending requests\n\t\t\tif (this.cancelRequest) {\n\t\t\t\tthis.cancelRequest('Changed view')\n\t\t\t}\n\t\t\tthis.resetState()\n\t\t},\n\t\tasync onThisDay() {\n\t\t\t// reset component\n\t\t\tthis.resetState()\n\t\t\tthis.getContent()\n\t\t},\n\t},\n\n\tbeforeRouteLeave(from, to, next) {\n\t\t// cancel any pending requests\n\t\tif (this.cancelRequest) {\n\t\t\tthis.cancelRequest('Changed view')\n\t\t}\n\t\tthis.resetState()\n\t\tnext()\n\t},\n\n\tbeforeDestroy() {\n\t\t// cancel any pending requests\n\t\tif (this.cancelRequest) {\n\t\t\tthis.cancelRequest('Changed view')\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Return next batch of data depending on global offset\n\t\t *\n\t\t * @param {boolean} doReturn Returns a Promise with the list instead of a boolean\n\t\t * @return {Promise<boolean>} Returns a Promise with a boolean that stops infinite loading\n\t\t */\n\t\tasync getContent(doReturn) {\n\t\t\tif (this.done) {\n\t\t\t\treturn Promise.resolve(true)\n\t\t\t}\n\n\t\t\t// cancel any pending requests\n\t\t\tif (this.cancelRequest) {\n\t\t\t\tthis.cancelRequest('Changed view')\n\t\t\t}\n\n\t\t\t// if we don't already have some cached data let's show a loader\n\t\t\tif (this.timeline.length === 0) {\n\t\t\t\tthis.$emit('update:loading', true)\n\t\t\t}\n\n\t\t\t// done loading even with errors\n\t\t\tconst { request, cancel } = cancelableRequest(getPhotos)\n\t\t\tthis.cancelRequest = cancel\n\n\t\t\tconst numberOfImagesPerBatch = this.gridConfig.count * 5 // loading 5 rows\n\n\t\t\ttry {\n\t\t\t\t// Load next batch of images\n\t\t\t\tconst files = await request(this.onlyFavorites, {\n\t\t\t\t\tpage: this.page,\n\t\t\t\t\tperPage: numberOfImagesPerBatch,\n\t\t\t\t\tmimesType: this.mimesType,\n\t\t\t\t\tonThisDay: this.onThisDay,\n\t\t\t\t})\n\n\t\t\t\t// If we get less files than requested that means we got to the end\n\t\t\t\tif (files.length !== numberOfImagesPerBatch) {\n\t\t\t\t\tthis.done = true\n\t\t\t\t}\n\n\t\t\t\tthis.$store.dispatch('updateTimeline', files)\n\t\t\t\tthis.$store.dispatch('appendFiles', files)\n\n\t\t\t\tthis.page += 1\n\n\t\t\t\tif (doReturn) {\n\t\t\t\t\treturn Promise.resolve(files)\n\t\t\t\t}\n\n\t\t\t\treturn Promise.resolve(false)\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tif (error.response.status === 404) {\n\t\t\t\t\t\tthis.error = 404\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.$router.push({ name: this.$route.name })\n\t\t\t\t\t\t}, 3000)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error = error\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tconsole.error('Error fetching timeline', error)\n\t\t\t\treturn Promise.resolve(true)\n\t\t\t} finally {\n\t\t\t\t// done loading even with errors\n\t\t\t\tthis.$emit('update:loading', false)\n\t\t\t\tthis.cancelRequest = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Reset this component data to a pristine state\n\t\t */\n\t\tresetState() {\n\t\t\tthis.$store.dispatch('resetTimeline')\n\t\t\tthis.done = false\n\t\t\tthis.error = null\n\t\t\tthis.page = 0\n\t\t\tthis.lastSection = ''\n\t\t\tthis.$emit('update:loading', true)\n\t\t\tif (this.$refs.virtualgrid) {\n\t\t\t\tthis.$refs.virtualgrid.resetGrid()\n\t\t\t}\n\t\t},\n\n\t\tgetFormatedDate(string, format) {\n\t\t\treturn moment(string).format(format)\n\t\t},\n\n\t},\n\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../mixins/GridSizes';\n\n.grid-container {\n\t@include grid-sizes using ($marginTop, $marginW) {\n\t\tpadding: 0px #{$marginW}px 256px #{$marginW}px;\n\t}\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Timeline.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Timeline.vue?vue&type=script&lang=js&\"","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Timeline.vue?vue&type=style&index=0&id=7f201254&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Timeline.vue?vue&type=style&index=0&id=7f201254&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Timeline.vue?vue&type=template&id=7f201254&scoped=true&\"\nimport script from \"./Timeline.vue?vue&type=script&lang=js&\"\nexport * from \"./Timeline.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Timeline.vue?vue&type=style&index=0&id=7f201254&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7f201254\",\n null\n \n)\n\nexport default component.exports"],"names":["request","require","oldPrepareRequestOptions","prepareRequestOptions","requestOptions","methodOptions","cancelToken","method","module","exports","webdav","patch","axios","remote","generateRemoteUrl","client","parseUrl","pathname","props","___CSS_LOADER_EXPORT___","push","id","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","async","onlyFavorites","options","assign","page","perPage","sizes","mimesType","allMimes","onThisDay","prefixPath","getCurrentUser","uid","orMime","reduce","str","mime","eqFavorites","Array","fill","_","years","start","moment","Date","now","startOf","subtract","end","endOf","add","format","join","headers","data","deep","details","response","genFileInfo","filename","replace","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","staticClass","_t","selection","length","attrs","t","slot","_v","on","openUploader","createNewAlbum","openAlbumPicker","deleteSelection","computeLayoutByMonth","items","containerWidth","itemsByMonth","item","date","formatDate","injected","lastmod","splitItemsByMonths","layoutByMonth","month","splitItemsInRows","rows","rowNumber","rowItems","shift","computeRowWidth","height","computeRowHeight","width","sum","itemRatio","isLastRow","rowHeight","Math","min","ref","_l","itemsForMonth","key","_s","split","row","index","style","renderComponent","fileid","tag","checkedItems","onItemSelectToggle","error","path","rootTitle","_e","contentList","getContent","loaderComponent"],"sourceRoot":""}