From 294904321cb6de535237a6a156d5c4ec462bc117 Mon Sep 17 00:00:00 2001 From: SohnyBohny Date: Tue, 27 Nov 2018 16:18:26 +0100 Subject: [PATCH] Create Progressive Web App (#4730) * Create manifest and serviceworker * Create templates and add AppSubUrl * Add JSRenderer * fix ctx type * Add JSRenderer to static.go * Complete adding {{AppSubUrl}} * Add more fonts to urlsToCache * Add 512px and 192px icons * Hardcode font MD5 * Default theme doesn't have a specific CSS file --- Makefile | 2 + modules/templates/dynamic.go | 12 +++++ modules/templates/static.go | 9 ++++ public/img/gitea-192.png | Bin 0 -> 8738 bytes public/img/gitea-512.png | Bin 0 -> 25737 bytes routers/routes/routes.go | 9 ++++ templates/base/head.tmpl | 17 +++++++ templates/pwa/manifest_json.tmpl | 31 ++++++++++++ templates/pwa/serviceworker_js.tmpl | 72 ++++++++++++++++++++++++++++ 9 files changed, 152 insertions(+) create mode 100644 public/img/gitea-192.png create mode 100644 public/img/gitea-512.png create mode 100644 templates/pwa/manifest_json.tmpl create mode 100644 templates/pwa/serviceworker_js.tmpl diff --git a/Makefile b/Makefile index 6f3779e30b..5e7e72df0b 100644 --- a/Makefile +++ b/Makefile @@ -347,6 +347,8 @@ update-translations: generate-images: mkdir -p $(TMPDIR)/images inkscape -f $(PWD)/assets/logo.svg -w 880 -h 880 -e $(PWD)/public/img/gitea-lg.png + inkscape -f $(PWD)/assets/logo.svg -w 512 -h 512 -e $(PWD)/public/img/gitea-512.png + inkscape -f $(PWD)/assets/logo.svg -w 192 -h 192 -e $(PWD)/public/img/gitea-192.png inkscape -f $(PWD)/assets/logo.svg -w 120 -h 120 -jC -i layer1 -e $(TMPDIR)/images/sm-1.png inkscape -f $(PWD)/assets/logo.svg -w 120 -h 120 -jC -i layer2 -e $(TMPDIR)/images/sm-2.png composite -compose atop $(TMPDIR)/images/sm-2.png $(TMPDIR)/images/sm-1.png $(PWD)/public/img/gitea-sm.png diff --git a/modules/templates/dynamic.go b/modules/templates/dynamic.go index d70a465c1c..dbd75221d2 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() { diff --git a/modules/templates/static.go b/modules/templates/static.go index 6fd4d245e1..e69e1cae48 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() { diff --git a/public/img/gitea-192.png b/public/img/gitea-192.png new file mode 100644 index 0000000000000000000000000000000000000000..63f963e846a9cdb153e8131179e7d347400c412e GIT binary patch literal 8738 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 Pfq}u()z4*}Q$iB}0_}`B literal 0 HcmV?d00001 diff --git a/public/img/gitea-512.png b/public/img/gitea-512.png new file mode 100644 index 0000000000000000000000000000000000000000..59d1fed7d976bfae5b710aa04d983329641e8898 GIT binary patch literal 25737 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 literal 0 HcmV?d00001 diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 06292557b3..1c1bcd8f95 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -791,6 +791,15 @@ func RegisterRoutes(m *macaron.Macaron) { } }) + // Progressive Web App + m.Get("/manifest.json", templates.JSONRenderer(), func(ctx *context.Context) { + ctx.HTML(200, "pwa/manifest_json") + }) + + m.Get("/serviceworker.js", templates.JSRenderer(), func(ctx *context.Context) { + ctx.HTML(200, "pwa/serviceworker_js") + }) + // prometheus metrics endpoint if setting.Metrics.Enabled { c := metrics.NewCollector() diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index bb6a8a981b..47c0d6b473 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -5,6 +5,23 @@ {{if .Title}}{{.Title}} - {{end}}{{AppName}} + + + + diff --git a/templates/pwa/manifest_json.tmpl b/templates/pwa/manifest_json.tmpl new file mode 100644 index 0000000000..557bee5d76 --- /dev/null +++ b/templates/pwa/manifest_json.tmpl @@ -0,0 +1,31 @@ +{ + "short_name": "Gitea", + "name": "Gitea - Git with a cup of tea", + "icons": [ + { + "src": "{{AppSubUrl}}/img/gitea-lg.png", + "type": "image/png", + "sizes": "880x880" + }, + { + "src": "{{AppSubUrl}}/img/gitea-sm.png", + "type": "image/png", + "sizes": "120x120" + }, + { + "src": "{{AppSubUrl}}/img/gitea-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "{{AppSubUrl}}/img/gitea-192.png", + "type": "image/png", + "sizes": "192x192" + } + ], + "start_url": "{{AppSubUrl}}/", + "scope": "{{AppSubUrl}}/", + "background_color": "#FAFAFA", + "display": "standalone", + "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 0000000000..5e5860ebb0 --- /dev/null +++ b/templates/pwa/serviceworker_js.tmpl @@ -0,0 +1,72 @@ +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', +{{if ne DefaultTheme "gitea"}} + '{{AppSubUrl}}/css/theme-{{DefaultTheme}}.css', +{{end}} + + // 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?ef21c39f0ca9b1b5116e5eb7ac5eabe6', + '{{AppSubUrl}}/vendor/assets/lato-fonts/lato-v14-latin-regular.woff2', + '{{AppSubUrl}}/vendor/assets/lato-fonts/lato-v14-latin-700.woff2' +]; + +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); + } + ) + ); +});