PageSourceSearch

https://whatgotdone.com/js/app.f9ce8898.js

js whatgotdone.com collected 2026-10-05 06:13:01 UTC 74,293 bytes, 2 lines download raw bytes

1(function(){var e={5358:function(e,t,r){var n={"./af":5177,"./af.js":5177,"./ar":1509,"./ar-dz":1488,"./ar-dz.js":1488,"./ar-kw":8676,"./ar-kw.js":8676,"./ar-ly":2353,"./ar-ly.js":2353,"./ar-ma":4496,"./ar-ma.js":4496,"./ar-sa":2682,"./ar-sa.js":2682,"./ar-tn":7375,"./ar-tn.js":7375,"./ar.js":1509,"./az":5533,"./az.js":5533,"./be":8959,"./be.js":8959,"./bg":7777,"./bg.js":7777,"./bm":4903,"./bm.js":4903,"./bn":1290,"./bn-bd":7357,"./bn-bd.js":7357,"./bn.js":1290,"./bo":1545,"./bo.js":1545,"./br":1470,"./br.js":1470,"./bs":4429,"./bs.js":4429,"./ca":7306,"./ca.js":7306,"./cs":6464,"./cs.js":6464,"./cv":3635,"./cv.js":3635,"./cy":4226,"./cy.js":4226,"./da":3601,"./da.js":3601,"./de":7853,"./de-at":6111,"./de-at.js":6111,"./de-ch":4697,"./de-ch.js":4697,"./de.js":7853,"./dv":708,"./dv.js":708,"./el":4691,"./el.js":4691,"./en-au":3872,"./en-au.js":3872,"./en-ca":8298,"./en-ca.js":8298,"./en-gb":6195,"./en-gb.js":6195,"./en-ie":6584,"./en-ie.js":6584,"./en-il":5543,"./en-il.js":5543,"./en-in":9033,"./en-in.js":9033,"./en-nz":9402,"./en-nz.js":9402,"./en-sg":3004,"./en-sg.js":3004,"./eo":2934,"./eo.js":2934,"./es":7650,"./es-do":838,"./es-do.js":838,"./es-mx":7730,"./es-mx.js":7730,"./es-us":6575,"./es-us.js":6575,"./es.js":7650,"./et":3035,"./et.js":3035,"./eu":3508,"./eu.js":3508,"./fa":119,"./fa.js":119,"./fi":527,"./fi.js":527,"./fil":5995,"./fil.js":5995,"./fo":2477,"./fo.js":2477,"./fr":5498,"./fr-ca":6435,"./fr-ca.js":6435,"./fr-ch":7892,"./fr-ch.js":7892,"./fr.js":5498,"./fy":7071,"./fy.js":7071,"./ga":1734,"./ga.js":1734,"./gd":217,"./gd.js":217,"./gl":7329,"./gl.js":7329,"./gom-deva":2124,"./gom-deva.js":2124,"./gom-latn":3383,"./gom-latn.js":3383,"./gu":5050,"./gu.js":5050,"./he":1713,"./he.js":1713,"./hi":3861,"./hi.js":3861,"./hr":6308,"./hr.js":6308,"./hu":609,"./hu.js":609,"./hy-am":7160,"./hy-am.js":7160,"./id":4063,"./id.js":4063,"./is":9374,"./is.js":9374,"./it":8383,"./it-ch":1827,"./it-ch.js":1827,"./it.js":8383,"./ja":3827,"./ja.js":3827,"./jv":9722,"./jv.js":9722,"./ka":1794,"./ka.js":1794,"./kk":7088,"./kk.js":7088,"./km":6870,"./km.js":6870,"./kn":4451,"./kn.js":4451,"./ko":3164,"./ko.js":3164,"./ku":8174,"./ku.js":8174,"./ky":8474,"./ky.js":8474,"./lb":9680,"./lb.js":9680,"./lo":5867,"./lo.js":5867,"./lt":5766,"./lt.js":5766,"./lv":9532,"./lv.js":9532,"./me":8076,"./me.js":8076,"./mi":1848,"./mi.js":1848,"./mk":306,"./mk.js":306,"./ml":3739,"./ml.js":3739,"./mn":9053,"./mn.js":9053,"./mr":6169,"./mr.js":6169,"./ms":3386,"./ms-my":2297,"./ms-my.js":2297,"./ms.js":3386,"./mt":7075,"./mt.js":7075,"./my":2264,"./my.js":2264,"./nb":2274,"./nb.js":2274,"./ne":8235,"./ne.js":8235,"./nl":2572,"./nl-be":3784,"./nl-be.js":3784,"./nl.js":2572,"./nn":4566,"./nn.js":4566,"./oc-lnc":9330,"./oc-lnc.js":9330,"./pa-in":9849,"./pa-in.js":9849,"./pl":4418,"./pl.js":4418,"./pt":9834,"./pt-br":8303,"./pt-br.js":8303,"./pt.js":9834,"./ro":4457,"./ro.js":4457,"./ru":2271,"./ru.js":2271,"./sd":1221,"./sd.js":1221,"./se":3478,"./se.js":3478,"./si":7538,"./si.js":7538,"./sk":5784,"./sk.js":5784,"./sl":6637,"./sl.js":6637,"./sq":6794,"./sq.js":6794,"./sr":5719,"./sr-cyrl":3322,"./sr-cyrl.js":3322,"./sr.js":5719,"./ss":6e3,"./ss.js":6e3,"./sv":1011,"./sv.js":1011,"./sw":748,"./sw.js":748,"./ta":1025,"./ta.js":1025,"./te":1885,"./te.js":1885,"./tet":8861,"./tet.js":8861,"./tg":6571,"./tg.js":6571,"./th":5802,"./th.js":5802,"./tk":9527,"./tk.js":9527,"./tl-ph":9231,"./tl-ph.js":9231,"./tlh":1052,"./tlh.js":1052,"./tr":5096,"./tr.js":5096,"./tzl":9846,"./tzl.js":9846,"./tzm":1765,"./tzm-latn":7711,"./tzm-latn.js":7711,"./tzm.js":1765,"./ug-cn":8414,"./ug-cn.js":8414,"./uk":6618,"./uk.js":6618,"./ur":158,"./ur.js":158,"./uz":7609,"./uz-latn":2475,"./uz-latn.js":2475,"./uz.js":7609,"./vi":1135,"./vi.js":1135,"./x-pseudo":4051,"./x-pseudo.js":4051,"./yo":2218,"./yo.js":2218,"./zh-cn":2648,"./zh-cn.js":2648,"./zh-hk":1632,"./zh-hk.js":1632,"./zh-mo":1541,"./zh-mo.js":1541,"./zh-tw":304,"./zh-tw.js":304};function o(e){var t=a(e);return r(t)}function a(e){if(!r.o(n,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return n[e]}o.keys=function(){return Object.keys(n)},o.resolve=a,e.exports=o,o.id=5358},5142:function(e,t,r){"use strict";var n=r(2893),o=r(5624),a=r.n(o),s=r(5853),i=r(2625),l=r(6429),c=r(2403),u=r(1273),d=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("NavigationBar"),r("b-container",{attrs:{id:"app"}},[r("router-view")],1)],1)},h=[];function m(){return document.querySelector("meta[name='csrf-token']").getAttribute("content")}function p(e){return e.ok?e.json():e.text().then((e=>Promise.reject(e)))}function f(e){return e.ok?Promise.resolve():e.text().then((e=>Promise.reject(e)))}const v=15;function g(e){return fetch(`/api/recentEntries?start=${e}&limit=${v}`).then(p).then((e=>Promise.resolve(e.map((e=>b(e))))))}function y(e){return fetch(`/api/entries/following?start=${e}&limit=${v}`,{credentials:"include"}).then(p).then((e=>{if(!e.entries)return Promise.resolve([]);const t=e.entries.map((e=>b(e)));return Promise.resolve(t)}))}function w(e,t){let r=Array.from(e),n=new Set;return e.forEach((e=>{n.add(e.permalink)})),t.forEach((e=>{n.has(e.permalink)||r.push(e)})),r}function b(e){const t=new Date(e.date).toISOString().slice(0,10);return{permalink:`/${e.author}/${t}`,author:e.author,date:new Date(e.date),markdown:e.markdown}}var _=r(5353),E=r(6193);n["default"].use(_.Ay);const k=new E.Ay({storage:window.localStorage}),j={setUsername(e,t){e.username=t},clearUserState(e){e.username=null,e.following=[],e.recentFollowingEntries=[]},setRecent(e,t){e.recentEntries=t},setRecentFollowing(e,t){e.recentFollowingEntries=t},addFollowedUser(e,t){e.following.includes(t)||e.following.push(t)},removeFollowedUser(e,t){e.following=e.following.filter((e=>e!==t))}};var S=new _.Ay.Store({state:{username:null,recentEntries:[],recentFollowingEntries:[],following:[]},mutations:j,plugins:[k.plugin]});function C(e){return fetch(`/api/user/${e}/following`).then(p).then((e=>Promise.resolve(e.following)))}function T(e){return fetch(`/api/follow/${e}`,{method:"PUT",credentials:"include",headers:{"X-CSRF-Token":m()}})}function A(e){return fetch(`/api/follow/${e}`,{method:"DELETE",credentials:"include",headers:{"X-CSRF-Token":m()}})}function P(){return fetch("/api/user/me",{credentials:"include"}).then(p)}function O(e){return fetch(`/api/user/${e}`).then((e=>e.ok?e.json():404===e.status?Promise.resolve({}):e.text().then((e=>Promise.reject(e)))))}function $(e){return fetch("/api/user",{method:"POST",headers:{"X-CSRF-Token":m()},credentials:"include",body:JSON.stringify(e)}).then(f)}function U(e){document.cookie=e+"=;expires=Thu, 01 Jan 1970 00:00:01 GMT"}const I="https://widget.userkit.io/widget.js";class F{constructor(e,t){this.userKit=e,this.widget=t}authenticate(){const e=this.userKit,t=this.widget;return new Promise((function(r){!0===e.isLoggedIn()?r():(document.addEventListener("UserKitSignIn",(function e(){r(),document.removeEventListener("UserKitSignIn",e)})),t.open("login"))}))}isLoggedIn(){return this.userKit.isLoggedIn()}}function D(e){return new Promise((function(t){if(x())return document.addEventListener("UserKitInit",(function(){t(new F(window.UserKit,window.UserKitWidget))})),void(window.UserKit&&window.UserKitWidget&&window.UserKitWidget.isInitialized&&t(new F(window.UserKit,window.UserKitWidget)));const r=document.createElement("script");r.setAttribute("src",I),r.setAttribute("data-app-id",e),document.addEventListener("UserKitInit",(function(){t(new F(window.UserKit,window.UserKitWidget))})),document.head.appendChild(r)}))}function x(){for(const e of document.getElementsByTagName("script"))if(e.src==I)return!0;return!1}function R(){U("userkit_auth_token"),U("userkit_recent_login_required_at"),sessionStorage.removeItem("UserKitApp")}function W(){S.commit("clearUserState"),R()}function L(e){C(e).then((e=>{for(const t of e)S.commit("addFollowedUser",t)}))}function M(){return new Promise((function(e,t){P().then((t=>{S.commit("setUsername",t.username),L(t.username),e()})).catch((e=>{W(),t(e)}))}))}var N=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("b-navbar",{staticClass:"navbar navbar-expand-lg navbar-dark bg-dark",attrs:{toggleable:"md",id:"navbar"}},[r("b-navbar-brand",{directives:[{name:"b-toggle",rawName:"v-b-toggle.nav-collapse",modifiers:{"nav-collapse":!0}}],staticClass:"navbar-brand",attrs:{to:e.logoLinkTarget}},[e._v("What Got Done")]),r("b-navbar-toggle",{attrs:{target:"nav-collapse"}}),r("b-collapse",{attrs:{id:"nav-collapse","is-nav":""}},[r("b-navbar-nav",[r("b-nav-item",{attrs:{to:"/about"}},[e._v("About")]),e.isLoggedIn?r("b-nav-item",{attrs:{to:"/feed"}}
1,[e._v("Feed")]):e._e(),r("b-nav-item",{attrs:{to:"/recent"}},[e._v("Recent")]),r("b-nav-item",{staticClass:"warning-link ml-3",attrs:{to:"/shutdown-notice"}},[e._v("Shutdown Notice")])],1),r("b-navbar-nav",{staticClass:"ml-auto"},[e.isLoggedIn?r("b-nav-item-dropdown",{attrs:{text:"Account",right:""}},[r("b-dropdown-item",{attrs:{to:"/"+e.username}},[e._v("Profile")]),r("b-dropdown-item",{attrs:{to:"/preferences"}},[e._v("Preferences")]),r("b-dropdown-item",{attrs:{to:"/export"}},[e._v("Export")]),r("b-dropdown-item",{attrs:{to:"/forwarding-address"}},[e._v("Forwarding Address")]),r("b-dropdown-item",{attrs:{to:"/logout"}},[e._v("Sign Out")])],1):e._e(),e.isOnEntryEditPage?e._e():r("b-button",{directives:[{name:"b-toggle",rawName:"v-b-toggle.nav-collapse",modifiers:{"nav-collapse":!0}}],staticClass:"post-update",attrs:{variant:"success",to:e.editCurrentWeekUrl}},[e._v("Post Update")])],1)],1)],1)},H=[],Y=r(5093),G=r.n(Y);function J(e){const t=G()(e);if(!t.isValid())return!1;const r=2019;if(t.year()<r)return!1;if(t>G()(z()))return!1;const n=5;return t.isoWeekday()==n}function z(){const e=G()().isoWeekday(),t=5;return e<=t?G()().isoWeekday(t).format("YYYY-MM-DD"):G()().add(1,"weeks").isoWeekday(t).format("YYYY-MM-DD")}var K={name:"NavigationBar",data(){return{editCurrentWeekUrl:"/entry/edit/"+z()}},computed:{username(){return this.$store.state.username},isLoggedIn(){return!!this.username},isOnEntryEditPage(){return this.$route.path.startsWith("/entry/edit/")},logoLinkTarget(){return this.username?this.editCurrentWeekUrl:"/"}}},q=K,B=r(1656),X=(0,B.A)(q,N,H,!1,null,"1a44e1c9",null),V=X.exports,Q={name:"app",components:{NavigationBar:V},created(){D("app_zXjb2TF8").then((e=>{!0===e.isLoggedIn()?M().catch((()=>{this.$store.commit("clearUserState")})):this.$store.commit("clearUserState")})),g(0).then((e=>{this.$store.commit("setRecent",e)}))}},Z=Q,ee=(0,B.A)(Z,d,h,!1,null,null,null),te=ee.exports,re=r(173),ne=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"home"},[r("div",{staticClass:"jumbotron"},[r("h1",{staticClass:"display-3"},[e._v("What did you get done this week?")]),r("p",{staticClass:"lead"},[e._v(" What Got Done is the simple, easy way to share progress with your teammates. ")]),r("hr",{staticClass:"my-4"}),r("p",[e._v("End each week by reflecting on what you accomplished.")]),e._m(0),r("div",{staticClass:"jumbotron-footer"},[r("b-button",{staticClass:"btn btn-lg btn-start-now",attrs:{variant:"primary",to:"/entry/edit/"+this.thisFriday}},[e._v("Start now")]),r("b-button",{staticClass:"btn btn-lg btn-success btn-view-recent",attrs:{to:"/recent"}},[e._v("View recent entries")])],1)]),e._m(1),e._m(2),e._m(3),e._m(4)])},oe=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[e._v("Keep your teammates informed")]),r("li",[e._v("Strengthen your motivation")]),r("li",[e._v("Put an end to boring status meetings")])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"feature"},[r("h2",[e._v('"Where did the whole week go?"')]),r("div",{staticClass:"text"},[r("p",[e._v(" Have you ever ended a week wondering where all the time went? Take a step back and remember what got done. ")]),r("p",[e._v(" What Got Done is a weekly ritual to remind yourself of your accomplishments. ")])]),r("img",{attrs:{src:"/images/typing-update.gif"}})])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"feature"},[r("h2",[e._v("Share progress with your teammates")]),r("div",{staticClass:"text"},[r("p",[e._v(" When you're done, share a clean summary of your week of work with your teammates. ")])]),r("img",{staticClass:"border-white",attrs:{src:"/images/example-rendered.jpg"}})])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"feature"},[r("h2",[e._v("Share updates your way")]),r("div",{staticClass:"text"},[r("p",[e._v(" To-do lists are great for managing what you will do, but they do a poor job of communicating what you accomplished. ")]),r("p",[e._v(" What Got Done lets you write updates your way, highlighting what's important instead of forcing your teammates to dig through a list of checkboxes. ")])]),r("img",{staticClass:"border-black",attrs:{src:"/images/example-freeform.jpg"}})])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("h2",[e._v("Who made this?")]),r("p",[e._v(" What Got Done is a free, open-source project by "),r("a",{attrs:{href:"https://mtlynch.io"}},[e._v("Michael Lynch")]),e._v(". ")]),r("p",[e._v(" Anyone can contribute features or bugfixes through What Got Done's "),r("a",{attrs:{href:"https://github.com/mtlynch/wh
1atgotdone"}},[e._v("public Github")]),e._v(". ")])])}],ae={name:"LandingPage",data(){return{thisFriday:z()}},computed:{username(){return this.$store.state.username}},created(){"/"===this.$route.path&&this.username&&this.$router.push("/entry/edit/"+this.thisFriday)}},se=ae,ie=(0,B.A)(se,ne,oe,!1,null,"056ff8a0",null),le=ie.exports,ce=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},ue=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"userkit"},[r("p",[e._v("Please wait, logging in...")])])}],de={name:"LoginPage",data(){return{previousRoute:null}},methods:{goBackOrGoHome:function(){this.previousRoute?this.$router.replace(this.previousRoute):this.$router.replace("/")}},beforeRouteEnter(e,t,r){r((e=>{t.path&&(e.previousRoute=t.path)}))},mounted(){D("app_zXjb2TF8").then((e=>{e.authenticate().then((()=>{M().then((()=>{this.goBackOrGoHome()}))}))}))}},he=de,me=(0,B.A)(he,ce,ue,!1,null,null,null),pe=me.exports,fe=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},ve=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("p",[e._v("Signing out...")])])}];function ge(e){document.cookie=e+"=;expires=Thu, 01 Jan 1970 00:00:01 GMT"}function ye(){return S.commit("clearUserState"),fetch("/api/logout",{method:"POST",credentials:"include",headers:{"X-CSRF-Token":m()}}).then((()=>(R(),Promise.resolve()))).finally((()=>{ge("csrf_base_v4")}))}var we={name:"LogoutPage",created(){ye().then((()=>{window.location.href="/"}))}},be=we,_e=(0,B.A)(be,fe,ve,!1,null,null,null),Ee=_e.exports,ke=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("h1",[e._v("Feed")]),e.isFollowingAnyone?[r("p",[e._v("Here are the latest updates from users you're following:")]),r("EntryFeed",{attrs:{readEntriesFromServer:e.readEntriesFromServer,readEntriesFromStore:e.readEntriesFromStore,writeEntriesToStore:e.writeEntriesToStore}})]:[r("b-alert",{attrs:{show:"",variant:"secondary"}},[e._v("You're not following anyone yet. Check the updates in the "),r("router-link",{attrs:{to:"/recent"}},[e._v("Recent feed")]),e._v(" to find users to follow.")],1)]],2)},je=[],Se=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[e._l(e.entries,(function(e){return r("PartialJournal",{key:e.permalink,attrs:{entry:e}})})),e.serverHasMore?r("b-button",{attrs:{variant:"secondary",disabled:e.loadMoreInProgress},on:{click:e.onLoadMore}},[e._v("More Entries")]):e._e()],2)},Ce=[],Te=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"journal"},[r("JournalHeader",{attrs:{entryAuthor:e.entry.author,entryDate:new Date(e.entry.date)}}),r("div",{staticClass:"journal-entry"},[r("div",{staticClass:"journal-body"},[r("vue-markdown",{attrs:{linkify:!1,html:!1,anchorAttributes:{rel:"ugc"},source:e.entrySnippet}})],1),r("div",{staticClass:"text-center"},[r("b-button",{attrs:{variant:"primary",to:e.entry.permalink}},[e._v("More")])],1)])],1)},Ae=[],Pe=r(9181),Oe=r.n(Pe),$e=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"d-flex align-items-center mb-4"},[r("user-avatar",{staticClass:"mr-2 d-block avatar",attrs:{username:e.entryAuthor}}),r("username-link",{attrs:{username:e.entryAuthor}}),e._v("'s update for the week ending on "),r("b",{staticClass:"ml-1"},[e._v(e._s(e._f("moment")(e.entryDate,"utc","dddd, ll")))])],1)},Ue=[],Ie={name:"JournalHeader",props:{entryAuthor:String,entryDate:Date}},Fe=Ie,De=(0,B.A)(Fe,$e,Ue,!1,null,"23fbfcce",null),xe=De.exports;n["default"].use(Oe());var Re={name:"PartialJournal",props:{entry:Object},components:{VueMarkdown:Oe(),JournalHeader:xe},computed:{entrySnippet:function(){const e=12,t=this.entry.markdown.split("\n");return t.length<e?t.join("\n"):t.slice(0,e).join("\n")+"\n\n..."}}},We=Re,Le=(0,B.A)(We,Te,Ae,!1,null,"65aba892",null),Me=Le.exports,Ne={name:"EntryFeed",components:{PartialJournal:Me},props:{readEntriesFromServer:Function,readEntriesFromStore:Function,writeEntriesToStore:Function},data(){return{loadMoreInProgress:!1,serverHasMore:!0}},computed:{entries(){return this.readEntriesFromStore()}},methods:{onLoadMore(){return this.loadMoreInProgress=!0,this.readEntriesFromServer(this.entries.length).then((e=>{0!==e.length?this.writeEntriesToStore(w(this.readEntriesFromStore(),e)):this.serverHasMore=!1})).finally((()=>{this.loadMoreInProgress=!1}))}},created(){this.readEntriesFromServer(0).then((e=>{this.writeEntriesToStore(e)}))}}
1,He=Ne,Ye=(0,B.A)(He,Se,Ce,!1,null,null,null),Ge=Ye.exports,Je={name:"PersonalizedFeedPage",components:{EntryFeed:Ge},computed:{isFollowingAnyone:function(){return!!this.$store.state.following&&this.$store.state.following.length>0}},methods:{readEntriesFromServer(e){return y(e)},readEntriesFromStore(){return this.$store.state.recentFollowingEntries},writeEntriesToStore(e){this.$store.commit("setRecentFollowing",e)}}},ze=Je,Ke=(0,B.A)(ze,ke,je,!1,null,"28893f3f",null),qe=Ke.exports,Be=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},Xe=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"privacy-policy"},[r("h1",[e._v("Privacy Policy")]),r("p",[r("strong",[e._v(" Last updated October 23, 2024")])]),r("p",[r("br")]),r("p",[r("br")]),r("p",[r("br")]),r("p",[e._v(" Thank you for choosing to be part of our community at What Got Done (“ "),r("strong",[e._v("Company")]),e._v(" ”, “ "),r("strong",[e._v("we")]),e._v(" ”, “ "),r("strong",[e._v("us")]),e._v(" ”, or “ "),r("strong",[e._v("our")]),e._v(" ”). We are committed to protecting your personal information and your right to privacy. If you have any questions or concerns about our policy, or our practices with regards to your personal information, please contact us at [email protected] . ")]),r("p",[e._v(" When you visit our website https://whatgotdone.com , and use our services, you trust us with your personal information. We take your privacy very seriously. In this privacy notice, we describe our privacy policy. We seek to explain to you in the clearest way possible what information we collect, how we use it and what rights you have in relation to it. We hope you take some time to read through it carefully, as it is important. If there are any terms in this privacy policy that you do not agree with, please discontinue use of our Sites and our services. ")]),r("p",[e._v(" This privacy policy applies to all information collected through our website (https://whatgotdone.com). ")]),r("p",[r("strong",[e._v("Please read this privacy policy carefully as it will help you make informed decisions about sharing your personal information with us.")])]),r("p",[r("br")]),r("p",[r("strong",[e._v("TABLE OF CONTENTS")])]),r("p",[r("a",{attrs:{href:"#infocollect"}},[e._v("1. WHAT INFORMATION DO WE COLLECT?")])]),r("p",[r("a",{attrs:{href:"#infouse"}},[e._v("2. HOW DO WE USE YOUR INFORMATION?")])]),r("p",[r("a",{attrs:{href:"#infoshare"}},[e._v("3. WILL YOUR INFORMATION BE SHARED WITH ANYONE?")])]),r("p",[r("a",{attrs:{href:"#whoshare"}},[e._v("4. WHO WILL YOUR INFORMATION BE SHARED WITH?")])]),r("p",[r("a",{attrs:{href:"#cookies"}},[e._v("5. DO WE USE COOKIES AND OTHER TRACKING TECHNOLOGIES?")])]),r("p",[r("a",{attrs:{href:"#sociallogins"}},[e._v("6. HOW DO WE HANDLE YOUR SOCIAL LOGINS?")])]),r("p",[r("a",{attrs:{href:"#inforetain"}},[e._v("7. HOW LONG DO WE KEEP YOUR INFORMATION?")])]),r("p",[r("a",{attrs:{href:"#infosafe"}},[e._v("8. HOW DO WE KEEP YOUR INFORMATION SAFE?")])]),r("p",[r("a",{attrs:{href:"#infominors"}},[e._v("9. DO WE COLLECT INFORMATION FROM MINORS?")])]),r("p",[r("a",{attrs:{href:"#privacyrights"}},[e._v("10. WHAT ARE YOUR PRIVACY RIGHTS?")])]),r("p",[r("a",{attrs:{href:"#DNT"}},[e._v("11. CONTROLS FOR DO-NOT-TRACK FEATURES")])]),r("p",[r("a",{attrs:{href:"#policyupdates"}},[e._v("12. DO WE MAKE UPDATES TO THIS POLICY?")])]),r("p",[r("a",{attrs:{href:"#contact"}},[e._v("13. HOW CAN YOU CONTACT US ABOUT THIS POLICY?")])]),r("p",[r("br")]),r("p",{attrs:{id:"infocollect"}},[r("strong",[e._v("1. WHAT INFORMATION DO WE COLLECT?")])]),r("p"),r("p",[r("strong",[e._v("Information automatically collected")])]),r("p",[r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v(" Some information – such as IP address and/or browser and device characteristics – is collected automatically when you visit our Sites . ")])]),r("p",[e._v(" We automatically collect certain information when you visit, use or navigate the Sites . This information does not reveal your specific identity (like your name or contact information) but may include device and usage information, such as your IP address, browser and device characteristics, operating system, language preferences, referring URLs, device name, country, location, information about how and when you use our Sites and other technical information. This information is primarily needed to maintain the security and operation of our Sites , and for our internal analytics and reporting purposes. ")]),r("p",[e._v(" Like many businesses, we also collect information through cookies and similar technologies. "),r("br")]),r("br"),r("p",{attrs:{id:"infouse"}},[r("strong",[e._v("2. HOW DO WE USE YOUR INFORMATION?")])]),r("p",[r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v("We process your information for purposes based on legitimate business interests, the fulfillment of our contract with you, compliance with our legal obligations, and/or your consent.")])]),r("p",[e._v(" We use personal information collected via our Sites for a variety of business purposes described below. We process your personal information for these purposes in reliance on our legitimate business interests, in order to enter into or perform a contract with you, with your consent, and/or for compliance with our legal obligations. We indicate the specific processing grounds we rely on next to each purpose listed below. ")]),r("p",[e._v("We use the information we collect or receive:")]),r("ul",[r("li",[r("strong",[e._v("To facilitate account creation and logon process.")
1]),e._v(' If you choose to link your account with us to a third party account *(such as your Google or Facebook account), we use the information you allowed us to collect from those third parties to facilitate account creation and logon process. See the section below headed " '),r("a",{attrs:{href:"#sociallogins"}},[e._v("HOW DO WE HANDLE YOUR SOCIAL LOGINS")]),e._v(' " for further information. '),r("br"),r("br")]),r("li",[r("strong",[e._v("To send administrative information to you.")]),e._v(" We may use your personal information to send you product, service and new feature information and/or information about changes to our terms, conditions, and policies. "),r("br"),r("br")]),r("li",[r("strong",[e._v("Fulfill and manage your orders.")]),e._v(" We may use your information to fulfill and manage your orders, payments, returns, and exchanges made through the Sites . "),r("br"),r("br")]),r("li",[r("strong",[e._v("Request Feedback.")]),e._v(" We may use your information to request feedback and to contact you about your use of our Sites . "),r("br"),r("br")]),r("li",[r("strong",[e._v("To protect our Sites.")]),e._v(" We may use your information as part of our efforts to keep our Sites safe and secure (for example, for fraud monitoring and prevention). "),r("br"),r("br")]),r("li",[r("strong",[e._v("To enforce our terms, conditions and policies.")]),r("br"),r("br")]),r("li",[r("strong",[e._v("To respond to legal requests and prevent harm.")]),e._v(" If we receive a subpoena or other legal request, we may need to inspect the data we hold to determine how to respond. "),r("br"),r("br")]),r("li",[r("strong",[e._v("For other Business Purposes.")]),e._v(" We may use your information for other Business Purposes, such as data analysis, or identifying usage trends. ")])]),r("br"),r("p",{attrs:{id:"infoshare"}},[r("strong",[e._v("3. WILL YOUR INFORMATION BE SHARED WITH ANYONE?")])]),r("p",[r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v("We only share information with your consent, to comply with laws, to protect your rights, or to fulfill business obligations.")])]),r("br"),r("div",[e._v("We may process or share data based on the following legal basis:")]),r("ul",[r("li",[r("strong",[e._v("Consent:")]),e._v(" We may process your data if you have given us specific consent to use your personal information in a specific purpose. "),r("br"),r("br")]),r("li",[r("strong",[e._v("Legitimate Interests:")]),e._v(" We may process your data when it is reasonably necessary to achieve our legitimate business interests. "),r("br"),r("br")]),r("li",[r("strong",[e._v("Performance of a Contract:")]),e._v(" Where we have entered into a contract with you, we may process your personal information to fulfill the terms of our contract. "),r("br"),r("br")]),r("li",[r("strong",[e._v("Legal Obligations:")]),e._v(" We may disclose your information where we are legally required to do so in order to comply with applicable law, governmental requests, a judicial proceeding, court order, or legal process, such as in response to a court order or a subpoena (including in response to public authorities to meet national security or law enforcement requirements). "),r("br"),r("br")]),r("li",[r("strong",[e._v("Vital Interests:")]),e._v(" We may disclose your information where we believe it is necessary to investigate, prevent, or take action regarding potential violations of our policies, suspected fraud, situations involving potential threats to the safety of any person and illegal activities, or as evidence in litigation in which we are involved. ")])]),r("p",[e._v(" More specifically, we may need to process your data or share your personal information in the following situations: ")]),r("br"),r("br"),r("li",[r("strong",[e._v("Business Transfers.")]),e._v(" We may share or transfer your information in connection with, or during negotiations of, any merger, sale of company assets, financing, or acquisition of all or a portion of our business to another company. ")]),r("br"),r("p",{attrs:{id:"whoshare"}},[r("strong",[e._v("4. WHO WILL YOUR INFORMATION BE SHARED WITH?")])]),r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v("We only share information with the following third parties.")]),e._v(" We only share and disclose your information with the following third parties. We have categorized each party so that you may be easily understand the purpose of our data collection and processing practices. If we have processed your data based on your consent and 
1you wish to revoke your consent, please contact us. "),r("ul",[r("li",[r("strong",[e._v("Allow Users to Connect to their Third-Party Accounts")]),r("br"),e._v("and Google account ")])]),e._v(" UserKit "),r("ul",[r("li",[r("strong",[e._v("Web and Mobile Analytics")]),r("br"),e._v("Plausible Analytics ")])]),r("br"),r("strong",[e._v("5. DO WE USE COOKIES AND OTHER TRACKING TECHNOLOGIES?")]),r("p",[r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v("We may use cookies and other tracking technologies to collect and store your information.")])]),r("p",[e._v(" We may use cookies and similar tracking technologies (like web beacons and pixels) to access or store information. Specific information about how we use such technologies and how you can refuse certain cookies is set out in our Cookie Policy . ")]),r("p",[e._v(" We will use the information we receive only for the purposes that are described in this privacy policy or that are otherwise made clear to you on the Sites . Please note that we do not control, and are not responsible for, other uses of your personal information by your third party social media provider. We recommend that you review their privacy policy to understand how they collect, use and share your personal information, and how you can set your privacy preferences on their sites and apps. ")]),r("p",[r("br")]),r("p",{attrs:{id:"inforetain"}},[r("strong",[e._v("7. HOW LONG DO WE KEEP YOUR INFORMATION?")])]),r("p",[r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v("We keep your information for as long as necessary to fulfill the purposes outlined in this privacy policy unless otherwise required by law.")])]),r("p",[e._v(" We will only keep your personal information for as long as it is necessary for the purposes set out in this privacy policy, unless a longer retention period is required or permitted by law (such as tax, accounting or other legal requirements). No purpose in this policy will require us keeping your personal information for longer than 6 months past the termination of the user's account . ")]),r("p",[e._v(" When we have no ongoing legitimate business need to process your personal information, we will either delete or anonymize it, or, if this is not possible (for example, because your personal information has been stored in backup archives), then we will securely store your personal information and isolate it from any further processing. ")]),r("p",[e._v(" We do not knowingly solicit data from or market to children under 18 years of age. By using the Sites , you represent that you are at least 18 or that you are the parent or guardian of such a minor and consent to such minor dependent’s use of the Sites . If we learn that personal information from users less than 18 years of age has been collected, we will deactivate the account and take reasonable measures to promptly delete such data from our records. If you become aware of any data we have collected from children under age 18, please contact us at [email protected] . ")]),r("p",[r("br")]),r("p",{attrs:{id:"privacyrights"}},[r("strong",[e._v("10. WHAT ARE YOUR PRIVACY RIGHTS?")])]),r("p",[r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v("You may review, change, or terminate your account at any time.")])]),r("p",[e._v(" If you are resident in the European Economic Area and you believe we are unlawfully processing your personal information, you also have the right to complain to your local data protection supervisory authority. You can find their contact details here: "),r("a",{attrs:{href:"http://ec.europa.eu/justice/data-protection/bodies/authorities/index_en.htm"}},[e._v("http://ec.europa.eu/justice/data-protection/bodies/authorities/index_en.htm")]),r("br")]),r("p",[r("strong",[e._v("Account Information")])]),r("p",[e._v(" If you would at any time like to review or change the information in your account or terminate your account, you can: ")]),r("p",[e._v("■ Contact us using the contact information provided.")]),r("p",[e._v(" Upon your request to terminate your account, we will deactivate or delete your account and information from our active databases. However, some information may be retained in our files to prevent fraud, troubleshoot problems, assist with any investigations, enforce our Terms of Use and/or comply with legal requirements. ")]),r("p",[r("strong",[r("u",[e._v("Cookies and similar technologies:")])]),e._v(" Most Web browsers are set to accept cookies by default. If you prefer, you can usually choose to set your browser to remove cookies and to reject cookies. If you choose to remove cookies or reject cookies, this could affect certain features or services of our Sites . To opt-out of interest-based advertising by advertisers on our Sites visit "),r("a",{attrs:{href:"http://www.aboutads.info/choices/"}},[e._v("http://www.aboutads.info/choices/")]),e._v(" . ")]),r("br"),r("p",{attrs:{id:"DNT"}},[r("strong",[e._v("11. CONTROLS FOR DO-NOT-TRACK FEATURES")])]),r("p",[e._v(" Most web browsers and some mobile operating systems and mobile applications include a Do-Not-Track (“DNT”) feature or setting you can activate to signal your privacy preference not to have data about your online browsing activities monitored and collected. No uniform technology standard for recognizing and implementing DNT signals has been finalized. As such, we do not currently respond to DNT browser signals or any other mechanism that automatically communicates your choice not to be tracked online. If a standard for online tracking is adopted that we must follow in the future, we will inform you about that practice in a revised version of this Privacy Policy. ")]),r("br"),r("p",{attrs:{id:"policyupdates"}},[r("strong",[e._v("12. DO WE MAKE UPDATES TO THIS POLICY?")])]),r("p",[r("strong",[r("em",[e._v("In Short:")])]),r("em",[e._v("Yes, we will update this policy as 
1necessary to stay compliant with relevant laws.")])]),r("p",[e._v(" We may update this privacy policy from time to time. The updated version will be indicated by an updated “Revised” date and the updated version will be effective as soon as it is accessible. If we make material changes to this privacy policy, we may notify you either by prominently posting a notice of such changes or by directly sending you a notification. We encourage you to review this privacy policy frequently to be informed of how we are protecting your information. ")]),r("p",[r("br")]),r("p",{attrs:{id:"contact"}},[r("strong",[e._v("13. HOW CAN YOU CONTACT US ABOUT THIS POLICY?")])]),r("p",[e._v(" If you have questions or comments about this policy, you may contact our Data Protection Officer (DPO), Michael Lynch, by email at [email protected]. ")])])}],Ve={name:"PrivacyPolicyPage"},Qe=Ve,Ze=(0,B.A)(Qe,Be,Xe,!1,null,"acf58292",null),et=Ze.exports,tt=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("h1",[e._v("Recent Entries")]),r("p",[e._v("Check out what other users got done this week:")]),r("EntryFeed",{attrs:{readEntriesFromServer:e.readEntriesFromServer,readEntriesFromStore:e.readEntriesFromStore,writeEntriesToStore:e.writeEntriesToStore}})],1)},rt=[],nt={name:"RecentEntriesPage",components:{EntryFeed:Ge},data(){return{loadMoreInProgress:!1}},methods:{readEntriesFromServer(e){return g(e)},readEntriesFromStore(){return this.$store.state.recentEntries},writeEntriesToStore(e){this.$store.commit("setRecent",e)}}},ot=nt,at=(0,B.A)(ot,tt,rt,!1,null,"8d2b0c86",null),st=at.exports,it=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"shutdown-notice"},[r("h1",[e._v("Shutdown Notice")]),r("p",[e._v("What Got Done is unfortunately shutting down at the end of 2025.")]),r("p",[e._v(" I, Michael Lynch, founder of What Got Done am happy to help anyone who wants to export their data and migrate it to another service. ")]),r("h2",[e._v("Why?")]),r("h3",[e._v("Low activity")]),r("p",[e._v(" There are not many users on What Got Done, so the site is a bit overkill in terms of time and cost for the number of users it serves. ")]),r("h3",[e._v("Changing views of open-source")]),e._m(0),r("p",[e._v(" Since 2019, my views on open-source have changed. I no longer think it's sustainable for me to run a service for free. All of my open-source projects these days require users to self-host, and that's been a more sustainable strategy for my personal bandwidth. ")]),r("h2",[e._v("What can users do?")]),e._m(1),e._m(2),r("h2",[e._v("Shutdown timeline")]),r("ul",[e._m(3),r("li",[r("b",[e._v("July 2025")]),e._v(": "),r("router-link",{attrs:{to:"/export"}},[e._v('"Export as Markdown"')]),e._v(" feature added. You can export all of your public posts as a ZIP of Markdown files. ")],1),r("li",[r("b",[e._v("July 2025")]),e._v(": Add support for a "),r("router-link",{attrs:{to:"/forwarding-address"}},[e._v("forwarding address")]),e._v(" feature that allows you to redirect your What Got Done posts to a new URL. ")],1),e._m(4),e._m(5)]),r("h2",[e._v("Questions")]),r("p",[e._v(" If you have any questions about the shutdown, please email [email protected]. ")])])},lt=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v(" I originally created What Got Done with hopes of it being a commercial product in 2019. When "),r("a",{attrs:{href:"https://mtlynch.io/retrospectives/2019/08/"}},[e._v("it flopped")]),e._v(", I decided to run What Got Done as an open-source project and a free service. ")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v(" The easiest option (and what Michael is doing) is to port your data to a static site generator, such as Hugo, Jekyll, or Gatsby. You are welcome to fork "),r("a",{attrs:{href:"https://github.com/mtlynch/weeks.mtlynch.io-old"}},[e._v("Michael's Hugo implementation")]),e._v(" ("),r("a",{attrs:{href:"https://weeks.mtlynch.io/"}},[e._v("live site")]),e._v(") and run the "),r("a",{attrs:{href:"https://github.com/mtlynch/weeks.mtlynch.io-old/blob/master/dev-scripts/import-from-whatgotdone"}},[r("code",[e._v("import-from-whatgotdone")])]),e._v(" script to import your data from What Got Done. ")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v(" Alternatively, if you'd like to continue using What Got Done, you can "),r("a",{attrs:{href:"https://github.com/mtlynch/wh
1atgotdone"}},[e._v("self-host it")]),e._v(", though you'd have to write a bit of custom code. You'd have to replace authentication, as whatgotdone.com depends on UserKit, which is no longer accepting new customers, so you'd need to replace UserKit in the app. You'd also have to write custom code to import from your JSON or Markdown export file back into What Got Done's SQLite database. ")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("li",[r("b",[e._v("May 2025")]),e._v(": Signups close. No new users may sign up to What Got Done. ")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("li",[r("b",[e._v("October 2025")]),e._v(": Users will no longer be able to post new updates. ")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("li",[r("b",[e._v("January 2026")]),e._v(": Replace the site with a shutdown notice. Keep redirects in place on a best-effort basis. ")])}],ct={name:"ShutdownNoticePage"},ut=ct,dt=(0,B.A)(ut,it,lt,!1,null,"378d6dd2",null),ht=dt.exports,mt=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"submit"},[r("h1",[e._v("What got done this week?")]),null!==e.entryContent?[r("form",{staticClass:"entry-form",on:{submit:function(t){return t.preventDefault(),e.handleSubmit.apply(null,arguments)}}},[r("p",[e._v(" Enter your update for the week ending "),r("span",{staticClass:"end-date"},[e._v(e._s(e._f("moment")(e.date,"dddd, ll")))]),e._v(". ")]),r("MarkdownEditor",{ref:"entryText",on:{input:e.debouncedSaveDraft},model:{value:e.entryContent,callback:function(t){e.entryContent=t},expression:"entryContent"}}),r("div",{staticClass:"d-flex justify-content-end"},[r("button",{staticClass:"btn btn-primary save-draft",attrs:{disabled:e.changesSaved},on:{click:function(t){return t.preventDefault(),e.handleSaveDraft.apply(null,arguments)}}},[e._v(" "+e._s(e.saveLabel)+" ")]),r("button",{staticClass:"btn btn-primary",attrs:{type:"submit",disabled:!e.entryHasContent}},[e._v(" Publish ")])])],1),null!==e.entryContent?r("JournalPreview",{attrs:{markdown:e.entryContent}}):e._e()]:e.errorMessage?[r("b-alert",{attrs:{show:"",variant:"warning"}},[r("h3",[e._v("Failed to load entry draft")]),r("p",[e._v(e._s(e.errorMessage))]),r("p",[e._v("Please reload the page to try again.")])])]:[r("b-spinner",{attrs:{type:"grow",label:"Spinning"}}),r("p",[e._v("Loading draft...")])]],2)},pt=[],ft=r(8234),vt=r(2543),gt=r.n(vt);function yt(e){return fetch(`/api/draft/${e}`,{credentials:"include"}).then((e=>e.ok?e.json():404===e.status?Promise.resolve({markdown:""}):e.text().then((e=>Promise.reject(e))))).then((e=>Object.prototype.hasOwnProperty.call(e,"markdown")?Promise.resolve(e.markdown):Promise.reject(new Error("response is missing expected field: markdown"))))}function wt(e,t){return fetch(`/api/draft/${e}`,{method:"PUT",body:JSON.stringify({entryContent:t}),credentials:"include",headers:{"X-CSRF-Token":m()}}).then((e=>e.ok?Promise.resolve():e.text().then((e=>Promise.reject(e)))))}function bt(e){return fetch(`/api/draft/${e}`,{method:"DELETE",credentials:"include",headers:{"X-CSRF-Token":m()}}).then((e=>e.ok?Promise.resolve():e.text().then((e=>Promise.reject(e)))))}function _t(e,t=null){let r=`/api/entries/${e}`;return t&&(r+=`/project/${t}`),fetch(r).then(p).then((t=>{let r=[];for(const n of t)r.push({permalink:`/${e}/${n.date}`,author:e,date:new Date(n.date),lastModified:new Date(n.lastModified),markdown:n.markdown});return r.sort(((e,t)=>t.date-e.date)),Promise.resolve(r)})).catch((e=>Promise.reject(e)))}function Et(e,t){return fetch(`/api/entry/${e}`,{method:"PUT",credentials:"include",headers:{"X-CSRF-Token":m()},body:JSON.stringify({entryContent:t})}).then(p)}function kt(e){return fetch(`/api/entry/${e}`,{method:"DELETE",credentials:"include",headers:{"X-CSRF-Token":m()}}).then((e=>e.ok?Promise.resolve():e.text().then((e=>Promise.reject(e)))))}var jt=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"journal-preview"},[r("p",{staticClass:"preview-bar"},[e._v("preview")]),r("div",{staticClass:"content"},[r("vue-markdown",{attrs:{linkify:!1,html:!1,anchorAttributes:{rel:"ugc"},source:e.markdown}})],1)])},St=[];n["default"].use(Oe());var Ct={name:"JournalPreview",props:{markdown:String},components:{VueMarkdown:Oe()}},Tt=Ct,At=(0,B.A)(Tt,jt,St,!1,null,"42a1a3e8",null),Pt=At.exports,Ot=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"editor markdown-editor"},[r("textarea-autosize",{ref:"editor",staticClass:"editor-textarea form-control",attrs:{"min-height":250,"max-height":650},on:{input:e.onInput},nativeOn:{paste:function(t){return e.onPaste.apply(null,arguments)}},model:{value:e.contents,callback:function(t){e.contents=t},expression:"contents"}}),e._m(0)],1)},$t=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v(" (You can use "),r("a",{attrs:{href:"https://www.markdownguide.org/cheat-sheet/",target:"_blank"}},[e._v("Markdown")]),e._v(") ")])}];function Ut(e){let t=new FormData;return t.append("file",e),fetch("/api/media",{method:"PUT",credentials:"include",headers:{"X-CSRF-Token":m()},body:t}).then(p).then((e=>Promise.resolve(e.url)))}n["default"].use(ft.A);var It={props:{value:String},data(){return{contents:this.value}},methods:{onInput(e){this.$emit("input",e)},onPaste(e){for(const t of e.clipboardData.items){if(t.type.indexOf("image")<0)continue;const e=t.getAsFile();if(!e)return;let r=this.getSelectedText();r||(r="image"),this.insertTextAtCursorPosition(`[${r}](uploading...)`,!0),Ut(e).then((e=>{this.insertTextAtCursorPosition(`[${r}](${e})`,!1)})).catch((e=>{this.insertTextAtCursorPosition(`[${r}](upload failed: ${e})`,!1)}))}},getSelectedText:function(){const e=this.$refs.editor.$el;return e.value.slice(e.selectionStart,e.selectionEnd)},insertTextAtCursorPosition:function(e,t){const r=this.$refs.editor.$el;if(!e)return;let n=r.selectionStart;r.value=r.value.substring(0,r.selectionStart)+e+r.value.substring(r.selectionEnd,this.contents.length),this.$emit("input",r.value),this.$nextTick((function(){t?(r.selectionStart=n,r.selectionEnd=n+e.length):(n+=e.length,r.selectionStart=n,r.selectionEnd=n)}))}},watch:{value:function(e){this.contents=e}}},Ft=It,Dt=(0,B.A)(Ft,Ot,$t,!1,null,"39896369",null),xt=Dt.exports;n["default"].use(ft.A);var Rt={name:"EditEntryPage",components:{JournalPreview:Pt,MarkdownEditor:xt},data(){return{date:"",entryContent:null,errorMessage:null,changesSaved:!0,saveLabel:"Save Draft"}},computed:{username(){return this.$store.state.username},entryHasContent(){return""!==this.entryContent.trim()}},methods:{loadEntryContent(){0!=this.date.length&&this.username&&yt(this.date).then((e=>{this.entryContent=e})).catch((e=>{this.errorMessage=e}))},onContentChanged(){this.changesSaved=!1,this.debouncedSaveDraft()},handleSaveDraft(){this.changesSaved=!1,this.saveLabel="Saving";let e=null;e=this.entryHasContent?()=>wt(this.date,this.entryContent):()=>bt(this.date),e().then((()=>{this.changesSaved=!0,this.saveLabel="Changes Saved"})).catch((()=>{this.changesSaved=!1}))},debouncedSaveDraft:gt().debounce((function(){this.handleSaveDraft()}),2500),handleSubmit(){this.entryContent&&Et(this.date,this.entryContent).then((e=>{this.$router.push(e.path)}))}},created(){this.username?this.$route.params.date&&J(this.$route.params.date)?this.date=this.$route.params.date:this.date=z():this.$router.replace("/login")},watch:{date:function(){this.loadEntryContent()},username:function(){this.loadEntryContent()},$route(e,t){e.params.date!=t.params.date&&J(e.params.date)&&(this.date=e.params.date)}}},Wt=Rt,Lt=(0,B.A)(Wt,mt,pt,!1,null,"789bb0e3",null),Mt=Lt.exports,Nt=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"view-entry"},[e.journalEntries.length>0?[e.pages.length>0?r("b-pagination-nav",{attrs:{pages:e.pages,align:"center","use-router":""}}
1):e._e(),e.canEdit?r("b-form-checkbox",{staticClass:"show-empty",model:{value:e.showEmptyEntries,callback:function(t){e.showEmptyEntries=t},expression:"showEmptyEntries"}},[e._v("Show empty entries")]):e._e(),e.currentEntry?r("Journal",{attrs:{entry:e.currentEntry}}):r("p",{staticClass:"missing-entry"},[r("username-link",{attrs:{username:e.entryAuthor}}),e._v(" has not posted a journal entry for "),r("b",[e._v(e._s(e._f("moment")(e.entryDate,"utc","dddd, ll")))])],1)]:e.isLoading?[r("b-spinner",{attrs:{type:"grow",label:"Spinning"}}),r("p",[e._v("Loading  "),r("username-link",{attrs:{username:e.entryAuthor}}),e._v("'s update...")],1)]:[r("p",[r("username-link",{attrs:{username:e.entryAuthor}}),e._v(" has not posted any What Got Done updates. ")],1)],e.backendError?r("p",{staticClass:"error"},[e._v(" Failed to connect to backend: "+e._s(e.backendError)+" ")]):e._e(),e.canEdit?r("div",{staticClass:"author-controls mb-4"},[r("div",{staticClass:"ml-auto"},[r("b-button",{attrs:{variant:"danger"},on:{click:e.onDelete}},[e._v("Unpublish")]),r("b-button",{staticClass:"ml-2",attrs:{to:"/entry/edit/"+this.entryDate,variant:"primary"}},[e._v("Edit")])],1)]):e._e(),e.currentEntry?r("Reactions",{attrs:{entryAuthor:e.entryAuthor,entryDate:e.entryDate}}):e._e()],2)},Ht=[],Yt=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"journal"},[r("JournalHeader",{attrs:{entryAuthor:e.entry.author,entryDate:e.entry.date}}),r("JournalBody",{attrs:{source:e.entry.markdown}}),r("div",{staticClass:"metadata"},[r("div",{staticClass:"last-modified-date"},[e._v(" Last modified "+e._s(e._f("moment")(e.entry.lastModified,"lll"))+" ")])])],1)},Gt=[],Jt=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"journal-body"},[r("vue-markdown",{attrs:{linkify:!1,html:!1,anchorAttributes:{rel:"ugc"},source:e.source}})],1)},zt=[];n["default"].use(Oe());var Kt={name:"JournalBody",props:{source:String},components:{VueMarkdown:Oe()}},qt=Kt,Bt=(0,B.A)(qt,Jt,zt,!1,null,"960e4b52",null),Xt=Bt.exports;n["default"].use(Oe());var Vt={name:"Journal",props:{entry:Object},components:{JournalBody:Xt,JournalHeader:xe}},Qt=Vt,Zt=(0,B.A)(Qt,Yt,Gt,!1,null,"4f2fed0b",null),er=Zt.exports,tr=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"reactions"},[r("div",{staticClass:"reaction-buttons"},e._l(e.reactionSymbols,(function(t){return r("b-button",{key:t,attrs:{variant:e.buttonVariant(t)},on:{click:function(r){return e.handleReaction(t)}}},[e._v(e._s(t))])})),1),e._l(e.reactions,(function(t){return r("div",{key:t.key,staticClass:"reaction"},[r("div",{staticClass:"d-flex align-items-center mb-3"},[r("user-avatar",{staticClass:"mr-2 d-block avatar",attrs:{username:t.username}}),r("username-link",{attrs:{username:t.username}}),e._v(" reacted with a "),r("span",{staticClass:"reaction-symbol ml-1"},[e._v(e._s(t.reaction))])],1)])}))],2)},rr=[];function nr(e,t){return fetch(`/api/reactions/entry/${e}/${t}`).then(p)}function or(e,t,r){return fetch(`/api/reactions/entry/${e}/${t}`,{method:"POST",credentials:"include",headers:{"X-CSRF-Token":m()},body:JSON.stringify({reactionSymbol:r})})}function ar(e,t){return fetch(`/api/reactions/entry/${e}/${t}`,{method:"DELETE",credentials:"include",headers:{"X-CSRF-Token":m()}})}var sr={name:"Reactions",props:{entryAuthor:String,entryDate:String},data(){return{reactions:[],reactionSymbols:["👍","🎉","🙁"],selectedReaction:""}},methods:{clear:function(){this.reactions=[],this.selectedReaction=""},loadReactions:function(){if(!this.entryAuthor||!this.entryDate)return;const e=[];let t="";nr(this.entryAuthor,this.entryDate).then((r=>{for(const n of r){if(n.username==this.loggedInUsername){if(""!=this.selectedReaction)continue;t=n.symbol}e.push({key:n.username,username:n.username,timestamp:new Date(n.timestamp),reaction:n.symbol})}""!=this.selectedReaction&&e.push({key:this.loggedInUsername,username:this.loggedInUsername,timestamp:new Date,reaction:this.selectedReaction}),e.sort(((e,t)=>e.timestamp-t.timestamp)),this.reactions=e,""==this.selectedReaction&&(this.selectedReaction=t)})).catch((()=>{}))},reloadReactions:function(){this.clear(),this.loadReactions()},handleReaction:function(e){this.loggedInUsername?(this.selectedReaction==e?(this.selectedReaction="",ar(this.entryAuthor,this.entryDate)):(this.selectedReaction=e,or(this.entryAuthor,this.entryDate,this.selectedReaction)),this.updateReactions()):this.$router.push("/login")},updateReactions:function(){const e=[];for(const t of this.reactions)t.username!=this.loggedInUsername&&e.push(t);""!=this.selectedReaction&&e.push({key:this.loggedInUsername,username:this.loggedInUsername,timestamp:new Date,reaction:this.selectedReaction}),this.reactions=e},buttonVariant:function(e){return this.selectedReaction==e?"light":"secondary"}},computed:{loggedInUsername:function(){return this.$store.state.username}},created(){this.loadReactions()},watch:{entryAuthor:function(){this.reloadReactions()},entryDate:function(){this.reloadReactions()}}},ir=sr,lr=(0,B.A)(ir,tr,rr,!1,null,"792ef1f7",null),cr=lr.exports,ur={name:"ViewEntryPage",components:{Journal:er,Reactions:cr},data(){return{journalEntries:[],showEmptyEntries:!1,isLoading:!1,backendError:null}},methods:{loadJournalEntries:function(){this.isLoading=!0,this.journalEntries=[],_t(this.entryAuthor).then((e=>{e.sort(((e,t)=>e.date-t.date)),this.journalEntries=e})).catch((e=>{this.backendError=e})).finally((()=>{this.isLoading=!1}))},onDelete:function(){kt(this.entryDate).then((()=>{this.$router.push("/entry/edit/"+this.entryDate)}))}},computed:{pages:function(){let e=[];for(const t of this.entryDates){const r=G()(t).utc(),n=r.format("YYYY-MM-DD");e.push({link:`/${this.entryAuthor}/${n}`,text:r.format("MMM. D").replace("May.","May")})}return e},entryDates:function(){let e=[];
1if(this.showEmptyEntries){let t=G()(this.journalEntries[0].date.toISOString());while(t<=G()(z()))e.push(t.toISOString()),t=t.add(1,"weeks")}else for(const t of this.journalEntries)e.push(t.date.toISOString());return e},loggedInUsername:function(){return this.$store.state.username},canEdit:function(){return this.currentEntry&&this.loggedInUsername&&this.loggedInUsername===this.entryAuthor},entryAuthor:function(){return this.$route.params.username},entryDate:function(){return this.$route.params.date},currentEntry:function(){if(!this.entryDate)return null;for(const e of this.journalEntries)if(this.$route.path===e.permalink)return e;return null}},created(){this.loadJournalEntries()},watch:{$route(e,t){e.params.username!=t.params.username&&this.loadJournalEntries()}}},dr=ur,hr=(0,B.A)(dr,Nt,Ht,!1,null,"32982b79",null),mr=hr.exports,pr=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("h1",[r("username-link",{attrs:{username:e.username}}),e._v("'s updates for "+e._s(e.project))],1),e.entriesLoaded&&e.entries.length>0?e._l(e.entries,(function(e){return r("div",{key:e.key,staticClass:"journal project-entry"},[r("ProjectEntry",{attrs:{entry:e}})],1)})):e._e(),e.entriesLoaded&&0===e.entries.length?r("p",{staticClass:"no-entries-message"},[e._v(" This user has not submitted any recent updates. ")]):e._e()],2)},fr=[],vr=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"project-entry"},[r("p",{staticClass:"date"},[e._v(" For the week ending "),r("strong",[r("router-link",{attrs:{to:e.entry.permalink}},[e._v(e._s(e._f("moment")(e.entry.date,"utc","dddd, ll")))])],1)]),r("JournalBody",{attrs:{source:e.entry.markdown}})],1)},gr=[];n["default"].use(Oe());var yr={name:"ProjectEntry",props:{entry:Object},components:{JournalBody:Xt}},wr=yr,br=(0,B.A)(wr,vr,gr,!1,null,null,null),_r=br.exports,Er={name:"ViewProjectPage",components:{ProjectEntry:_r},data(){return{entries:[],entriesLoaded:!1}},computed:{username:function(){return this.$route.params.username},project:function(){return this.$route.params.project}},methods:{clear:function(){this.entries=[],this.entriesLoaded=!1},loadEntries:function(){this.entries=[],_t(this.username,this.project).then((e=>{this.entries=e,this.entriesLoaded=!0}))}},created(){this.loadEntries()}},kr=Er,jr=(0,B.A)(kr,pr,fr,!1,null,"5269026d",null),Sr=jr.exports,Cr=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("h1",[e._v("Edit Profile")]),r("div",{staticClass:"form-group profile-photo-form"},[r("label",{attrs:{for:"upload-profile-photo"}},[e._v("Profile Photo")]),r("a",{staticClass:"avatar-wrapper",attrs:{href:"#"},on:{click:e.openFileUploadDialog}},[r("user-avatar",{ref:"avatar",attrs:{username:e.loggedInUsername}})],1),r("div",{staticClass:"profile-photo-btns"},[r("b-form-file",{ref:"fileUpload",attrs:{id:"upload-profile-photo",plain:!0,input:"profile-photo-input",accept:"image/jpeg"},on:{input:e.onUploadProfilePhoto},model:{value:e.profilePhoto,callback:function(t){e.profilePhoto=t},expression:"profilePhoto"}}),r("b-button",{staticClass:"profile-photo-btn",attrs:{variant:"danger",id:"delete-profile-photo"},on:{click:e.onRemoveProfilePhoto}},[e._v("Remove")])],1)]),r("div",{staticClass:"form-group"},[r("label",{attrs:{for:"user-bio"}},[e._v("Bio")]),r("textarea",{directives:[{name:"model",rawName:"v-model",value:e.profile.aboutMarkdown,expression:"profile.aboutMarkdown"}],staticClass:"form-control",attrs:{id:"user-bio",disabled:!e.profileLoaded,maxlength:"300",placeholder:"Tell others who you are and what your current projects are"},domProps:{value:e.profile.aboutMarkdown},on:{input:function(t){t.target.composing||e.$set(e.profile,"aboutMarkdown",t.target.value)}}})]),r("div",{staticClass:"form-group"},[r("label",{attrs:{for:"email-address"}},[e._v("Public email address")]),r("input",{directives:[{name:"model",rawName:"v-model",value:e.profile.emailAddress,expression:"profile.emailAddress"}],staticClass:"form-control",attrs:{type:"email",id:"email-address",disabled:!e.profileLoaded,placeholder:"[email protected]"},domProps:{value:e.profile.emailAddress},on:{input:function(t){t.target.composing||e.$set(e.profile,"emailAddress",t.target.value)}}})]),r("div",{staticClass:"form-group"},[r("label",{attrs:{for:"twitter-handle"}},[e._v("Twitter handle")]),r("input",{directives:[{name:"model",rawName:"v-model",value:e.profile.twitterHandle,expression:"profile.twitterHandle"}],staticClass:"form-control",attrs:{type:"text",id:"twitter-handle",disabled:!e.profileLoaded,placeholder:"@handle"},domProps:{value:e.profile.twitterHandle},on:{input:function(t){t.target.composing||e.$set(e.profile,"twitterHandle",t.target.value)}}})]),r("div",{staticClass:"form-group"},[r("label",{attrs:{for:"mastodon-address"}},[e._v("Mastodon address")]),r("input",{directives:[{name:"model",rawName:"v-model",value:e.profile.mastodonAddress,expression:"profile.mastodonAddress"}],staticClass:"form-control",attrs:{type:"text",id:"mastodon-address",disabled:!e.profileLoaded,placeholder:"[email protected]"},domProps:{value:e.profile.mastodonAddress},on:{input:function(t){t.target.composing||e.$set(e.profile,"mastodonAddress",t.target.value)}}})]),e.formError?r("div",{staticClass:"alert alert-primary",attrs:{role:"alert"}}
1,[e._v(" "+e._s(e.formError)+" ")]):e._e(),r("b-button",{staticClass:"d-block ml-auto",attrs:{variant:"primary",id:"save-profile"},on:{click:function(t){return t.preventDefault(),e.handleSave()}}},[e._v("Save")])],1)},Tr=[];function Ar(){return fetch("/api/user/avatar",{method:"DELETE",credentials:"include",headers:{"X-CSRF-Token":m()}}).then(f)}function Pr(e){const t=new FormData;return t.append("file",e),fetch("/api/user/avatar",{method:"PUT",credentials:"include",headers:{"X-CSRF-Token":m()},body:t}).then(f)}var Or={name:"EditUserProfilePage",data(){return{profilePhoto:null,profile:{aboutMarkdown:"",twitterHandle:"",emailAddress:"",mastodonAddress:""},profileLoaded:!1,formError:null}},computed:{loggedInUsername:function(){return this.$store.state.username}},methods:{loadProfile:function(){O(this.loggedInUsername).then((e=>{this.profile=e,this.profileLoaded=!0}))},handleSave:function(){$(this.profile).then((()=>{this.$router.push(`/${this.loggedInUsername}`)})).catch((e=>{this.formError=e}))},openFileUploadDialog:function(){this.$refs.fileUpload.reset(),this.$refs.fileUpload.$el.click()},onUploadProfilePhoto:function(e){Pr(e).then((()=>{this.$refs.avatar.refresh()})).catch((e=>{this.formError=e}))},onRemoveProfilePhoto:function(){Ar().then((()=>{this.$refs.avatar.refresh()})).catch((e=>{this.formError=e}))}},created(){this.loadProfile()}},$r=Or,Ur=(0,B.A)($r,Cr,Tr,!1,null,"41d4649d",null),Ir=Ur.exports,Fr=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"preferences"},[r("h1",[e._v("Preferences")]),r("b-form",{on:{submit:function(t){return t.preventDefault(),e.handleSubmit.apply(null,arguments)}}},[r("h2",[e._v("Entry template")]),r("b-form-group",{attrs:{label:"Create a template for your weekly What Got Done entries. Every new update you create will start with this text.","label-for":"entry-template-input"}},[r("textarea-autosize",{staticClass:"form-control",attrs:{id:"entry-template-input",disabled:void 0===e.entryTemplate,name:"entry-template","min-height":250,"max-height":650,placeholder:"# Project 1\n\n*Update 1\n*Update 2\n\n# Project 2\n\n* Update 1"},on:{input:e.onEntryTemplateChanged},model:{value:e.entryTemplate,callback:function(t){e.entryTemplate=t},expression:"entryTemplate"}})],1),r("div",{staticClass:"d-flex justify-content-end"},[r("button",{staticClass:"btn btn-primary",attrs:{type:"submit",disabled:!e.templateChanged}},[e._v(" Save ")])]),r("div",{staticClass:"d-flex justify-content-end"},[r("b-alert",{staticClass:"mt-2",attrs:{variant:"success",dismissible:"",fade:"",show:e.preferencesSaved}},[e._v("Preferences saved")])],1)],1)],1)},Dr=[];function xr(){return fetch("/api/preferences",{credentials:"include"}).then((e=>404===e.status?Promise.resolve({entryTemplate:""}):e.ok?e.json():e.text().then((e=>Promise.reject(e)))))}function Rr(e){return fetch("/api/preferences",{method:"PUT",headers:{"X-CSRF-Token":m()},credentials:"include",body:JSON.stringify(e)})}n["default"].use(ft.A);var Wr={name:"UserPreferencesPage",data(){return{entryTemplate:void 0,entryTemplateFromServer:void 0,savingPreferences:!1,templateChanged:!1,preferencesSaved:!1}},computed:{username:function(){return this.$store.state.username}},methods:{loadPreferences(){xr().then((e=>{this.entryTemplateFromServer=e.entryTemplate,this.entryTemplate=e.entryTemplate})).catch((()=>{this.entryTemplate=""}))},onEntryTemplateChanged(){this.templateChanged=!this.entryTemplateFromServer&&this.entryTemplate||this.entryTemplateFromServer&&this.entryTemplateFromServer!==this.entryTemplate},handleSubmit(){this.savingPreferences=!0,Rr({entryTemplate:this.entryTemplate}).then((()=>{this.preferencesSaved=!0,this.templateChanged=!1})).finally((()=>{this.savingPreferences=!1}))}},created(){this.$store.state.username?this.loadPreferences():this.$router.replace("/login")}},Lr=Wr,Mr=(0,B.A)(Lr,Fr,Dr,!1,null,"3ed7858c",null),Nr=Mr.exports,Hr=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("div",{staticClass:"profile"},[r("user-avatar",{staticClass:"avatar",attrs:{username:e.username}}),r("div",{staticClass:"ml-md-5"},[r("h1",[e._v(e._s(e.username))]),r("vue-markdown",{attrs:{linkify:!1,html:!1,anchorAttributes:{rel:"ugc"},source:e.aboutMarkdown,"data-testid":"user-bio"}}),e.profileLoaded&&!e.aboutMarkdown?r("p",{staticClass:"font-italic"}
1,[e._v(" This user has not yet created a public bio. ")]):e._e(),e.twitterHandle||e.emailAddress?[r("ul",[e.emailAddress?r("li",[r("a",{attrs:{href:"mailto:"+e.emailAddress,"data-testid":"email-address"}},[e._v(e._s(e.emailAddress))]),e._v(" (Email) ")]):e._e(),e.twitterHandle?r("li",[r("a",{attrs:{href:"https://twitter.com/"+e.twitterHandle,"data-testid":"twitter-handle"}},[e._v("@"+e._s(e.twitterHandle))]),e._v(" (Twitter) ")]):e._e(),e.mastodonAddress?r("li",[r("a",{attrs:{"data-testid":"mastodon-address",href:e.mastodonUrl}},[e._v(e._s(e.mastodonAddress))]),e._v(" (Mastodon) ")]):e._e()])]:e._e()],2)],1),r("div",{staticClass:"d-flex justify-content-end"},[e.canEdit?r("b-button",{attrs:{to:"/profile/edit",variant:"primary"}},[e._v("Edit")]):e._e(),e.canFollow?r("b-button",{attrs:{variant:"primary"},on:{click:e.onFollow}},[e._v("Follow")]):e._e(),e.canUnfollow?r("b-button",{attrs:{variant:"primary"},on:{click:e.onUnfollow}},[e._v("Unfollow")]):e._e()],1),r("h2",[e._v("Recent entries")]),e._l(e.recentEntries,(function(e){return r("PartialJournal",{key:e.permalink,attrs:{entry:e}})})),e.entriesLoaded&&0===e.recentEntries.length?r("p",{staticClass:"font-italic"},[e._v(" This user has not submitted any recent updates. ")]):e._e()],2)},Yr=[];n["default"].use(Oe());var Gr={name:"UserProfilePage",components:{VueMarkdown:Oe(),PartialJournal:Me},data(){return{aboutMarkdown:"",twitterHandle:null,emailAddress:null,mastodonAddress:null,recentEntries:[],profileLoaded:!1,entriesLoaded:!1}},computed:{username:function(){return this.$route.params.username},loggedInUsername:function(){return this.$store.state.username},canEdit:function(){return this.loggedInUsername&&this.loggedInUsername===this.username},isFollowing:function(){return!!this.$store.state.following&&this.$store.state.following.includes(this.username)},avatarLink:function(){return this.canEdit?"/profile/edit":null},mastodonUrl:function(){if(!this.mastodonAddress)return null;const e=this.mastodonAddress.split("@"),t=e[0],r=e[1];return`https://${r}/@${t}`},isSelf:function(){return!!this.loggedInUsername&&this.loggedInUsername==this.username},canFollow:function(){return this.loggedInUsername&&!this.isFollowing&&!this.isSelf},canUnfollow:function(){return this.loggedInUsername&&this.isFollowing&&!this.isSelf}},methods:{clear:function(){this.aboutMarkdown="",this.twitterHandle=null,this.emailAddress=null,this.mastodonAddress=null,this.recentEntries=[],this.profileLoaded=!1,this.entriesLoaded=!1},loadProfile:function(){O(this.username).then((e=>{this.aboutMarkdown=e.aboutMarkdown,this.twitterHandle=e.twitterHandle,this.emailAddress=e.emailAddress,this.mastodonAddress=e.mastodonAddress,this.profileLoaded=!0}))},loadRecentEntries:function(){this.recentEntries=[],_t(this.username).then((e=>{this.recentEntries=e,this.entriesLoaded=!0}))},onFollow:function(){this.$store.commit("addFollowedUser",this.username),T(this.username)},onUnfollow:function(){this.$store.commit("removeFollowedUser",this.username),A(this.username)}},created(){this.loadProfile(),this.loadRecentEntries()},watch:{$route(e,t){e.params.username!=t.params.username&&(this.clear(),this.loadProfile(),this.loadRecentEntries())}}},Jr=Gr,zr=(0,B.A)(Jr,Hr,Yr,!1,null,"e04b0d08",null),Kr=zr.exports,qr=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("h1",[e._v("Export Data")]),r("p",[e._v(" Download a backup of your account data, including all What Got Done drafts, entries, and preferences. ")]),r("b-button",{attrs:{variant:"primary"},on:{click:e.onExport}},[e._v("Download (JSON)")]),r("p",[e._v(" Download only your public posts in Markdown format. (optimized for migrating to a static site generator) ")]),r("b-button",{staticClass:"ml-2",attrs:{variant:"secondary"},on:{click:e.onExportMarkdown}},[e._v("Download (Markdown)")]),r("a",{ref:"file-download-helper",staticClass:"d-none"})],1)},Br=[];function Xr(){return fetch("/api/export",{credentials:"include"}).then(p)}function Vr(){return fetch("/api/export/markdown",{credentials:"include"}).then((e=>{if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.blob().then((t=>({blob:t,filename:Qr(e.headers.get("Content-Disposition"))})))}))}function Qr(e){if(!e)return"export.zip";const t=e.match(/filename="([^"]+)"/);return t?t[1]:"export.zip"}var Zr={name:"ExportPage",computed:{loggedInUsername:function(){return this.$store.state.username}},methods:{onExport:function(){Xr().then((e=>{const t=window.URL.createObjectURL(new Blob([JSON.stringify(e,null,2)],{type:"text/json"}
1)),r=this.$refs["file-download-helper"];r.style="display: none",r.href=t;const n=(new Date).toISOString().replace(/:/g,"").replace(/\.\d+/g,"");r.download=`whatgotdone-${this.loggedInUsername}-${n}.json`,r.click()}))},onExportMarkdown:function(){Vr().then((({blob:e,filename:t})=>{const r=window.URL.createObjectURL(e),n=this.$refs["file-download-helper"];n.style="display: none",n.href=r,n.download=t,n.click()}))}},created(){this.loggedInUsername||this.$router.push("/login")}},en=Zr,tn=(0,B.A)(en,qr,Br,!1,null,"6ade169d",null),rn=tn.exports,nn=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[r("h1",[e._v("Forwarding Address")]),r("p",[e._v(" Due to the "),r("router-link",{attrs:{to:"/shutdown-notice"}},[e._v("shutdown of whatgotdone.com")]),e._v(", you can redirect your profile and posts to a new URL. ")],1),r("p",[e._v(" Forwarding might be useful if you're hosting What Got Done or an equivalent service at another URL. ")]),r("p",[e._v(" When you set a forwarding address, visitors who access your profile will be redirected to your new location. For example: ")]),r("ul",[r("li",[r("code",[e._v(e._s(e.currentHostname)+"/"+e._s(e.loggedInUsername))]),e._v(" will redirect to "),r("code",[e._v("https://new.example.com/")])]),r("li",[r("code",[e._v(e._s(e.currentHostname)+"/"+e._s(e.loggedInUsername)+"/2025-07-11")]),e._v(" will redirect to "),r("code",[e._v("https://new.example.com/2025-07-11")])])]),e.currentForwardingUrl?r("div",{staticClass:"mt-4"},[r("div",{staticClass:"alert alert-info"},[r("strong",[e._v("Current forwarding address:")]),r("br"),r("code",[e._v(e._s(e.currentForwardingUrl))])]),r("p",[e._v(" Visitors to your What Got Done profile are currently being redirected to this address. ")]),r("b-button",{attrs:{variant:"danger",disabled:e.isLoading},on:{click:e.onDelete}},[e._v(" "+e._s(e.isLoading?"Deleting...":"Delete Forwarding Address")+" ")])],1):r("div",{staticClass:"mt-4"},[r("b-form",{on:{submit:function(t){return t.preventDefault(),e.onSave.apply(null,arguments)}}},[r("b-form-group",{attrs:{label:"Base URL of your new server:","label-for":"forwarding-url",description:"Enter the base URL where your content is hosted (e.g., https://new-location.example.com)"}},[r("b-form-input",{attrs:{id:"forwarding-url",type:"url",placeholder:"https://new.example.com",required:"",disabled:e.isLoading},model:{value:e.newForwardingUrl,callback:function(t){e.newForwardingUrl=t},expression:"newForwardingUrl"}})],1),r("b-button",{attrs:{type:"submit",variant:"primary",disabled:e.isLoading||!e.isValidUrl}},[e._v(" "+e._s(e.isLoading?"Saving...":"Save Forwarding Address")+" ")])],1)],1),e.errorMessage?r("div",{staticClass:"alert alert-danger mt-3"},[e._v(" "+e._s(e.errorMessage)+" ")]):e._e()])},on=[];function an(){return fetch("/api/forwarding-address",{credentials:"include"}).then(p)}function sn(e){return fetch("/api/forwarding-address",{method:"PUT",credentials:"include",headers:{"X-CSRF-Token":m(),"Content-Type":"application/json"},body:JSON.stringify({forwardingUrl:e})}).then(f)}function ln(){return fetch("/api/forwarding-address",{method:"DELETE",credentials:"include",headers:{"X-CSRF-Token":m()}}).then(f)}var cn={name:"ForwardingAddressPage",data(){return{currentForwardingUrl:null,newForwardingUrl:"",isLoading:!1,errorMessage:""}},computed:{loggedInUsername:function(){return this.$store.state.username},currentHostname:function(){return`${window.location.protocol}//${window.location.host}`},isValidUrl:function(){if(!this.newForwardingUrl)return!1;try{const e=new URL(this.newForwardingUrl);return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}}},methods:{loadForwardingAddress:function(){this.isLoading=!0,this.errorMessage="",an().then((e=>{this.currentForwardingUrl=e.forwardingUrl||null})).catch((e=>{this.errorMessage=`Failed to load forwarding address: ${e}`})).finally((()=>{this.isLoading=!1}))},onSave:function(){this.isValidUrl&&(this.isLoading=!0,this.errorMessage="",sn(this.newForwardingUrl).then((()=>{this.currentForwardingUrl=this.newForwardingUrl,this.newForwardingUrl=""})).catch((e=>{this.errorMessage=`Failed to save forwarding address: ${e}`})).finally((()=>{this.isLoading=!1})))},onDelete:function(){this.isLoading=!0,this.errorMessage="",ln().then((()=>{this.currentForwardingUrl=null})).catch((e=>{this.errorMessage=`Failed to delete forwarding address: ${e}`})).finally((()=>{this.isLoading=!1}))}},created(){this.loggedInUsername?this.loadForwardingAddress():this.$router.push("/login")}},un=cn,dn=(0,B.A)(un,nn,on,!1,null,"dacd74c6",null),hn=dn.exports,mn=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"missing-page"},[r("p",[e._v("You typed "+e._s(e.$route.path))]),r("p",[e._v("We don't have a page for that. Shrug!")])])},pn=[],fn={name:"MissingPage"},vn=fn,gn=(0,B.A)(vn,mn,pn,!1,null,null,null),yn=gn.exports;n["default"].use(re.A);const wn=[{path:"/about",component:le},{path:"/recent",component:st},{path:"/feed",component:qe},{path:"/entry/edit/:date",component:Mt,name:"EditEntry"},{path:"/login",component:pe},{path:"/logout",component:Ee},{path:"/preferences",component:Nr,name:"Preferences"},{path:"/export",component:rn,name:"Export"},{path:"/forwarding-address",component:hn,name:"ForwardingAddress"},{path:"/privacy-policy",component:et},{path:"/shutdown-notice",component:ht},{path:"/:username",component:Kr,meta:{title:e=>`${e.params.username} - What Got Done`}},{path:"/profile/edit",component:Ir,name:"EditProfile"},{path:"/:username/:date",component:mr,meta:{title:e=>`${e.params.username}'s What Got Done for the week of ${e.params.date}`}},{path:"/:username/project/:project",component:Sr,meta:{title:e=>`${e.params.username}'s What Got Done | ${e.params.project}`}},{path:"/",component:le},{path:"*",component:yn}];var bn=new re.A({routes:wn,mode:"history"});r(9313);n["default"].config.productionTip=!1,n["default"].use(s.vGs),n["default"].use(i.hP),l.$W.autoAddCss=!1,l.Yv.add(c.HQ1),n["default"].component("font-awesome-icon",u.gc),n["default"].use(a()),n["default"].prototype.moment=a(),bn.beforeEach(((e,t,r)=>{e.meta.title?document.title=e.meta.title(e):document.title="What Got Done",r()})),new n["default"]({store:S,router:bn,render:e=>e(te)}).$mount("#app")}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={id:n,loaded:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=e,function(){var e=[];r.O=function(t,n,o,a){if(!n){var s=1/0;for(u=0;
1u<e.length;u++){n=e[u][0],o=e[u][1],a=e[u][2];for(var i=!0,l=0;l<n.length;l++)(!1&a||s>=a)&&Object.keys(r.O).every((function(e){return r.O[e](n[l])}))?n.splice(l--,1):(i=!1,a<s&&(s=a));if(i){e.splice(u--,1);var c=o();void 0!==c&&(t=c)}}return t}a=a||0;for(var u=e.length;u>0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[n,o,a]}}(),function(){r.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(t,{a:t}),t}}(),function(){r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){r.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}}(),function(){r.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e}}(),function(){var e={524:0};r.O.j=function(t){return 0===e[t]};var t=function(t,n){var o,a,s=n[0],i=n[1],l=n[2],c=0;if(s.some((function(t){return 0!==e[t]}))){for(o in i)r.o(i,o)&&(r.m[o]=i[o]);if(l)var u=l(r)}for(t&&t(n);c<s.length;c++)a=s[c],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(u)},n=self["webpackChunkwhatgotdone"]=self["webpackChunkwhatgotdone"]||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))}();var n=r.O(void 0,[504],(function(){return r(5142)}));n=r.O(n)})();
2//# sourceMappingURL=app.f9ce8898.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.