@crowdin/app-project-module 0.96.3 → 0.98.0-cf-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/out/index.js +17 -6
  2. package/out/middlewares/integration-credentials.js +4 -1
  3. package/out/middlewares/render-ui-module.d.ts +3 -3
  4. package/out/middlewares/render-ui-module.js +9 -13
  5. package/out/middlewares/ui-module.js +4 -1
  6. package/out/modules/about.d.ts +1 -1
  7. package/out/modules/about.js +8 -2
  8. package/out/modules/ai-prompt-provider/index.js +4 -2
  9. package/out/modules/ai-provider/index.js +4 -2
  10. package/out/modules/ai-tools/index.js +1 -1
  11. package/out/modules/context-menu/index.js +2 -2
  12. package/out/modules/custom-mt/index.js +3 -1
  13. package/out/modules/custom-spell-check/index.js +4 -4
  14. package/out/modules/editor-right-panel/index.js +1 -1
  15. package/out/modules/external-qa-check/index.js +2 -2
  16. package/out/modules/integration/handlers/main.js +13 -1
  17. package/out/modules/integration/handlers/oauth-login.js +10 -2
  18. package/out/modules/integration/index.js +27 -21
  19. package/out/modules/integration/util/job.js +2 -4
  20. package/out/modules/integration/util/types.d.ts +2 -1
  21. package/out/modules/modal/index.js +2 -2
  22. package/out/modules/organization-menu/index.js +6 -4
  23. package/out/modules/organization-settings-menu/index.js +6 -4
  24. package/out/modules/profile-resources-menu/index.js +6 -4
  25. package/out/modules/profile-settings-menu/index.js +6 -4
  26. package/out/modules/project-menu/index.js +1 -1
  27. package/out/modules/project-menu-crowdsource/index.js +1 -1
  28. package/out/modules/project-reports/index.js +4 -2
  29. package/out/modules/project-tools/index.js +4 -2
  30. package/out/modules/workflow-step-type/index.js +3 -2
  31. package/out/storage/d1.d.ts +99 -0
  32. package/out/storage/d1.js +769 -0
  33. package/out/storage/index.d.ts +1 -0
  34. package/out/storage/index.js +8 -1
  35. package/out/storage/mysql.d.ts +1 -0
  36. package/out/storage/mysql.js +7 -1
  37. package/out/storage/postgre.d.ts +1 -0
  38. package/out/storage/postgre.js +2 -1
  39. package/out/storage/sqlite.d.ts +1 -0
  40. package/out/storage/sqlite.js +2 -1
  41. package/out/types.d.ts +10 -0
  42. package/out/util/index.d.ts +1 -0
  43. package/out/util/index.js +8 -2
  44. package/out/util/jsx-renderer.d.ts +6 -0
  45. package/out/util/jsx-renderer.js +13 -0
  46. package/out/util/static-files.d.ts +19 -0
  47. package/out/util/static-files.js +80 -0
  48. package/out/views/AboutPage.d.ts +9 -0
  49. package/out/views/AboutPage.js +79 -0
  50. package/out/views/ErrorPage.d.ts +18 -0
  51. package/out/views/ErrorPage.js +56 -0
  52. package/out/views/FormPage.d.ts +13 -0
  53. package/out/views/FormPage.js +27 -0
  54. package/out/views/InstallPage.d.ts +10 -0
  55. package/out/views/InstallPage.js +22 -0
  56. package/out/views/LoginPage.d.ts +33 -0
  57. package/out/views/LoginPage.js +199 -0
  58. package/out/views/MainPage.d.ts +79 -0
  59. package/out/views/MainPage.js +1613 -0
  60. package/out/views/OAuthPage.d.ts +7 -0
  61. package/out/views/OAuthPage.js +17 -0
  62. package/out/views/SubscriptionPage.d.ts +7 -0
  63. package/out/views/SubscriptionPage.js +26 -0
  64. package/out/views/index.d.ts +13 -0
  65. package/out/views/index.js +25 -0
  66. package/out/views/layout/Head.d.ts +9 -0
  67. package/out/views/layout/Head.js +54 -0
  68. package/package.json +12 -11
  69. package/out/util/handlebars.d.ts +0 -1
  70. package/out/util/handlebars.js +0 -46
  71. package/out/views/about.handlebars +0 -102
  72. package/out/views/error.handlebars +0 -54
  73. package/out/views/form.handlebars +0 -30
  74. package/out/views/install.handlebars +0 -16
  75. package/out/views/login.handlebars +0 -331
  76. package/out/views/main.handlebars +0 -1857
  77. package/out/views/oauth.handlebars +0 -11
  78. package/out/views/partials/head.handlebars +0 -53
  79. package/out/views/subscription.handlebars +0 -26
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ interface OAuthPageProps {
3
+ message: string;
4
+ oauthMode?: string;
5
+ }
6
+ export declare const OAuthPage: FC<OAuthPageProps>;
7
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OAuthPage = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const OAuthPage = ({ message, oauthMode }) => (react_1.default.createElement("script", { type: "text/javascript", dangerouslySetInnerHTML: {
9
+ __html: `
10
+ const oauthMode = ${oauthMode ? `'${oauthMode}'` : 'undefined'};
11
+ if (oauthMode !== 'polling') {
12
+ window.opener.postMessage('${message}');
13
+ }
14
+ window.close();
15
+ `,
16
+ } }));
17
+ exports.OAuthPage = OAuthPage;
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ interface SubscriptionPageProps {
3
+ name?: string;
4
+ subscribeLink?: string;
5
+ }
6
+ export declare const SubscriptionPage: FC<SubscriptionPageProps>;
7
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SubscriptionPage = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const SubscriptionPage = ({ name, subscribeLink }) => (react_1.default.createElement("html", { lang: "en" },
9
+ react_1.default.createElement("head", null,
10
+ react_1.default.createElement("meta", { charSet: "UTF-8" }),
11
+ react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
12
+ react_1.default.createElement("meta", { httpEquiv: "X-UA-Compatible", content: "ie=edge" }),
13
+ react_1.default.createElement("title", null),
14
+ react_1.default.createElement("script", { type: "module", src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.esm.js" }),
15
+ react_1.default.createElement("script", { noModule: true, src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.js" }),
16
+ react_1.default.createElement("script", { type: "text/javascript", src: "https://cdn.crowdin.com/apps/dist/iframe.js" })),
17
+ react_1.default.createElement("body", null,
18
+ react_1.default.createElement("div", { className: "i_w center" },
19
+ react_1.default.createElement("crowdin-alert", { type: "warning" },
20
+ "Subscribe to continue using the ",
21
+ name,
22
+ " app."),
23
+ react_1.default.createElement("br", null),
24
+ react_1.default.createElement("crowdin-button", { primary: true, onclick: `window.open('${subscribeLink}','_blank')` }, "Subscribe"),
25
+ react_1.default.createElement("crowdin-button", { outlined: true, onclick: "window.open('https://crowdin.com/contacts','_blank')" }, "Contact us")))));
26
+ exports.SubscriptionPage = SubscriptionPage;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * React JSX Views
3
+ * Export all React SSR components for use in route handlers
4
+ */
5
+ export { Head } from './layout/Head';
6
+ export { AboutPage } from './AboutPage';
7
+ export { ErrorPage } from './ErrorPage';
8
+ export { FormPage } from './FormPage';
9
+ export { InstallPage } from './InstallPage';
10
+ export { LoginPage } from './LoginPage';
11
+ export { MainPage } from './MainPage';
12
+ export { OAuthPage } from './OAuthPage';
13
+ export { SubscriptionPage } from './SubscriptionPage';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * React JSX Views
4
+ * Export all React SSR components for use in route handlers
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SubscriptionPage = exports.OAuthPage = exports.MainPage = exports.LoginPage = exports.InstallPage = exports.FormPage = exports.ErrorPage = exports.AboutPage = exports.Head = void 0;
8
+ var Head_1 = require("./layout/Head");
9
+ Object.defineProperty(exports, "Head", { enumerable: true, get: function () { return Head_1.Head; } });
10
+ var AboutPage_1 = require("./AboutPage");
11
+ Object.defineProperty(exports, "AboutPage", { enumerable: true, get: function () { return AboutPage_1.AboutPage; } });
12
+ var ErrorPage_1 = require("./ErrorPage");
13
+ Object.defineProperty(exports, "ErrorPage", { enumerable: true, get: function () { return ErrorPage_1.ErrorPage; } });
14
+ var FormPage_1 = require("./FormPage");
15
+ Object.defineProperty(exports, "FormPage", { enumerable: true, get: function () { return FormPage_1.FormPage; } });
16
+ var InstallPage_1 = require("./InstallPage");
17
+ Object.defineProperty(exports, "InstallPage", { enumerable: true, get: function () { return InstallPage_1.InstallPage; } });
18
+ var LoginPage_1 = require("./LoginPage");
19
+ Object.defineProperty(exports, "LoginPage", { enumerable: true, get: function () { return LoginPage_1.LoginPage; } });
20
+ var MainPage_1 = require("./MainPage");
21
+ Object.defineProperty(exports, "MainPage", { enumerable: true, get: function () { return MainPage_1.MainPage; } });
22
+ var OAuthPage_1 = require("./OAuthPage");
23
+ Object.defineProperty(exports, "OAuthPage", { enumerable: true, get: function () { return OAuthPage_1.OAuthPage; } });
24
+ var SubscriptionPage_1 = require("./SubscriptionPage");
25
+ Object.defineProperty(exports, "SubscriptionPage", { enumerable: true, get: function () { return SubscriptionPage_1.SubscriptionPage; } });
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ interface HeadProps {
3
+ sentryData?: {
4
+ dsn: string;
5
+ appIdentifier: string;
6
+ };
7
+ }
8
+ export declare const Head: FC<HeadProps>;
9
+ export {};
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Head = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const Head = ({ sentryData }) => (react_1.default.createElement("head", null,
9
+ react_1.default.createElement("meta", { charSet: "UTF-8" }),
10
+ react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
11
+ react_1.default.createElement("meta", { httpEquiv: "X-UA-Compatible", content: "ie=edge" }),
12
+ react_1.default.createElement("title", null),
13
+ react_1.default.createElement("link", { rel: "stylesheet", href: "/assets/css/styles.css" }),
14
+ react_1.default.createElement("link", { rel: "stylesheet", href: "/assets/css/crowdin-ui-colors.css" }),
15
+ react_1.default.createElement("script", { type: "module", src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.esm.js" }),
16
+ react_1.default.createElement("script", { noModule: true, src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.js" }),
17
+ react_1.default.createElement("script", { type: "text/javascript", src: "https://cdn.crowdin.com/apps/dist/iframe.js" }),
18
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/polyfills/promise.js" }),
19
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/polyfills/fetch.js" }),
20
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/main.js" }),
21
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/dependent.js" }),
22
+ react_1.default.createElement("style", null, `
23
+ .ml-10 {
24
+ margin-left: 10px;
25
+ }
26
+ `),
27
+ sentryData && (react_1.default.createElement(react_1.default.Fragment, null,
28
+ react_1.default.createElement("script", { src: "https://browser.sentry-cdn.com/7.60.0/bundle.replay.min.js", integrity: "sha384-N+VZps2PwFdv9LugkPA8nw+SMI1mGJG7IDe49jaxZlWDDJhHQ+SHakMpwhLQLAka", crossOrigin: "anonymous" }),
29
+ react_1.default.createElement("script", { dangerouslySetInnerHTML: {
30
+ __html: `
31
+ if (typeof Sentry !== 'undefined') {
32
+ Sentry.init({
33
+ dsn: "${sentryData.dsn}",
34
+ environment: "frontend",
35
+ replaysSessionSampleRate: 0,
36
+ replaysOnErrorSampleRate: 1.0,
37
+ integrations: [new Sentry.Replay()],
38
+ });
39
+
40
+ Sentry.configureScope(function(scope) {
41
+ scope.setTag("identifier", "${sentryData.appIdentifier}");
42
+
43
+ AP.getContext(contextData => {
44
+ const { user_id, ...rest } = contextData;
45
+ user_id && scope.setUser({ id: user_id });
46
+ scope.setTags(rest);
47
+ });
48
+ });
49
+ } else {
50
+ console.warn('Sentry is not available. This might be due to ad/tracking blockers or network issues.');
51
+ }
52
+ `,
53
+ } })))));
54
+ exports.Head = Head;
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@crowdin/app-project-module",
3
- "version": "0.96.3",
3
+ "version": "0.98.0-cf-0",
4
4
  "description": "Module that generates for you all common endpoints for serving standalone Crowdin App",
5
5
  "main": "out/index.js",
6
6
  "types": "out/index.d.ts",
7
7
  "scripts": {
8
- "build": "tsc -p ./ && cp -R views out && cp -R static out && cp logo.png out && rollup -c rollup.config.mjs",
9
- "build-main": "tsc -p ./ && cp -R views out && cp -R static out && cp logo.png out",
8
+ "build": "tsc -p ./ && cp -R static out && cp logo.png out && rollup -c rollup.config.mjs",
9
+ "build-main": "tsc -p ./ && cp -R static out && cp logo.png out",
10
10
  "build-form": "tsc -p ./ && cp -R static/js/form out/static/js && rollup -c rollup.config.mjs",
11
- "watch-main": "tsc --watch -p ./ && cp -R views out && cp -R static out && cp logo.png out",
11
+ "watch-main": "tsc --watch -p ./ && cp -R static out && cp logo.png out",
12
12
  "lint": "eslint --fix \"{src,tests}/**/*.{js,ts}\"",
13
13
  "prettier": "prettier --config .prettierrc src/**/*.ts --write",
14
14
  "lint-ci": "eslint \"{src,tests}/**/*.{js,ts}\"",
@@ -26,8 +26,7 @@
26
26
  "@godaddy/terminus": "^4.12.1",
27
27
  "amqplib": "^0.10.8",
28
28
  "crypto-js": "^4.2.0",
29
- "express": "^4.21.2",
30
- "express-handlebars": "^5.3.5",
29
+ "express": "^5.1.0",
31
30
  "express-rate-limit": "^7.5.0",
32
31
  "lodash.get": "^4.4.2",
33
32
  "lodash.isstring": "^4.0.1",
@@ -37,16 +36,19 @@
37
36
  "mysql2": "^3.12.0",
38
37
  "node-cron": "^3.0.3",
39
38
  "pg": "^8.13.3",
39
+ "react": "^18.3.1",
40
+ "react-dom": "^18.3.1",
40
41
  "redoc-express": "^2.1.0",
41
42
  "sqlite3": "^5.1.7",
42
43
  "swagger-jsdoc": "^6.2.8",
43
44
  "uuid": "^8.3.2"
44
45
  },
45
46
  "devDependencies": {
46
- "@monaco-editor/react": "^4.7.0",
47
47
  "@babel/preset-react": "^7.26.3",
48
+ "@cloudflare/workers-types": "^4.20251011.0",
48
49
  "@emotion/react": "^11.14.0",
49
50
  "@emotion/styled": "^11.14.0",
51
+ "@monaco-editor/react": "^4.7.0",
50
52
  "@mui/icons-material": "^5.16.14",
51
53
  "@mui/material": "^5.16.14",
52
54
  "@rjsf/core": "^5.24.3",
@@ -62,8 +64,7 @@
62
64
  "@rollup/plugin-terser": "^0.4.4",
63
65
  "@types/amqplib": "^0.10.7",
64
66
  "@types/crypto-js": "^4.2.2",
65
- "@types/express": "4.17.21",
66
- "@types/express-handlebars": "^5.3.1",
67
+ "@types/express": "^5.0.3",
67
68
  "@types/jest": "^29.5.14",
68
69
  "@types/lodash.get": "^4.4.9",
69
70
  "@types/lodash.isstring": "^4.0.9",
@@ -73,6 +74,8 @@
73
74
  "@types/node": "^16.18.126",
74
75
  "@types/node-cron": "^3.0.11",
75
76
  "@types/pg": "^8.11.11",
77
+ "@types/react": "^18.3.18",
78
+ "@types/react-dom": "^18.3.5",
76
79
  "@types/swagger-jsdoc": "^6.0.4",
77
80
  "@types/uuid": "^9.0.7",
78
81
  "@typescript-eslint/eslint-plugin": "^2.3.1",
@@ -84,8 +87,6 @@
84
87
  "jest": "^29.7.0",
85
88
  "jest-junit": "^15.0.0",
86
89
  "prettier": "^2.8.8",
87
- "react": "^18.3.1",
88
- "react-dom": "^18.3.1",
89
90
  "rollup": "^3.29.4",
90
91
  "rollup-plugin-delete": "^2.1.0",
91
92
  "ts-jest": "^29.2.5",
@@ -1 +0,0 @@
1
- export declare const engine: (path: string, options: object, callback: (e: any, rendered: string) => void) => void;
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.engine = void 0;
7
- const express_handlebars_1 = __importDefault(require("express-handlebars"));
8
- exports.engine = (0, express_handlebars_1.default)({
9
- layoutsDir: '',
10
- defaultLayout: '',
11
- helpers: {
12
- ifeq: function (a, b, options) {
13
- if (a === b) {
14
- return options.fn(this);
15
- }
16
- return options.inverse(this);
17
- },
18
- checkLength: function (a, b, options) {
19
- if (a.length > b) {
20
- return options.fn(this);
21
- }
22
- return options.inverse(this);
23
- },
24
- in: function (a, b, options) {
25
- if (a !== undefined && a !== null && b !== undefined && b !== null) {
26
- let bArray;
27
- if (Array.isArray(b)) {
28
- bArray = b.map((item) => item.toString());
29
- }
30
- else {
31
- bArray = b.toString().split(' ');
32
- }
33
- if (bArray.includes(a === null || a === void 0 ? void 0 : a.toString())) {
34
- return options.fn(this);
35
- }
36
- }
37
- return options.inverse(this);
38
- },
39
- or: function (a, b, options) {
40
- return a || b ? options.fn(this) : options.inverse(this);
41
- },
42
- incrementedIndex: function (index) {
43
- return index + 1;
44
- },
45
- },
46
- });
@@ -1,102 +0,0 @@
1
- <html>
2
- <head>
3
- <title>{{name}}</title>
4
- <meta charset="utf-8" />
5
- <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1" />
7
-
8
- {{#if storeLink}}
9
- <link rel="canonical" href="{{storeLink}}">
10
- {{/if}}
11
-
12
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
13
- <link href="/assets/css/about.css" media="screen" rel="stylesheet" type="text/css">
14
- </head>
15
- <body>
16
- <header id="header" class="navbar navbar-expand-lg fixed-top crowdin-navbar">
17
- <a itemprop="url" class="navbar-brand crowdin-navbar__logo" href="https://crowdin.com" title="Crowdin — Localization Management Platform">
18
- <svg class="d-none d-md-block d-lg-block default-logo" width="180" height="54" aria-labelledby="crowdinLogoTitle">
19
- <title id="crowdinLogoTitle">Crowdin</title>
20
- <image class="d-none d-md-block d-lg-block" href="/assets/img/crowdin.svg" width="180" height="54" alt="Crowdin" />
21
- </svg>
22
- <svg class="d-block d-md-none d-lg-none default-logo" width="173" height="32">
23
- <image class="d-block d-md-none d-lg-none" href="/assets/img/crowdin_small.svg" width="173" height="32" alt="Crowdin"/>
24
- </svg>
25
- </a>
26
- <div class="flex-nowrap justify-content-lg-end ml-auto my-lg-0">
27
- <div class="pr-0 ml-2 my-2">
28
- <span class="crowdin-navbar__nav-link contact ">
29
- <a title="Contact" href="https://crowdin.com/contacts">Contact</a>
30
- </span>
31
- </div>
32
- </div>
33
- </header>
34
- <div class="main">
35
- <div class="container">
36
- <div class="row crwd__product-template__header align-items-center">
37
-
38
- <div class="offset-lg-1 col-lg-2 product-single__photo-wrapper crwd__product-single__photo-wrapper">
39
- <div class="product-single__photo text-center mb-3 mb-lg-0">
40
- <div class="image-holder">
41
- <img width="200" src="{{logo}}" alt="{{name}}" id="FeaturedImage-product-template" class="img-fluid lazyloaded ls-is-cached product-featured-img" style="position: unset;">
42
- </div>
43
- </div>
44
- </div>
45
- <div class=" col-lg-8 crwd__product-template__header__title-container">
46
- <div class="product-single__meta">
47
- <div class="section-header">
48
- <h1 class="product-single__title text-center text-lg-left">
49
- <span>{{name}}</span>
50
- </h1>
51
- <div class="description">
52
- {{name}} extends the default functionality available in Crowdin and Crowdin Enterprise by providing additional capabilities to enhance your localization workflows.
53
- </div>
54
- </div>
55
- </div>
56
- </div>
57
- </div>
58
- <div class="row">
59
- <div class="offset-lg-1 col-lg-10">
60
- <p>To install this app, you can use either of the following methods: </p>
61
- <ol>
62
- <li>Install it directly from the <a href="https://store.crowdin.com/" target="_blank">Crowdin Store</a>, if available.</li>
63
- <li>Install it manually using the manifest URL below.</li>
64
- </ol>
65
- <p>For detailed steps, follow the <a href="https://support.crowdin.com/developer/crowdin-apps-installation/" target="_blank">App Installation</a></p>
66
-
67
- <div class="mb-3">
68
- <label for="manifest-url" class="form-label">Paste the following manifest URL when prompted during manual installation:</label>
69
- <div class="input-group">
70
- <input
71
- type="text"
72
- class="form-control"
73
- id="manifest-url"
74
- value="{{manifest}}"
75
- readonly
76
- >
77
- <button class="btn btn-outline-secondary" type="button" id="copy-button">
78
- Copy
79
- </button>
80
- </div>
81
- </div>
82
-
83
-
84
-
85
- {{#if storeLink}}
86
- <div>Read more about <a href="{{storeLink}}" target="_blank" title="{{name}} on Crowdin Store">{{name}}</a>.</div>
87
- {{/if}}
88
- </div>
89
- </div>
90
- </div>
91
- </div>
92
- </body>
93
- <script>
94
- document.getElementById('copy-button').addEventListener('click', async () => {
95
- const text = document.getElementById('manifest-url').value;
96
- await navigator.clipboard.writeText(text);
97
- const btn = document.getElementById('copy-button');
98
- btn.textContent = 'Copied!';
99
- setTimeout(() => btn.textContent = 'Copy', 1500);
100
- });
101
- </script>
102
- </html>
@@ -1,54 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- {{> head}}
4
-
5
- <body>
6
- <div class="i_w">
7
- <div class="error-page">
8
- <div>
9
- <div class="error-page-message">
10
- <crowdin-h3>{{ message }}</crowdin-h3>
11
- {{#if owners}}
12
- <crowdin-p>This integration allows only one connection per project to ensure consistent configuration and prevent file import or synchronization issues.</crowdin-p>
13
- {{#if owners.[1]}}
14
- <crowdin-p class="mt-2">Managed by:</crowdin-p>
15
- <ul>
16
- {{#each owners}}
17
- <li><crowdin-a href="#" onclick="contactUser({{this.id}})">{{this.name}}</crowdin-a></li>
18
- {{/each}}
19
- </ul>
20
- <crowdin-p class="mt-2">To request access, please contact one of the project members listed above.</crowdin-p>
21
- {{else}}
22
- <crowdin-p class="mt-2">Managed by: <crowdin-a href="#" onclick="contactUser({{owners.[0].id}})">{{owners.[0].name}}</crowdin-a></crowdin-p>
23
- <crowdin-p class="mt-2">To request access, please contact the project member listed above.</crowdin-p>
24
- {{/if}}
25
- {{/if}}
26
- </div>
27
- {{#unless hideActions}}
28
- <div class="error-page-action">
29
- <crowdin-button outlined onclick="integrationLogout()">Log out</crowdin-button>
30
- <span> or <crowdin-a href="https://crowdin.com/contacts" target="_blank">contact us</crowdin-a> for help</span>
31
- </div>
32
- {{/unless}}
33
- </div>
34
- </div>
35
- </div>
36
- </body>
37
-
38
- </html>
39
- <script>
40
- function integrationLogout() {
41
- checkOrigin()
42
- .then(queryParams => fetch(`api/logout${queryParams}`, { method: 'POST' }))
43
- .then(checkResponse)
44
- .then(reloadLocation)
45
- .then(localStorage.removeItem('revised_{{name}}'))
46
- .catch(e => catchRejection(e, 'Looks like you are not logged in'));
47
- }
48
-
49
- function contactUser(userId) {
50
- AP.getContext(function(context) {
51
- AP.redirect(`${context.organization_id ? '/u' : ''}/messages/create/${userId}`);
52
- });
53
- }
54
- </script>
@@ -1,30 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- {{> head}}
4
- <body>
5
- <div
6
- class="i_w"
7
- style='max-width:680px; position: relative;'
8
- >
9
- <crowdin-card
10
- id="card"
11
- is-shadowed
12
- >
13
- <div id="form"></div>
14
- <div id="form-loading">
15
- <crowdin-progress-indicator />
16
- </div>
17
- </crowdin-card>
18
- </div>
19
- <crowdin-toasts></crowdin-toasts>
20
- <script>
21
- /*<!--*/
22
- var formGetDataUrl = '{{formGetDataUrl}}';
23
- var formPostDataUrl = '{{formPostDataUrl}}';
24
- var formSchema = {{{formSchema}}};
25
- var formUiSchema = {{{formUiSchema}}};
26
- /*-->*/
27
- </script>
28
- <script src="/assets/js/form.js"></script>
29
- </body>
30
- </html>
@@ -1,16 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- {{> head}}
4
-
5
- <body>
6
- <div class="i_w center">
7
- <div>
8
- <h1>Looks like {{ name }} is not installed yet!</h1>
9
- <p>Contact your organization administrator to install it. More info on <a
10
- href='https://support.crowdin.com'>Link
11
- to how to install</a></p>
12
- </div>
13
- </div>
14
- </body>
15
-
16
- </html>