web: start implementing translation in JS
This commit is contained in:
		@ -17,6 +17,7 @@
 | 
				
			|||||||
        <link rel="stylesheet" type="text/css" href="{% static 'node_modules/@patternfly/patternfly/patternfly-addons.css' %}">
 | 
					        <link rel="stylesheet" type="text/css" href="{% static 'node_modules/@patternfly/patternfly/patternfly-addons.css' %}">
 | 
				
			||||||
        <link rel="stylesheet" type="text/css" href="{% static 'node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css' %}">
 | 
					        <link rel="stylesheet" type="text/css" href="{% static 'node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css' %}">
 | 
				
			||||||
        <link rel="stylesheet" type="text/css" href="{% static 'dist/passbook.css' %}">
 | 
					        <link rel="stylesheet" type="text/css" href="{% static 'dist/passbook.css' %}">
 | 
				
			||||||
 | 
					        <script src="{% url 'javascript-catalog' %}"></script>
 | 
				
			||||||
        <script src="{% static 'dist/main.js' %}" type="module"></script>
 | 
					        <script src="{% static 'dist/main.js' %}" type="module"></script>
 | 
				
			||||||
        {% block head %}
 | 
					        {% block head %}
 | 
				
			||||||
        {% endblock %}
 | 
					        {% endblock %}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,6 +5,7 @@ from django.contrib import admin
 | 
				
			|||||||
from django.urls import include, path
 | 
					from django.urls import include, path
 | 
				
			||||||
from django.views.generic import RedirectView
 | 
					from django.views.generic import RedirectView
 | 
				
			||||||
from structlog import get_logger
 | 
					from structlog import get_logger
 | 
				
			||||||
 | 
					from django.views.i18n import JavaScriptCatalog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from passbook.core.views import error
 | 
					from passbook.core.views import error
 | 
				
			||||||
from passbook.lib.utils.reflection import get_apps
 | 
					from passbook.lib.utils.reflection import get_apps
 | 
				
			||||||
@ -56,6 +57,7 @@ for _passbook_app in get_apps():
 | 
				
			|||||||
