mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-03-31 13:45:09 +00:00
commit
a5332890bc
@ -38,6 +38,7 @@ object RestServer {
|
|||||||
"/api/doc" -> templates.doc,
|
"/api/doc" -> templates.doc,
|
||||||
"/app/assets" -> WebjarRoutes.appRoutes[F](pools.blocker),
|
"/app/assets" -> WebjarRoutes.appRoutes[F](pools.blocker),
|
||||||
"/app" -> templates.app,
|
"/app" -> templates.app,
|
||||||
|
"/sw.js" -> templates.serviceWorker,
|
||||||
"/" -> redirectTo("/app")
|
"/" -> redirectTo("/app")
|
||||||
).orNotFound
|
).orNotFound
|
||||||
|
|
||||||
|
@ -21,11 +21,13 @@ import yamusca.imports._
|
|||||||
object TemplateRoutes {
|
object TemplateRoutes {
|
||||||
private[this] val logger = getLogger
|
private[this] val logger = getLogger
|
||||||
|
|
||||||
val `text/html` = new MediaType("text", "html")
|
val `text/html` = new MediaType("text", "html")
|
||||||
|
val `application/javascript` = new MediaType("application", "javascript")
|
||||||
|
|
||||||
trait InnerRoutes[F[_]] {
|
trait InnerRoutes[F[_]] {
|
||||||
def doc: HttpRoutes[F]
|
def doc: HttpRoutes[F]
|
||||||
def app: HttpRoutes[F]
|
def app: HttpRoutes[F]
|
||||||
|
def serviceWorker: HttpRoutes[F]
|
||||||
}
|
}
|
||||||
|
|
||||||
def apply[F[_]: Effect](blocker: Blocker, cfg: Config)(implicit
|
def apply[F[_]: Effect](blocker: Blocker, cfg: Config)(implicit
|
||||||
@ -35,6 +37,7 @@ object TemplateRoutes {
|
|||||||
loadResource("/index.html").flatMap(loadTemplate(_, blocker))
|
loadResource("/index.html").flatMap(loadTemplate(_, blocker))
|
||||||
)
|
)
|
||||||
val docTemplate = memo(loadResource("/doc.html").flatMap(loadTemplate(_, blocker)))
|
val docTemplate = memo(loadResource("/doc.html").flatMap(loadTemplate(_, blocker)))
|
||||||
|
val swTemplate = memo(loadResource("/sw.js").flatMap(loadTemplate(_, blocker)))
|
||||||
|
|
||||||
val dsl = new Http4sDsl[F] {}
|
val dsl = new Http4sDsl[F] {}
|
||||||
import dsl._
|
import dsl._
|
||||||
@ -43,14 +46,31 @@ object TemplateRoutes {
|
|||||||
HttpRoutes.of[F] { case GET -> Root =>
|
HttpRoutes.of[F] { case GET -> Root =>
|
||||||
for {
|
for {
|
||||||
templ <- docTemplate
|
templ <- docTemplate
|
||||||
resp <- Ok(DocData().render(templ), `Content-Type`(`text/html`))
|
resp <- Ok(
|
||||||
|
DocData().render(templ),
|
||||||
|
`Content-Type`(`text/html`, Charset.`UTF-8`)
|
||||||
|
)
|
||||||
} yield resp
|
} yield resp
|
||||||
}
|
}
|
||||||
def app =
|
def app =
|
||||||
HttpRoutes.of[F] { case GET -> _ =>
|
HttpRoutes.of[F] { case GET -> _ =>
|
||||||
for {
|
for {
|
||||||
templ <- indexTemplate
|
templ <- indexTemplate
|
||||||
resp <- Ok(IndexData(cfg).render(templ), `Content-Type`(`text/html`))
|
resp <- Ok(
|
||||||
|
IndexData(cfg).render(templ),
|
||||||
|
`Content-Type`(`text/html`, Charset.`UTF-8`)
|
||||||
|
)
|
||||||
|
} yield resp
|
||||||
|
}
|
||||||
|
|
||||||
|
def serviceWorker =
|
||||||
|
HttpRoutes.of[F] { case GET -> _ =>
|
||||||
|
for {
|
||||||
|
templ <- swTemplate
|
||||||
|
resp <- Ok(
|
||||||
|
IndexData(cfg).render(templ),
|
||||||
|
`Content-Type`(`application/javascript`, Charset.`UTF-8`)
|
||||||
|
)
|
||||||
} yield resp
|
} yield resp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,13 @@
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script type="application/javascript" src="{{appExtraJs}}"></script>
|
<script type="application/javascript" src="{{appExtraJs}}"></script>
|
||||||
|
<script>
|
||||||
|
if('serviceWorker' in navigator) {
|
||||||
|
navigator.serviceWorker
|
||||||
|
.register('/sw.js')
|
||||||
|
.then(function() { console.log("Service Worker Registered"); });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
37
modules/restserver/src/main/templates/sw.js
Normal file
37
modules/restserver/src/main/templates/sw.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// use a cacheName for cache versioning
|
||||||
|
var cacheName = 'v1:static';
|
||||||
|
|
||||||
|
// during the install phase you usually want to cache static assets
|
||||||
|
self.addEventListener('install', function(e) {
|
||||||
|
// once the SW is installed, go ahead and fetch the resources to make this work offline
|
||||||
|
e.waitUntil(
|
||||||
|
caches.open(cacheName).then(function(cache) {
|
||||||
|
return cache.addAll([
|
||||||
|
{{# cssUrls }}
|
||||||
|
'{{.}}',
|
||||||
|
{{/ cssUrls }}
|
||||||
|
{{# jsUrls }}
|
||||||
|
'{{.}}',
|
||||||
|
{{/ jsUrls}}
|
||||||
|
'{{appExtraJs}}'
|
||||||
|
]).then(function() {
|
||||||
|
self.skipWaiting();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// when the browser fetches a url
|
||||||
|
self.addEventListener('fetch', function(event) {
|
||||||
|
// either respond with the cached object or go ahead and fetch the actual url
|
||||||
|
event.respondWith(
|
||||||
|
caches.match(event.request).then(function(response) {
|
||||||
|
if (response) {
|
||||||
|
// retrieve from cache
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
// fetch as normal
|
||||||
|
return fetch(event.request);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
@ -87,6 +87,7 @@ view current flags settings model =
|
|||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
[ ( "sixteen wide column", True )
|
[ ( "sixteen wide column", True )
|
||||||
|
, ( "hidden invisible", resultsBelowLimit settings model )
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
[ div [ class "ui basic center aligned segment" ]
|
[ div [ class "ui basic center aligned segment" ]
|
||||||
@ -94,7 +95,6 @@ view current flags settings model =
|
|||||||
[ classList
|
[ classList
|
||||||
[ ( "ui basic tiny button", True )
|
[ ( "ui basic tiny button", True )
|
||||||
, ( "disabled", not model.moreAvailable )
|
, ( "disabled", not model.moreAvailable )
|
||||||
, ( "hidden invisible", resultsBelowLimit settings model )
|
|
||||||
]
|
]
|
||||||
, disabled (not model.moreAvailable || model.moreInProgress || model.searchInProgress)
|
, disabled (not model.moreAvailable || model.moreInProgress || model.searchInProgress)
|
||||||
, title "Load more items"
|
, title "Load more items"
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
}
|
}
|
||||||
.default-layout {
|
.default-layout {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
/* height: 100vh; */
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.default-layout .main-content {
|
.default-layout .main-content {
|
||||||
@ -253,7 +253,10 @@ label span.muted {
|
|||||||
|
|
||||||
.login-layout, .register-layout, .newinvite-layout {
|
.login-layout, .register-layout, .newinvite-layout {
|
||||||
background: #708090;
|
background: #708090;
|
||||||
height: 101vh;
|
height: 100%;
|
||||||
|
}
|
||||||
|
.login-layout > .ui.footer, .register-layout > .ui.footer, .newinvite-layout > .ui.footer {
|
||||||
|
background: #708090;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-layout .login-view, .register-layout .register-view, .newinvite-view {
|
.login-layout .login-view, .register-layout .register-view, .newinvite-view {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user