From a8df308a2273114a0d83721018a3b682d67f79b0 Mon Sep 17 00:00:00 2001 From: SohnyBohny Date: Thu, 16 Aug 2018 14:44:25 +0200 Subject: [PATCH 01/10] Create manifest and serviceworker --- public/manifest.json | 20 ++++++++++++ public/serviceworker.js | 68 ++++++++++++++++++++++++++++++++++++++++ templates/base/head.tmpl | 17 ++++++++++ 3 files changed, 105 insertions(+) create mode 100644 public/manifest.json create mode 100644 public/serviceworker.js diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 000000000000..3475cdbf48e2 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,20 @@ +{ + "short_name": "Gitea", + "name": "Gitea - Git with a cup of tea", + "icons": [ + { + "src": "/img/gitea-lg.png", + "type": "image/png", + "sizes": "880x880" + }, + { + "src": "/img/gitea-sm.png", + "type": "image/png", + "sizes": "120x120" + } + ], + "start_url": "/", + "background_color": "#FAFAFA", + "display": "standalone", + "theme_color": "#609926" + } \ No newline at end of file diff --git a/public/serviceworker.js b/public/serviceworker.js new file mode 100644 index 000000000000..a1443d6dd909 --- /dev/null +++ b/public/serviceworker.js @@ -0,0 +1,68 @@ +var STATIC_CACHE = 'static-cache-v1'; +var urlsToCache = [ + // js + '/vendor/plugins/jquery.areyousure/jquery.are-you-sure.js', + '/vendor/plugins/jquery/jquery.min.js', + '/vendor/plugins/semantic/semantic.min.js', + '/js/index.js', // TODO: {{MD5 AppVer}} + '/js/draw.js', + '/vendor/plugins/clipboard/clipboard.min.js', + '/vendor/plugins/gitgraph/gitgraph.js', + '/vendor/plugins/vue/vue.min.js', + '/vendor/plugins/emojify/emojify.min.js', + '/vendor/plugins/cssrelpreload/loadCSS.min.js', + '/vendor/plugins/cssrelpreload/cssrelpreload.min.js', + '/vendor/plugins/dropzone/dropzone.js', + '/vendor/plugins/highlight/highlight.pack.js', + '/vendor/plugins/jquery.datetimepicker/jquery.datetimepicker.js', + '/vendor/plugins/jquery.minicolors/jquery.minicolors.min.js', + '/vendor/plugins/codemirror/addon/mode/loadmode.js', + '/vendor/plugins/codemirror/mode/meta.js', + '/vendor/plugins/simplemde/simplemde.min.js', + + // css + '/vendor/assets/font-awesome/css/font-awesome.min.css', + '/vendor/assets/octicons/octicons.min.css', + '/vendor/plugins/simplemde/simplemde.min.css', + '/vendor/plugins/gitgraph/gitgraph.css', + '/vendor/plugins/tribute/tribute.css', + '/vendor/plugins/semantic/semantic.min.css', + '/css/index.css', // TODO: {{MD5 AppVer}} + '/vendor/plugins/highlight/github.css', + '/vendor/plugins/jquery.minicolors/jquery.minicolors.css', + '/vendor/plugins/jquery.datetimepicker/jquery.datetimepicker.css', + '/vendor/plugins/dropzone/dropzone.css', + // TODO: /css/theme-{{DefaultTheme}}.css + + // img + '/img/gitea-sm.png', + '/img/gitea-lg.png', + + // fonts + '/vendor/plugins/semantic/themes/default/assets/fonts/icons.woff2', + '/vendor/assets/octicons/octicons.woff2' // TODO: ?MD5 +]; + +self.addEventListener('install', function (event) { + // Perform install steps + event.waitUntil( + caches.open(STATIC_CACHE) + .then(function (cache) { + return cache.addAll(urlsToCache); + }) + ); +}); + +self.addEventListener('fetch', function (event) { + event.respondWith( + caches.match(event.request) + .then(function (response) { + // Cache hit - return response + if (response) { + return response; + } + return fetch(event.request); + } + ) + ); +}); diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index a5934149622d..fa6b78c27473 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -5,6 +5,23 @@ {{if .Title}}{{.Title}} - {{end}}{{AppName}} + + + + From cd9dee241510303358d7d4fe4912b48bfe921be6 Mon Sep 17 00:00:00 2001 From: SohnyBohny Date: Tue, 28 Aug 2018 15:41:21 +0200 Subject: [PATCH 02/10] Create templates and add AppSubUrl --- public/serviceworker.js | 68 ------------------- routers/routes/routes.go | 9 +++ .../pwa/manifest_json.tmpl | 4 +- templates/pwa/serviceworker_js.tmpl | 68 +++++++++++++++++++ 4 files changed, 79 insertions(+), 70 deletions(-) delete mode 100644 public/serviceworker.js rename public/manifest.json => templates/pwa/manifest_json.tmpl (82%) create mode 100644 templates/pwa/serviceworker_js.tmpl diff --git a/public/serviceworker.js b/public/serviceworker.js deleted file mode 100644 index a1443d6dd909..000000000000 --- a/public/serviceworker.js +++ /dev/null @@ -1,68 +0,0 @@ -var STATIC_CACHE = 'static-cache-v1'; -var urlsToCache = [ - // js - '/vendor/plugins/jquery.areyousure/jquery.are-you-sure.js', - '/vendor/plugins/jquery/jquery.min.js', - '/vendor/plugins/semantic/semantic.min.js', - '/js/index.js', // TODO: {{MD5 AppVer}} - '/js/draw.js', - '/vendor/plugins/clipboard/clipboard.min.js', - '/vendor/plugins/gitgraph/gitgraph.js', - '/vendor/plugins/vue/vue.min.js', - '/vendor/plugins/emojify/emojify.min.js', - '/vendor/plugins/cssrelpreload/loadCSS.min.js', - '/vendor/plugins/cssrelpreload/cssrelpreload.min.js', - '/vendor/plugins/dropzone/dropzone.js', - '/vendor/plugins/highlight/highlight.pack.js', - '/vendor/plugins/jquery.datetimepicker/jquery.datetimepicker.js', - '/vendor/plugins/jquery.minicolors/jquery.minicolors.min.js', - '/vendor/plugins/codemirror/addon/mode/loadmode.js', - '/vendor/plugins/codemirror/mode/meta.js', - '/vendor/plugins/simplemde/simplemde.min.js', - - // css - '/vendor/assets/font-awesome/css/font-awesome.min.css', - '/vendor/assets/octicons/octicons.min.css', - '/vendor/plugins/simplemde/simplemde.min.css', - '/vendor/plugins/gitgraph/gitgraph.css', - '/vendor/plugins/tribute/tribute.css', - '/vendor/plugins/semantic/semantic.min.css', - '/css/index.css', // TODO: {{MD5 AppVer}} - '/vendor/plugins/highlight/github.css', - '/vendor/plugins/jquery.minicolors/jquery.minicolors.css', - '/vendor/plugins/jquery.datetimepicker/jquery.datetimepicker.css', - '/vendor/plugins/dropzone/dropzone.css', - // TODO: /css/theme-{{DefaultTheme}}.css - - // img - '/img/gitea-sm.png', - '/img/gitea-lg.png', - - // fonts - '/vendor/plugins/semantic/themes/default/assets/fonts/icons.woff2', - '/vendor/assets/octicons/octicons.woff2' // TODO: ?MD5 -]; - -self.addEventListener('install', function (event) { - // Perform install steps - event.waitUntil( - caches.open(STATIC_CACHE) - .then(function (cache) { - return cache.addAll(urlsToCache); - }) - ); -}); - -self.addEventListener('fetch', function (event) { - event.respondWith( - caches.match(event.request) - .then(function (response) { - // Cache hit - return response - if (response) { - return response; - } - return fetch(event.request); - } - ) - ); -}); diff --git a/routers/routes/routes.go b/routers/routes/routes.go index e5476fd22706..51ae4225007c 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -784,6 +784,15 @@ func RegisterRoutes(m *macaron.Macaron) { } }) + // Progressive Web App + m.Get("/manifest.json", templates.JSONRenderer(), func(ctx *macaron.Context) { + ctx.HTML(200, "pwa/manifest_json") + }) + + m.Get("/serviceworker.js", templates.JSRenderer(), func(ctx *macaron.Context) { + ctx.HTML(200, "pwa/serviceworker_js") + }) + // Not found handler. m.NotFound(routers.NotFound) } diff --git a/public/manifest.json b/templates/pwa/manifest_json.tmpl similarity index 82% rename from public/manifest.json rename to templates/pwa/manifest_json.tmpl index 3475cdbf48e2..fe25398c0e5a 100644 --- a/public/manifest.json +++ b/templates/pwa/manifest_json.tmpl @@ -13,8 +13,8 @@ "sizes": "120x120" } ], - "start_url": "/", + "start_url": "{{AppSubUrl}}/", "background_color": "#FAFAFA", "display": "standalone", - "theme_color": "#609926" + "theme_color": "{{ThemeColorMetaTag}}" } \ No newline at end of file diff --git a/templates/pwa/serviceworker_js.tmpl b/templates/pwa/serviceworker_js.tmpl new file mode 100644 index 000000000000..50cb73620a5d --- /dev/null +++ b/templates/pwa/serviceworker_js.tmpl @@ -0,0 +1,68 @@ +var STATIC_CACHE = 'static-cache-v1'; +var urlsToCache = [ + // js + '{{AppSubUrl}}/vendor/plugins/jquery.areyousure/jquery.are-you-sure.js', + '{{AppSubUrl}}/vendor/plugins/jquery/jquery.min.js', + '{{AppSubUrl}}/vendor/plugins/semantic/semantic.min.js', + '{{AppSubUrl}}/js/index.js?v={{MD5 AppVer}}', + '{{AppSubUrl}}/js/draw.js', + '{{AppSubUrl}}/vendor/plugins/clipboard/clipboard.min.js', + '{{AppSubUrl}}/vendor/plugins/gitgraph/gitgraph.js', + '{{AppSubUrl}}/vendor/plugins/vue/vue.min.js', + '{{AppSubUrl}}/vendor/plugins/emojify/emojify.min.js', + '{{AppSubUrl}}/vendor/plugins/cssrelpreload/loadCSS.min.js', + '{{AppSubUrl}}/vendor/plugins/cssrelpreload/cssrelpreload.min.js', + '{{AppSubUrl}}/vendor/plugins/dropzone/dropzone.js', + '{{AppSubUrl}}/vendor/plugins/highlight/highlight.pack.js', + '{{AppSubUrl}}/vendor/plugins/jquery.datetimepicker/jquery.datetimepicker.js', + '{{AppSubUrl}}/vendor/plugins/jquery.minicolors/jquery.minicolors.min.js', + '{{AppSubUrl}}/vendor/plugins/codemirror/addon/mode/loadmode.js', + '{{AppSubUrl}}/vendor/plugins/codemirror/mode/meta.js', + '{{AppSubUrl}}/vendor/plugins/simplemde/simplemde.min.js', + + // css + '{{AppSubUrl}}/vendor/assets/font-awesome/css/font-awesome.min.css', + '{{AppSubUrl}}/vendor/assets/octicons/octicons.min.css', + '{{AppSubUrl}}/vendor/plugins/simplemde/simplemde.min.css', + '{{AppSubUrl}}/vendor/plugins/gitgraph/gitgraph.css', + '{{AppSubUrl}}/vendor/plugins/tribute/tribute.css', + '{{AppSubUrl}}/vendor/plugins/semantic/semantic.min.css', + '{{AppSubUrl}}/css/index.css?v={{MD5 AppVer}}', + '{{AppSubUrl}}/vendor/plugins/highlight/github.css', + '{{AppSubUrl}}/vendor/plugins/jquery.minicolors/jquery.minicolors.css', + '{{AppSubUrl}}/vendor/plugins/jquery.datetimepicker/jquery.datetimepicker.css', + '{{AppSubUrl}}/vendor/plugins/dropzone/dropzone.css', + '/css/theme-{{DefaultTheme}}.css', + + // img + '{{AppSubUrl}}/img/gitea-sm.png', + '{{AppSubUrl}}/img/gitea-lg.png', + + // fonts + '{{AppSubUrl}}/vendor/plugins/semantic/themes/default/assets/fonts/icons.woff2', + '{{AppSubUrl}}/vendor/assets/octicons/octicons.woff2' // TODO: ?MD5 +]; + +self.addEventListener('install', function (event) { + // Perform install steps + event.waitUntil( + caches.open(STATIC_CACHE) + .then(function (cache) { + return cache.addAll(urlsToCache); + }) + ); +}); + +self.addEventListener('fetch', function (event) { + event.respondWith( + caches.match(event.request) + .then(function (response) { + // Cache hit - return response + if (response) { + return response; + } + return fetch(event.request); + } + ) + ); +}); From 120ed02ca4f3e0bd06f466ea9a528296c15f2bc0 Mon Sep 17 00:00:00 2001 From: SohnyBohny Date: Tue, 28 Aug 2018 15:47:23 +0200 Subject: [PATCH 03/10] Add JSRenderer --- modules/templates/dynamic.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/templates/dynamic.go b/modules/templates/dynamic.go index d70a465c1cda..dbd75221d22c 100644 --- a/modules/templates/dynamic.go +++ b/modules/templates/dynamic.go @@ -45,6 +45,18 @@ func JSONRenderer() macaron.Handler { }) } +// JSRenderer implements the macaron handler for serving JS templates. +func JSRenderer() macaron.Handler { + return macaron.Renderer(macaron.RenderOptions{ + Funcs: NewFuncMap(), + Directory: path.Join(setting.StaticRootPath, "templates"), + AppendDirectories: []string{ + path.Join(setting.CustomPath, "templates"), + }, + HTMLContentType: "application/javascript", + }) +} + // Mailer provides the templates required for sending notification mails. func Mailer() *template.Template { for _, funcs := range NewFuncMap() { From 928622eee2fe5ef1755cca5ca247bf38459d985f Mon Sep 17 00:00:00 2001 From: SohnyBohny Date: Tue, 28 Aug 2018 16:13:10 +0200 Subject: [PATCH 04/10] fix ctx type --- routers/routes/routes.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 51ae4225007c..9ea57bfe84cc 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -785,13 +785,13 @@ func RegisterRoutes(m *macaron.Macaron) { }) // Progressive Web App - m.Get("/manifest.json", templates.JSONRenderer(), func(ctx *macaron.Context) { + m.Get("/manifest.json", templates.JSONRenderer(), func(ctx *context.Context) { ctx.HTML(200, "pwa/manifest_json") }) - - m.Get("/serviceworker.js", templates.JSRenderer(), func(ctx *macaron.Context) { + + m.Get("/serviceworker.js", templates.JSRenderer(), func(ctx *context.Context) { ctx.HTML(200, "pwa/serviceworker_js") - }) + }) // Not found handler. m.NotFound(routers.NotFound) From 141fa12fe80128344b7aba83b4315c16f1314398 Mon Sep 17 00:00:00 2001 From: SohnyBohny Date: Tue, 28 Aug 2018 16:39:31 +0200 Subject: [PATCH 05/10] Add JSRenderer to static.go --- modules/templates/static.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/templates/static.go b/modules/templates/static.go index 6fd4d245e16e..e69e1cae4815 100644 --- a/modules/templates/static.go +++ b/modules/templates/static.go @@ -129,6 +129,15 @@ func JSONRenderer() macaron.Handler { }) } +// JSRenderer implements the macaron handler for serving JS templates. +func JSRenderer() macaron.Handler { + return macaron.Renderer(macaron.RenderOptions{ + Funcs: NewFuncMap(), + TemplateFileSystem: NewTemplateFileSystem(), + HTMLContentType: "application/javascript", + }) +} + // Mailer provides the templates required for sending notification mails. func Mailer() *template.Template { for _, funcs := range NewFuncMap() { From b7548dbb650f04fed935eb755b5c1aa9c57b195a Mon Sep 17 00:00:00 2001 From: SohnyBohny Date: Mon, 29 Oct 2018 11:52:39 +0100 Subject: [PATCH 06/10] Complete adding {{AppSubUrl}} --- templates/base/head.tmpl | 4 ++-- templates/pwa/manifest_json.tmpl | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index cff7c48711d7..ad2714906542 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -5,12 +5,12 @@ {{if .Title}}{{.Title}} - {{end}}{{AppName}} - +