urlpatterns += [
 | 
					urlpatterns += [
 | 
				
			||||||
    path("administration/django/", admin.site.urls),
 | 
					    path("administration/django/", admin.site.urls),
 | 
				
			||||||
    path("metrics/", MetricsView.as_view(), name="metrics"),
 | 
					    path("metrics/", MetricsView.as_view(), name="metrics"),
 | 
				
			||||||
 | 
					    path("-/jsi18n/", JavaScriptCatalog.as_view(), name='javascript-catalog'),
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if settings.DEBUG:
 | 
					if settings.DEBUG:
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +0,0 @@
 | 
				
			|||||||
# Ignore artifacts:
 | 
					 | 
				
			||||||
dist/
 | 
					 | 
				
			||||||
coverage
 | 
					 | 
				
			||||||
@ -1,4 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
    "printWidth": 100,
 | 
					 | 
				
			||||||
    "jsxBracketSameLine": true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -39,5 +39,6 @@ export default [
 | 
				
			|||||||
        watch: {
 | 
					        watch: {
 | 
				
			||||||
            clearScreen: false,
 | 
					            clearScreen: false,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        external: ['django']
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								web/src/django.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								web/src/django.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					declare module 'django' {
 | 
				
			||||||
 | 
					    export = django;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					declare namespace django {
 | 
				
			||||||
 | 
					    function gettext(name: string): string;
 | 
				
			||||||
 | 
					    function ngettext(singular: string, plural: string, count: number): string;
 | 
				
			||||||
 | 
					    function gettext_noop(msgid: string): string;
 | 
				
			||||||
 | 
					    function pgettext(context: string, msgid: string): string;
 | 
				
			||||||
 | 
					    function interpolate(fmt: string, obj: any, named: boolean): string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					import { gettext } from "django";
 | 
				
			||||||
import { html, LitElement, property, TemplateResult } from "lit-element";
 | 
					import { html, LitElement, property, TemplateResult } from "lit-element";
 | 
				
			||||||
import { until } from "lit-html/directives/until.js";
 | 
					import { until } from "lit-html/directives/until.js";
 | 
				
			||||||
import { PBResponse } from "../../api/client";
 | 
					import { PBResponse } from "../../api/client";
 | 
				
			||||||
@ -70,12 +71,10 @@ export abstract class Table<T> extends LitElement {
 | 
				
			|||||||
                    <div class="pf-c-toolbar__bulk-select">
 | 
					                    <div class="pf-c-toolbar__bulk-select">
 | 
				
			||||||
                        <slot name="create-button"></slot>
 | 
					                        <slot name="create-button"></slot>
 | 
				
			||||||
                        <button
 | 
					                        <button
 | 
				
			||||||
                            @click=${() => {
 | 
					                            @click=${() => {this.fetch();}}
 | 
				
			||||||
        this.fetch();
 | 
					 | 
				
			||||||
    }}
 | 
					 | 
				
			||||||
                            class="pf-c-button pf-m-primary"
 | 
					                            class="pf-c-button pf-m-primary"
 | 
				
			||||||
                        >
 | 
					                        >
 | 
				
			||||||
                            Refresh
 | 
					                            ${gettext("Refresh")}
 | 
				
			||||||
                        </button>
 | 
					                        </button>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                    <pb-table-pagination
 | 
					                    <pb-table-pagination
 | 
				
			||||||
@ -88,7 +87,7 @@ export abstract class Table<T> extends LitElement {
 | 
				
			|||||||
                <thead>
 | 
					                <thead>
 | 
				
			||||||
                    <tr role="row">
 | 
					                    <tr role="row">
 | 
				
			||||||
                        ${this.columns().map(
 | 
					                        ${this.columns().map(
 | 
				
			||||||
        (col) => html`<th role="columnheader" scope="col">${col}</th>`
 | 
					                            (col) => html`<th role="columnheader" scope="col">${gettext(col)}</th>`
 | 
				
			||||||
                        )}
 | 
					                        )}
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                </thead>
 | 
					                </thead>
 | 
				
			||||||
 | 
				
			|||||||
@ -141,7 +141,8 @@ export class RouterOutlet extends LitElement {
 | 
				
			|||||||
        this.current = matchedRoute;
 | 
					        this.current = matchedRoute;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render(): TemplateResult {
 | 
					    render(): TemplateResult | undefined {
 | 
				
			||||||
 | 
					        // TODO: Render 404 when current Route is empty
 | 
				
			||||||
        return this.current?.render();
 | 
					        return this.current?.render();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					import { gettext } from "django";
 | 
				
			||||||
import { customElement } from "lit-element";
 | 
					import { customElement } from "lit-element";
 | 
				
			||||||
import { Application } from "../../api/application";
 | 
					import { Application } from "../../api/application";
 | 
				
			||||||
import { PBResponse } from "../../api/client";
 | 
					import { PBResponse } from "../../api/client";
 | 
				
			||||||
@ -6,13 +7,13 @@ import { TablePage } from "../../elements/table/TablePage";
 | 
				
			|||||||
@customElement("pb-application-list")
 | 
					@customElement("pb-application-list")
 | 
				
			||||||
export class ApplicationList extends TablePage<Application> {
 | 
					export class ApplicationList extends TablePage<Application> {
 | 
				
			||||||
    pageTitle(): string {
 | 
					    pageTitle(): string {
 | 
				
			||||||
        return "Applications";
 | 
					        return gettext("Applications");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    pageDescription(): string {
 | 
					    pageDescription(): string {
 | 
				
			||||||
        return "External Applications which use passbook as Identity-Provider, utilizing protocols like OAuth2 and SAML.";
 | 
					        return gettext("External Applications which use passbook as Identity-Provider, utilizing protocols like OAuth2 and SAML.");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    pageIcon(): string {
 | 
					    pageIcon(): string {
 | 
				
			||||||
        return "pf-icon pf-icon-applications";
 | 
					        return gettext("pf-icon pf-icon-applications");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    apiEndpoint(page: number): Promise<PBResponse<Application>> {
 | 
					    apiEndpoint(page: number): Promise<PBResponse<Application>> {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user