{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":45704206,"defaultBranch":"main","name":"territory-bro","ownerLogin":"luontola","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2015-11-06T19:57:13.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/42678?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1710798293.0","currentOid":""},"activityList":{"items":[{"before":"6bc70bebc00a2b5de58b14d0e91b34bacb93e9f0","after":"93227f56ffe775b1cf8f20ffa7a4ac9894203bd8","ref":"refs/heads/main","pushedAt":"2024-05-12T19:09:30.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ—๏ธ Scan the classpath for resources with content-hashed filenames\n\nWhy:\n- The UI must use public assets such as images, but their filenames are\n content-hashed to improve caching, so the UI doesn't know their exact\n filenames.\n- The current solution scans the classpath for public assets on startup.\n This will be very fast at runtime, because it's just a hashmap lookup.\n But the disadvantage is that during development new and updated assets\n are not included automatically. Hopefully the assets are changed\n seldom enough for it to not become a problem, or the solution needs to\n be made more complicated.","shortMessageHtmlLink":"๐Ÿ—๏ธ Scan the classpath for resources with content-hashed filenames"}},{"before":"9069d4d5711da5b1c3a0aaf1bc4e37190abf8775","after":"6bc70bebc00a2b5de58b14d0e91b34bacb93e9f0","ref":"refs/heads/main","pushedAt":"2024-05-12T11:42:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿšธ Tell 1Password to ignore the user ID field\n\nWhy:\n- 1Password offered to fill the user ID field, presumably due to its\n name. But since that field is for adding other users instead of\n logging in, password managers should ignore it.","shortMessageHtmlLink":"๐Ÿšธ Tell 1Password to ignore the user ID field"}},{"before":"f760c606e920f6c1682b508ccab8df0ec432c937","after":"9069d4d5711da5b1c3a0aaf1bc4e37190abf8775","ref":"refs/heads/main","pushedAt":"2024-05-12T11:26:45.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โ™ป๏ธ Extract territory-bro.ui.forms/validation-error-{page,htmx}-response\n\nWhy:\n- Remove duplication of form validation error responses.\n- Support throwing ValidationException directly, instead of wrapping it\n in a ring.util.http-response/bad-request!","shortMessageHtmlLink":"โ™ป๏ธ Extract territory-bro.ui.forms/validation-error-{page,htmx}-response"}},{"before":"3e7bdfe5e7270c33c5bd3440c0c588cc7749e2b3","after":"f760c606e920f6c1682b508ccab8df0ec432c937","ref":"refs/heads/main","pushedAt":"2024-05-01T14:12:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ’ก Link to reported htmx issue","shortMessageHtmlLink":"๐Ÿ’ก Link to reported htmx issue"}},{"before":"ffdda2cf02266a2ef2f5d99c1d24a137fef4c45d","after":"3e7bdfe5e7270c33c5bd3440c0c588cc7749e2b3","ref":"refs/heads/main","pushedAt":"2024-05-01T12:25:29.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœ… Test user sorting order","shortMessageHtmlLink":"โœ… Test user sorting order"}},{"before":"75541155d9a29d271386cfb0160fe98d2db23880","after":"ffdda2cf02266a2ef2f5d99c1d24a137fef4c45d","ref":"refs/heads/main","pushedAt":"2024-04-28T15:57:05.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โ™ป๏ธ Trim only once, in the controller\n\nWhy:\n- The trim is needed just because the form field's patterns allows\n surrounding whitespace (to make copy-pasting easier). That's why only\n the controller should be aware of the need to trim.","shortMessageHtmlLink":"โ™ป๏ธ Trim only once, in the controller"}},{"before":"e6ef7362ff45441fa7e25fd62101fa2bdc204b10","after":"75541155d9a29d271386cfb0160fe98d2db23880","ref":"refs/heads/main","pushedAt":"2024-04-28T10:16:09.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœจ List users\n\nWhy:\n- Continuing the migration from SPA to SSR.","shortMessageHtmlLink":"โœจ List users"}},{"before":"a7d5020055cad27d389777da839d70937005a386","after":"e6ef7362ff45441fa7e25fd62101fa2bdc204b10","ref":"refs/heads/main","pushedAt":"2024-04-22T19:17:19.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ”ง Change Hiccup defaults to generate HTML instead of XHTML\n\nWhy:\n- The page uses HTML5 but Hiccup generates XHTML by default. After this\n change we'll get `required` instead of `required=\"required\"` attributes.\n- Using router middleware would have been possible, but then tests would\n not have been affected. It's simpler to change the default globally on\n application startup.","shortMessageHtmlLink":"๐Ÿ”ง Change Hiccup defaults to generate HTML instead of XHTML"}},{"before":"f949dfc5a5a389819817e459c4233ea7ca971e33","after":"a7d5020055cad27d389777da839d70937005a386","ref":"refs/heads/main","pushedAt":"2024-04-14T19:38:23.000Z","pushType":"push","commitsCount":8,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿšง Settings page: HTML structure and i18n only\n\nWhy:\n- Continuing the migration from SPA to SSR.","shortMessageHtmlLink":"๐Ÿšง Settings page: HTML structure and i18n only"}},{"before":"b49735b63a51c018d6fa380435bac8928b68df49","after":"f949dfc5a5a389819817e459c4233ea7ca971e33","ref":"refs/heads/main","pushedAt":"2024-04-08T18:55:20.000Z","pushType":"push","commitsCount":10,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ”ง Update project files\n\nWhy:\n- Upgraded to IntelliJ IDEA 2024.1","shortMessageHtmlLink":"๐Ÿ”ง Update project files"}},{"before":"d2080b06a6a2f1439d43134b70df7316620f7fe9","after":"b49735b63a51c018d6fa380435bac8928b68df49","ref":"refs/heads/main","pushedAt":"2024-03-24T15:26:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœจ Sync territory list map to search\n\nWhy:\n- Continuing the migration from SPA to SSR.","shortMessageHtmlLink":"โœจ Sync territory list map to search"}},{"before":"4d7fd1bf626081635024f595743a315e987f8832","after":"d2080b06a6a2f1439d43134b70df7316620f7fe9","ref":"refs/heads/main","pushedAt":"2024-03-23T20:27:46.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โšก๏ธ Lazy load territory loans\n\nWhy:\n- The current MVP fetches territory loans from Google Sheets, which can\n easily take a couple of seconds.\n- Lazy loading the loans enables showing the territory list page\n immediately, and the map will show up a couple seconds later.\n- Lazy loading is not needed when a congregation is not using the loans\n feature. In those cases the map can be rendered immediately to avoid\n flashing the placeholder image.\n- Alternatively, instead of a placeholder, we could render the map\n without loans data. It was decided to not do that, because it causes\n the map to flash when it's replaced by the final map.\n- This commit also parameterizes the congregation API with whether to\n fetch loans or not. This improves performance on every page, because\n even the layout reads the congregation, but it doesn't need the loans.\n- The htmx component URL for the map conflicts with viewing a territory.\n An alternative to avoid the conflict would be to change the map\n component's URL to e.g. \"/congregation/:congregation/territories-map\",\n but then we could not link to it easily with `html/*page-path*`.","shortMessageHtmlLink":"โšก๏ธ Lazy load territory loans"}},{"before":"4d6d47fe58cf24957fc509d19946a1ac649f6218","after":"4d7fd1bf626081635024f595743a315e987f8832","ref":"refs/heads/main","pushedAt":"2024-03-23T13:37:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ› Handle it gracefully if has no data\n\nWhy:\n- Previously the map setup would throw an exception, and the user would\n see only a big empty space. Now the map will fall back to showing the\n world map.","shortMessageHtmlLink":"๐Ÿ› Handle it gracefully if <territory-list-map> has no data"}},{"before":"810319771663e72acb73a1b991555c665881aa47","after":"4d6d47fe58cf24957fc509d19946a1ac649f6218","ref":"refs/heads/main","pushedAt":"2024-03-23T13:13:54.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœจ Territory list map\n\nWhy:\n- Continuing the migration from SPA to SSR.","shortMessageHtmlLink":"โœจ Territory list map"}},{"before":"5c8043d8d24cf7d781f27c9b1e37348d3e9385fd","after":"810319771663e72acb73a1b991555c665881aa47","ref":"refs/heads/main","pushedAt":"2024-03-23T13:13:12.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœจ Territory list map\n\nWhy:\n- Continuing the migration from SPA to SSR.","shortMessageHtmlLink":"โœจ Territory list map"}},{"before":"258024a2730cd38a9668c072ea267a018bbf925d","after":"5c8043d8d24cf7d781f27c9b1e37348d3e9385fd","ref":"refs/heads/main","pushedAt":"2024-03-21T22:13:06.000Z","pushType":"push","commitsCount":11,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ› Fix too many open files\n\nWhy:\n- The call to java.net.URLConnection#getLastModified() leaked resources,\n even though URLConnection doesn't have a close() method. Its\n documentation says:\n \"Invoking the close() methods on the InputStream or OutputStream of\n an URLConnection after a request may free network resources\n associated with this instance, unless particular protocol\n specifications specify different behaviours for it.\"\n- After the test runner and REPL had been on for days, Jetty started\n giving \"java.io.IOException: Too many open files\" errors. Inspecting\n the open files in Activity Monitor revealed lots of instances of files\n managed by the auto-refresher (e.g. i18n.json and the HugSQL files).\n\nExample error:\n\n2024-03-21 23:29:18,262 [qtp285145040-47-acceptor-1@323bdab7-ServerConnector@1e0a9b1a{HTTP/1.1, (http/1.1)}{0.0.0.0:8081}] WARN o.e.jetty.server.AbstractConnector - Accept Failure\njava.io.IOException: Too many open files\n\tat java.base/sun.nio.ch.Net.accept(Native Method)\n\tat java.base/sun.nio.ch.ServerSocketChannelImpl.implAccept(ServerSocketChannelImpl.java:425)\n\tat java.base/sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:391)\n\tat org.eclipse.jetty.server.ServerConnector.accept(ServerConnector.java:409)\n\tat org.eclipse.jetty.server.AbstractConnector$Acceptor.run(AbstractConnector.java:748)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)\n\tat java.base/java.lang.Thread.run(Thread.java:840)","shortMessageHtmlLink":"๐Ÿ› Fix too many open files"}},{"before":"b1b846da930a656d032b2171e9848923c77944b7","after":"258024a2730cd38a9668c072ea267a018bbf925d","ref":"refs/heads/main","pushedAt":"2024-03-18T21:33:25.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ› Prompt for Google account instead of choosing the same every time\n\nWhy:\n- If you logged in once with a Google account, then Auth0 would keep\n using that same account on subsequent logins. This fixes that so that\n it'll give you the list of Google accounts to choose from.\n https://community.auth0.com/t/how-do-i-force-the-universal-login-to-allow-the-user-to-select-a-gmail-account/72655/11\n https://community.auth0.com/t/allow-user-using-google-oauth2-authentication-to-pick-google-account-do-not-sign-in-automatically/64331\n https://developers.google.com/identity/openid-connect/openid-connect#prompt\n- Facebook login has the same problem. There is no known fix.\n https://github.com/auth0/Auth0.Android/issues/604","shortMessageHtmlLink":"๐Ÿ› Prompt for Google account instead of choosing the same every time"}},{"before":"311b424004503b0aab75263d8d2bb4ef3547ca78","after":"b1b846da930a656d032b2171e9848923c77944b7","ref":"refs/heads/main","pushedAt":"2024-03-18T21:22:54.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ› Prompt for Google account instead of choosing the same every time\n\nWhy:\n- If you logged in once with a Google account, then Auth0 would keep\n using that same account on subsequent logins. This fixes that so that\n it'll give you the list of Google accounts to choose from.\n https://community.auth0.com/t/how-do-i-force-the-universal-login-to-allow-the-user-to-select-a-gmail-account/72655/11\n https://community.auth0.com/t/allow-user-using-google-oauth2-authentication-to-pick-google-account-do-not-sign-in-automatically/64331\n https://developers.google.com/identity/openid-connect/openid-connect#prompt\n- Facebook login has the same problem. There is no known fix.\n https://github.com/auth0/Auth0.Android/issues/604","shortMessageHtmlLink":"๐Ÿ› Prompt for Google account instead of choosing the same every time"}},{"before":"4bd3a7f26fb77707f0ed31a58b33fc944b85a539","after":"311b424004503b0aab75263d8d2bb4ef3547ca78","ref":"refs/heads/main","pushedAt":"2024-03-16T20:11:46.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿงน Cleanup: outdated TODO comment\n\nWhy:\n- The browser tests are covering that copy to clipboard works.","shortMessageHtmlLink":"๐Ÿงน Cleanup: outdated TODO comment"}},{"before":"be38ab874cad3a44ffc887ceb13d2961a37538d3","after":"4bd3a7f26fb77707f0ed31a58b33fc944b85a539","ref":"refs/heads/main","pushedAt":"2024-03-16T20:03:14.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿšจ Fix nested CSS warning\n\nWhy:\n- Starting a nested selector with an identifier is not allowed.\n The workaround is to wrap it in an \":is(...)\".\n https://www.w3.org/TR/css-nesting-1/#example-34e8e94f\n- Fixes the following warning during \"npm run build\":\n\nwarnings when minifying css:\nโ–ฒ [WARNING] A nested style rule cannot start with \"th\" because it looks\nlike the start of a declaration [css-syntax-error]\n\n :1656:4:\n 1656 โ”‚ th, td {\n โ”‚ ~~\n โ•ต :is(th)\n\n To start a nested style rule with an identifier, you need to wrap the\n identifier in \":is(...)\" to prevent the rule from being parsed as a\n declaration.","shortMessageHtmlLink":"๐Ÿšจ Fix nested CSS warning"}},{"before":"9e09e9e662f30231e36fefd74d3a6413f053a312","after":"be38ab874cad3a44ffc887ceb13d2961a37538d3","ref":"refs/heads/main","pushedAt":"2024-03-16T19:15:40.000Z","pushType":"push","commitsCount":11,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โ™ป๏ธ Set the language cookie automatically when it's missing\n\nWhy:\n- Simplifies the logic of when to set the cookie. We just set it always\n when it's different from the current language.\n- Avoids parsing the Accept-Language header and matching it with the\n available languages, saving about 0.2 milliseconds.","shortMessageHtmlLink":"โ™ป๏ธ Set the language cookie automatically when it's missing"}},{"before":"754fcc78c0a89f45267785a73c8cf12f8ea9eead","after":"9e09e9e662f30231e36fefd74d3a6413f053a312","ref":"refs/heads/main","pushedAt":"2024-03-11T18:45:32.000Z","pushType":"push","commitsCount":8,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœ… Ignore minor differences between the SPA and SSR sites, part 2\n\nWhy:\n- The :fn/has-text matcher didn't work for the SPA site, but only for\n the SSR site. The etaoin documentation doesn't document all the\n clauses, but from etaoin.impl.xpath we can find more, such as\n :fn/has-string which works for both sites.\n- :fn/has-string uses the XPath string() function, which returns the\n concatenation of all the text-node descendents of an element.\n- :fn/text and :fn/has-text both use the XPath text() function, which\n selects the text-nodes but does not concatenate them.","shortMessageHtmlLink":"โœ… Ignore minor differences between the SPA and SSR sites, part 2"}},{"before":"fe2e2adf7d965848dac6f24fb73dedea70c94490","after":"754fcc78c0a89f45267785a73c8cf12f8ea9eead","ref":"refs/heads/main","pushedAt":"2024-03-10T20:38:34.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿšง Set localhost:8081 as the public URL using middleware\n\nWhy:\n- Removes duplicate 8080/8081 replacements.","shortMessageHtmlLink":"๐Ÿšง Set localhost:8081 as the public URL using middleware"}},{"before":"9941e802f36b08762e793b2a3c78fbd2ca34de1f","after":"fe2e2adf7d965848dac6f24fb73dedea70c94490","ref":"refs/heads/main","pushedAt":"2024-03-10T17:24:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœจ Open shares\n\nWhy:\n- Continuing the migration from SPA to SSR.\n- This is a shallow adapter for the old API layer. Currently only the\n browser tests cover this code. After removing the old API layer,\n migrate its tests (territory-bro.api-test/share-territory-link-test\n and territory-bro.api-test/share-demo-territory-link-test) to be\n written against territory-bro.ui.open-share-page.","shortMessageHtmlLink":"โœจ Open shares"}},{"before":"19a21fb31c23b9cd00ebe71d63d16aff6f4c49f4","after":"9941e802f36b08762e793b2a3c78fbd2ca34de1f","ref":"refs/heads/main","pushedAt":"2024-03-09T13:00:59.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ› Don't cache share links if the user changes the language\n\nWhy:\n- Previously the UI would keep showing the opened share-link in the\n previously selected language, if the user changed the language and\n clicked the share button a second time. Adding a cache buster with the\n current language to the URL solves it.","shortMessageHtmlLink":"๐Ÿ› Don't cache share links if the user changes the language"}},{"before":"19f26b06fd9a6de979ff9dd07a4f27ad12d4c3b5","after":"19a21fb31c23b9cd00ebe71d63d16aff6f4c49f4","ref":"refs/heads/main","pushedAt":"2024-03-07T21:54:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœ… Browser test for sharing a link to a territory\n\nWhy:\n- Continuing the migration from SPA to SSR.\n- The SSR will need to match the SPA's features. Currently this test\n fails for SSR.\n- Could not find a way to test that copying to clipboard works. The\n browser prevents JavaScript from reading clipboard contents, and\n WebDriver doesn't offer an API for reading the clipboard.\n- After we have tests for registering a congregation, we can use that as\n test data for the other browser tests. Until then, the developer user\n is assumed to already have a congregation with territories.","shortMessageHtmlLink":"โœ… Browser test for sharing a link to a territory"}},{"before":"67632e9faaf74c0f5173de20f63866a5e6173bb4","after":"19f26b06fd9a6de979ff9dd07a4f27ad12d4c3b5","ref":"refs/heads/main","pushedAt":"2024-03-06T19:37:28.000Z","pushType":"push","commitsCount":7,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โ™ป๏ธ Write permission tests at the page instead of component level\n\nWhy:\n- It will be easier to test all permissions on vs off once at the top\n level, instead of checking them for each component. Especially so,\n when the components don't contain complex permission logic, but we\n just hide the action buttons.","shortMessageHtmlLink":"โ™ป๏ธ Write permission tests at the page instead of component level"}},{"before":"e030d3daef69cd3cb5a915bcf9cd598ae3a3fa40","after":"67632e9faaf74c0f5173de20f63866a5e6173bb4","ref":"refs/heads/main","pushedAt":"2024-03-02T19:38:10.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"๐Ÿ› Fix crash for htmx requests\n\nWhy:\n- Since the htmx responses return partial views, they will be hiccup raw\n strings, so the html response must be converted to a native string.","shortMessageHtmlLink":"๐Ÿ› Fix crash for htmx requests"}},{"before":"492edd1d6424935f2b0121a814dd06968e8ed68b","after":"e030d3daef69cd3cb5a915bcf9cd598ae3a3fa40","ref":"refs/heads/main","pushedAt":"2024-03-02T19:29:21.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โ™ป๏ธ Parse page title from the page content,

element\n\nWhy:\n- Removes duplication, allows removing the opts parameter, and better\n supports localized page titles.\n- Also reordered parameters to better support threading macros.","shortMessageHtmlLink":"โ™ป๏ธ Parse page title from the page content, <h1> element"}},{"before":"d02c30a0c94a5ba1a98d236f38ece8b982a6494b","after":"492edd1d6424935f2b0121a814dd06968e8ed68b","ref":"refs/heads/main","pushedAt":"2024-03-02T17:03:02.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"luontola","name":"Esko Luontola","path":"/luontola","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/42678?s=80&v=4"},"commit":{"message":"โœ… Fix flaky test\n\nWhy:\n- This test failed once with \"no such element\"","shortMessageHtmlLink":"โœ… Fix flaky test"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAER82rJQA","startCursor":null,"endCursor":null}},"title":"Activity ยท luontola/territory-bro"}