@crowdin/app-project-module 0.98.0-cf-3 → 0.99.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 (142) hide show
  1. package/out/index.js +12 -28
  2. package/out/middlewares/crowdin-client.d.ts +1 -1
  3. package/out/middlewares/integration-credentials.d.ts +1 -1
  4. package/out/middlewares/integration-credentials.js +1 -4
  5. package/out/middlewares/render-ui-module.d.ts +3 -3
  6. package/out/middlewares/render-ui-module.js +13 -9
  7. package/out/middlewares/ui-module.d.ts +1 -1
  8. package/out/middlewares/ui-module.js +1 -4
  9. package/out/modules/about.d.ts +1 -1
  10. package/out/modules/about.js +2 -8
  11. package/out/modules/ai-prompt-provider/handlers/compile.d.ts +1 -1
  12. package/out/modules/ai-prompt-provider/index.js +2 -4
  13. package/out/modules/ai-provider/handlers/chat-completions.d.ts +1 -1
  14. package/out/modules/ai-provider/handlers/get-model-list.d.ts +1 -1
  15. package/out/modules/ai-provider/index.js +2 -4
  16. package/out/modules/ai-request-processors/handler.d.ts +1 -1
  17. package/out/modules/ai-tools/handlers/tool-calls.d.ts +1 -1
  18. package/out/modules/ai-tools/index.js +1 -1
  19. package/out/modules/api/api.js +87 -2
  20. package/out/modules/context-menu/index.js +2 -2
  21. package/out/modules/custom-mt/handlers/translate.d.ts +1 -1
  22. package/out/modules/custom-mt/index.js +1 -3
  23. package/out/modules/custom-spell-check/handlers/get-languages-list.d.ts +1 -1
  24. package/out/modules/custom-spell-check/handlers/spell-check.d.ts +1 -1
  25. package/out/modules/custom-spell-check/index.js +4 -4
  26. package/out/modules/editor-right-panel/index.js +1 -1
  27. package/out/modules/external-qa-check/handlers/validate.d.ts +1 -1
  28. package/out/modules/external-qa-check/index.js +2 -2
  29. package/out/modules/file-processing/handlers/custom-file-format.d.ts +1 -1
  30. package/out/modules/file-processing/handlers/file-download.d.ts +1 -1
  31. package/out/modules/file-processing/handlers/pre-post-process.d.ts +1 -1
  32. package/out/modules/form-data-display.d.ts +1 -1
  33. package/out/modules/form-data-save.d.ts +1 -1
  34. package/out/modules/install.d.ts +1 -1
  35. package/out/modules/integration/handlers/crowdin-file-progress.d.ts +1 -1
  36. package/out/modules/integration/handlers/crowdin-files.d.ts +1 -1
  37. package/out/modules/integration/handlers/crowdin-files.js +6 -4
  38. package/out/modules/integration/handlers/crowdin-project.d.ts +1 -1
  39. package/out/modules/integration/handlers/crowdin-update.d.ts +1 -1
  40. package/out/modules/integration/handlers/crowdin-update.js +18 -4
  41. package/out/modules/integration/handlers/crowdin-webhook.d.ts +1 -1
  42. package/out/modules/integration/handlers/integration-data.d.ts +1 -1
  43. package/out/modules/integration/handlers/integration-data.js +17 -13
  44. package/out/modules/integration/handlers/integration-login.d.ts +1 -1
  45. package/out/modules/integration/handlers/integration-logout.d.ts +1 -1
  46. package/out/modules/integration/handlers/integration-update.d.ts +1 -1
  47. package/out/modules/integration/handlers/integration-webhook.d.ts +1 -1
  48. package/out/modules/integration/handlers/invite-users.d.ts +1 -1
  49. package/out/modules/integration/handlers/job-cancel.d.ts +1 -1
  50. package/out/modules/integration/handlers/job-info-deprecated.d.ts +4 -0
  51. package/out/modules/integration/handlers/job-info-deprecated.js +138 -0
  52. package/out/modules/integration/handlers/job-info.d.ts +1 -2
  53. package/out/modules/integration/handlers/job-info.js +20 -75
  54. package/out/modules/integration/handlers/job-list.d.ts +3 -0
  55. package/out/modules/integration/handlers/job-list.js +46 -0
  56. package/out/modules/integration/handlers/main.d.ts +1 -1
  57. package/out/modules/integration/handlers/main.js +3 -13
  58. package/out/modules/integration/handlers/oauth-login.d.ts +1 -1
  59. package/out/modules/integration/handlers/oauth-login.js +2 -10
  60. package/out/modules/integration/handlers/oauth-polling.d.ts +1 -1
  61. package/out/modules/integration/handlers/oauth-url.d.ts +1 -1
  62. package/out/modules/integration/handlers/settings-save.d.ts +1 -1
  63. package/out/modules/integration/handlers/settings.d.ts +1 -1
  64. package/out/modules/integration/handlers/sync-settings-save.d.ts +1 -1
  65. package/out/modules/integration/handlers/sync-settings.d.ts +1 -1
  66. package/out/modules/integration/handlers/user-errors.d.ts +1 -1
  67. package/out/modules/integration/handlers/users.d.ts +1 -1
  68. package/out/modules/integration/index.d.ts +1 -3
  69. package/out/modules/integration/index.js +37 -38
  70. package/out/modules/integration/types.d.ts +11 -1
  71. package/out/modules/integration/util/defaults.js +51 -45
  72. package/out/modules/integration/util/files.d.ts +1 -0
  73. package/out/modules/integration/util/files.js +52 -4
  74. package/out/modules/integration/util/job.d.ts +1 -1
  75. package/out/modules/integration/util/job.js +3 -2
  76. package/out/modules/integration/util/types.d.ts +8 -0
  77. package/out/modules/modal/index.js +2 -2
  78. package/out/modules/organization-menu/index.js +4 -6
  79. package/out/modules/organization-settings-menu/index.js +4 -6
  80. package/out/modules/profile-resources-menu/index.js +4 -6
  81. package/out/modules/profile-settings-menu/index.js +4 -6
  82. package/out/modules/project-menu/index.js +1 -1
  83. package/out/modules/project-menu-crowdsource/index.js +1 -1
  84. package/out/modules/project-reports/index.js +2 -4
  85. package/out/modules/project-tools/index.js +2 -4
  86. package/out/modules/status.d.ts +1 -1
  87. package/out/modules/subscription-paid.d.ts +1 -1
  88. package/out/modules/uninstall.d.ts +1 -1
  89. package/out/modules/webhooks/handlers/webhook-handler.d.ts +1 -1
  90. package/out/modules/workflow-step-type/handlers/delete-step.d.ts +1 -1
  91. package/out/modules/workflow-step-type/handlers/step-settings-save.d.ts +1 -1
  92. package/out/modules/workflow-step-type/index.js +2 -3
  93. package/out/storage/index.d.ts +2 -1
  94. package/out/storage/index.js +1 -8
  95. package/out/storage/mysql.d.ts +3 -2
  96. package/out/storage/mysql.js +42 -1
  97. package/out/storage/postgre.d.ts +3 -2
  98. package/out/storage/postgre.js +43 -4
  99. package/out/storage/sqlite.d.ts +3 -2
  100. package/out/storage/sqlite.js +38 -4
  101. package/out/types.d.ts +1 -18
  102. package/out/util/credentials-masker.d.ts +1 -1
  103. package/out/util/handlebars.d.ts +1 -0
  104. package/out/util/handlebars.js +46 -0
  105. package/out/util/index.d.ts +0 -2
  106. package/out/util/index.js +2 -14
  107. package/out/views/about.handlebars +102 -0
  108. package/out/views/error.handlebars +54 -0
  109. package/out/views/form.handlebars +30 -0
  110. package/out/views/install.handlebars +16 -0
  111. package/out/views/login.handlebars +331 -0
  112. package/out/views/main.handlebars +1901 -0
  113. package/out/views/oauth.handlebars +11 -0
  114. package/out/views/partials/head.handlebars +53 -0
  115. package/out/views/subscription.handlebars +26 -0
  116. package/package.json +11 -12
  117. package/out/storage/d1.d.ts +0 -99
  118. package/out/storage/d1.js +0 -769
  119. package/out/util/jsx-renderer.d.ts +0 -6
  120. package/out/util/jsx-renderer.js +0 -13
  121. package/out/util/static-files.d.ts +0 -19
  122. package/out/util/static-files.js +0 -82
  123. package/out/views/AboutPage.d.ts +0 -9
  124. package/out/views/AboutPage.js +0 -79
  125. package/out/views/ErrorPage.d.ts +0 -18
  126. package/out/views/ErrorPage.js +0 -56
  127. package/out/views/FormPage.d.ts +0 -13
  128. package/out/views/FormPage.js +0 -27
  129. package/out/views/InstallPage.d.ts +0 -10
  130. package/out/views/InstallPage.js +0 -22
  131. package/out/views/LoginPage.d.ts +0 -33
  132. package/out/views/LoginPage.js +0 -199
  133. package/out/views/MainPage.d.ts +0 -79
  134. package/out/views/MainPage.js +0 -1613
  135. package/out/views/OAuthPage.d.ts +0 -7
  136. package/out/views/OAuthPage.js +0 -17
  137. package/out/views/SubscriptionPage.d.ts +0 -7
  138. package/out/views/SubscriptionPage.js +0 -26
  139. package/out/views/index.d.ts +0 -13
  140. package/out/views/index.js +0 -25
  141. package/out/views/layout/Head.d.ts +0 -9
  142. package/out/views/layout/Head.js +0 -54
@@ -1,6 +0,0 @@
1
- import type { FC } from 'react';
2
- /**
3
- * Renders a React component to HTML string
4
- * Uses React Server-Side Rendering (renderToStaticMarkup)
5
- */
6
- export declare function renderJSX<P = any>(Component: FC<P>, props: P): string;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderJSX = void 0;
4
- const server_1 = require("react-dom/server");
5
- /**
6
- * Renders a React component to HTML string
7
- * Uses React Server-Side Rendering (renderToStaticMarkup)
8
- */
9
- function renderJSX(Component, props) {
10
- const element = Component(props);
11
- return '<!DOCTYPE html>' + (0, server_1.renderToStaticMarkup)(element);
12
- }
13
- exports.renderJSX = renderJSX;
@@ -1,19 +0,0 @@
1
- /**
2
- * Static Files Abstraction Layer
3
- * Dual compatibility: Node.js (Express) + Cloudflare Workers (Assets Fetcher)
4
- */
5
- /// <reference types="serve-static" />
6
- import express, { Request, Response } from 'express';
7
- import { Config, UnauthorizedConfig } from '../types';
8
- /**
9
- * Serve static directory with dual compatibility
10
- * @param config - App configuration
11
- * @param staticPath - Path to static directory
12
- */
13
- export declare function serveStatic(config: Config | UnauthorizedConfig, staticPath: string): ((req: Request, res: Response, next: Function) => Promise<void>) | import("serve-static").RequestHandler<express.Response<any, Record<string, any>>>;
14
- /**
15
- * Serve single file (e.g., logo.png, icons/star.svg) with dual compatibility
16
- * @param config - App configuration
17
- * @param filePath - Path to file
18
- */
19
- export declare function serveFile(config: Config | UnauthorizedConfig, filePath: string): (req: Request, res: Response, next: Function) => Promise<void>;
@@ -1,82 +0,0 @@
1
- "use strict";
2
- /**
3
- * Static Files Abstraction Layer
4
- * Dual compatibility: Node.js (Express) + Cloudflare Workers (Assets Fetcher)
5
- */
6
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
- return new (P || (P = Promise))(function (resolve, reject) {
9
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
- step((generator = generator.apply(thisArg, _arguments || [])).next());
13
- });
14
- };
15
- var __importDefault = (this && this.__importDefault) || function (mod) {
16
- return (mod && mod.__esModule) ? mod : { "default": mod };
17
- };
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.serveFile = exports.serveStatic = void 0;
20
- const express_1 = __importDefault(require("express"));
21
- const path_1 = __importDefault(require("path"));
22
- /**
23
- * Proxy Workers Assets response to Express response
24
- */
25
- function proxyAssetsResponse(fetcher, assetPath, baseUrl, req, res, next) {
26
- return __awaiter(this, void 0, void 0, function* () {
27
- try {
28
- const assetUrl = new URL(assetPath, baseUrl);
29
- const response = yield fetcher.fetch(assetUrl.toString());
30
- if (!response.ok) {
31
- return next();
32
- }
33
- const body = yield response.arrayBuffer();
34
- const contentType = response.headers.get('content-type');
35
- if (contentType) {
36
- res.setHeader('Content-Type', contentType);
37
- }
38
- res.send(Buffer.from(body));
39
- }
40
- catch (err) {
41
- next(err);
42
- }
43
- });
44
- }
45
- /**
46
- * Serve static directory with dual compatibility
47
- * @param config - App configuration
48
- * @param staticPath - Path to static directory
49
- */
50
- function serveStatic(config, staticPath) {
51
- var _a;
52
- if ((_a = config.assetsConfig) === null || _a === void 0 ? void 0 : _a.fetcher) {
53
- const assetsFetcher = config.assetsConfig.fetcher;
54
- return (req, res, next) => __awaiter(this, void 0, void 0, function* () {
55
- const assetPath = staticPath.startsWith('/') ? `${staticPath}${req.path}` : `/${staticPath}${req.path}`;
56
- yield proxyAssetsResponse(assetsFetcher, assetPath, config.baseUrl, req, res, next);
57
- });
58
- }
59
- const absolutePath = path_1.default.isAbsolute(staticPath) ? staticPath : path_1.default.join(__dirname, staticPath);
60
- return express_1.default.static(absolutePath);
61
- }
62
- exports.serveStatic = serveStatic;
63
- /**
64
- * Serve single file (e.g., logo.png, icons/star.svg) with dual compatibility
65
- * @param config - App configuration
66
- * @param filePath - Path to file
67
- */
68
- function serveFile(config, filePath) {
69
- return (req, res, next) => __awaiter(this, void 0, void 0, function* () {
70
- var _a;
71
- if ((_a = config.assetsConfig) === null || _a === void 0 ? void 0 : _a.fetcher) {
72
- const assetsFetcher = config.assetsConfig.fetcher;
73
- const assetPath = filePath.startsWith('/') ? filePath : `/${filePath}`;
74
- yield proxyAssetsResponse(assetsFetcher, assetPath, config.baseUrl, req, res, next);
75
- }
76
- else {
77
- const absolutePath = path_1.default.isAbsolute(filePath) ? filePath : path_1.default.join(__dirname, filePath);
78
- res.sendFile(absolutePath);
79
- }
80
- });
81
- }
82
- exports.serveFile = serveFile;
@@ -1,9 +0,0 @@
1
- import { FC } from 'react';
2
- interface AboutPageProps {
3
- name: string;
4
- logo: string;
5
- manifest: string;
6
- storeLink?: string;
7
- }
8
- export declare const AboutPage: FC<AboutPageProps>;
9
- export {};
@@ -1,79 +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.AboutPage = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const AboutPage = ({ name, logo, manifest, storeLink }) => (react_1.default.createElement("html", null,
9
- react_1.default.createElement("head", null,
10
- react_1.default.createElement("title", null, name),
11
- react_1.default.createElement("meta", { charSet: "utf-8" }),
12
- react_1.default.createElement("meta", { httpEquiv: "Content-type", content: "text/html; charset=utf-8" }),
13
- react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }),
14
- storeLink && react_1.default.createElement("link", { rel: "canonical", href: storeLink }),
15
- react_1.default.createElement("link", { rel: "stylesheet", href: "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css", integrity: "sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH", crossOrigin: "anonymous" }),
16
- react_1.default.createElement("link", { href: "/assets/css/about.css", media: "screen", rel: "stylesheet", type: "text/css" })),
17
- react_1.default.createElement("body", null,
18
- react_1.default.createElement("header", { id: "header", className: "navbar navbar-expand-lg fixed-top crowdin-navbar" },
19
- react_1.default.createElement("a", { itemProp: "url", className: "navbar-brand crowdin-navbar__logo", href: "https://crowdin.com", title: "Crowdin \u2014 Localization Management Platform" },
20
- react_1.default.createElement("svg", { className: "d-none d-md-block d-lg-block default-logo", width: "180", height: "54", "aria-labelledby": "crowdinLogoTitle" },
21
- react_1.default.createElement("title", { id: "crowdinLogoTitle" }, "Crowdin"),
22
- react_1.default.createElement("image", { className: "d-none d-md-block d-lg-block", href: "/assets/img/crowdin.svg", width: "180", height: "54" })),
23
- react_1.default.createElement("svg", { className: "d-block d-md-none d-lg-none default-logo", width: "173", height: "32" },
24
- react_1.default.createElement("image", { className: "d-block d-md-none d-lg-none", href: "/assets/img/crowdin_small.svg", width: "173", height: "32" }))),
25
- react_1.default.createElement("div", { className: "flex-nowrap justify-content-lg-end ml-auto my-lg-0" },
26
- react_1.default.createElement("div", { className: "pr-0 ml-2 my-2" },
27
- react_1.default.createElement("span", { className: "crowdin-navbar__nav-link contact " },
28
- react_1.default.createElement("a", { title: "Contact", href: "https://crowdin.com/contacts" }, "Contact"))))),
29
- react_1.default.createElement("div", { className: "main" },
30
- react_1.default.createElement("div", { className: "container" },
31
- react_1.default.createElement("div", { className: "row crwd__product-template__header align-items-center" },
32
- react_1.default.createElement("div", { className: "offset-lg-1 col-lg-2 product-single__photo-wrapper crwd__product-single__photo-wrapper" },
33
- react_1.default.createElement("div", { className: "product-single__photo text-center mb-3 mb-lg-0" },
34
- react_1.default.createElement("div", { className: "image-holder" },
35
- react_1.default.createElement("img", { width: "200", src: logo, alt: name, id: "FeaturedImage-product-template", className: "img-fluid lazyloaded ls-is-cached product-featured-img", style: { position: 'unset' } })))),
36
- react_1.default.createElement("div", { className: " col-lg-8 crwd__product-template__header__title-container" },
37
- react_1.default.createElement("div", { className: "product-single__meta" },
38
- react_1.default.createElement("div", { className: "section-header" },
39
- react_1.default.createElement("h1", { className: "product-single__title text-center text-lg-left" },
40
- react_1.default.createElement("span", null, name)),
41
- react_1.default.createElement("div", { className: "description" },
42
- name,
43
- " extends the default functionality available in Crowdin and Crowdin Enterprise by providing additional capabilities to enhance your localization workflows."))))),
44
- react_1.default.createElement("div", { className: "row" },
45
- react_1.default.createElement("div", { className: "offset-lg-1 col-lg-10" },
46
- react_1.default.createElement("p", null, "To install this app, you can use either of the following methods: "),
47
- react_1.default.createElement("ol", null,
48
- react_1.default.createElement("li", null,
49
- "Install it directly from the",
50
- ' ',
51
- react_1.default.createElement("a", { href: "https://store.crowdin.com/", target: "_blank" }, "Crowdin Store"),
52
- ", if available."),
53
- react_1.default.createElement("li", null, "Install it manually using the manifest URL below.")),
54
- react_1.default.createElement("p", null,
55
- "For detailed steps, follow the",
56
- ' ',
57
- react_1.default.createElement("a", { href: "https://support.crowdin.com/developer/crowdin-apps-installation/", target: "_blank" }, "App Installation")),
58
- react_1.default.createElement("div", { className: "mb-3" },
59
- react_1.default.createElement("label", { htmlFor: "manifest-url", className: "form-label" }, "Paste the following manifest URL when prompted during manual installation:"),
60
- react_1.default.createElement("div", { className: "input-group" },
61
- react_1.default.createElement("input", { type: "text", className: "form-control", id: "manifest-url", value: manifest, readOnly: true }),
62
- react_1.default.createElement("button", { className: "btn btn-outline-secondary", type: "button", id: "copy-button" }, "Copy"))),
63
- storeLink && (react_1.default.createElement("div", null,
64
- "Read more about",
65
- ' ',
66
- react_1.default.createElement("a", { href: storeLink, target: "_blank", title: `${name} on Crowdin Store` }, name),
67
- ".")))))),
68
- react_1.default.createElement("script", { dangerouslySetInnerHTML: {
69
- __html: `
70
- document.getElementById('copy-button').addEventListener('click', async () => {
71
- const text = document.getElementById('manifest-url').value;
72
- await navigator.clipboard.writeText(text);
73
- const btn = document.getElementById('copy-button');
74
- btn.textContent = 'Copied!';
75
- setTimeout(() => btn.textContent = 'Copy', 1500);
76
- });
77
- `,
78
- } }))));
79
- exports.AboutPage = AboutPage;
@@ -1,18 +0,0 @@
1
- import { FC } from 'react';
2
- interface Owner {
3
- id: number;
4
- name: string;
5
- }
6
- interface ErrorPageProps {
7
- message: string;
8
- name?: string;
9
- owners?: Owner[] | null;
10
- hideActions?: boolean;
11
- sentryData?: {
12
- dsn: string;
13
- appIdentifier: string;
14
- };
15
- code?: number;
16
- }
17
- export declare const ErrorPage: FC<ErrorPageProps>;
18
- export {};
@@ -1,56 +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.ErrorPage = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const Head_1 = require("./layout/Head");
9
- const ErrorPage = ({ message, name, owners, hideActions, sentryData }) => (react_1.default.createElement("html", { lang: "en" },
10
- react_1.default.createElement(Head_1.Head, { sentryData: sentryData }),
11
- react_1.default.createElement("body", null,
12
- react_1.default.createElement("div", { className: "i_w" },
13
- react_1.default.createElement("div", { className: "error-page" },
14
- react_1.default.createElement("div", null,
15
- react_1.default.createElement("div", { className: "error-page-message" },
16
- react_1.default.createElement("crowdin-h3", null, message),
17
- owners && (react_1.default.createElement(react_1.default.Fragment, null,
18
- react_1.default.createElement("crowdin-p", null, "This integration allows only one connection per project to ensure consistent configuration and prevent file import or synchronization issues."),
19
- owners.length > 1 ? (react_1.default.createElement(react_1.default.Fragment, null,
20
- react_1.default.createElement("crowdin-p", { className: "mt-2" }, "Managed by:"),
21
- react_1.default.createElement("ul", null, owners.map((owner) => (react_1.default.createElement("li", null,
22
- react_1.default.createElement("crowdin-a", { href: "#", onclick: `contactUser(${owner.id})` }, owner.name))))),
23
- react_1.default.createElement("crowdin-p", { className: "mt-2" }, "To request access, please contact one of the project members listed above."))) : (react_1.default.createElement(react_1.default.Fragment, null,
24
- react_1.default.createElement("crowdin-p", { className: "mt-2" },
25
- "Managed by:",
26
- ' ',
27
- react_1.default.createElement("crowdin-a", { href: "#", onclick: `contactUser(${owners[0].id})` }, owners[0].name)),
28
- react_1.default.createElement("crowdin-p", { className: "mt-2" }, "To request access, please contact the project member listed above.")))))),
29
- !hideActions && (react_1.default.createElement("div", { className: "error-page-action" },
30
- react_1.default.createElement("crowdin-button", { outlined: true, onclick: "integrationLogout()" }, "Log out"),
31
- react_1.default.createElement("span", null,
32
- ' ',
33
- "or",
34
- ' ',
35
- react_1.default.createElement("crowdin-a", { href: "https://crowdin.com/contacts", target: "_blank" }, "contact us"),
36
- ' ',
37
- "for help")))))),
38
- react_1.default.createElement("script", { dangerouslySetInnerHTML: {
39
- __html: `
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
- `,
55
- } }))));
56
- exports.ErrorPage = ErrorPage;
@@ -1,13 +0,0 @@
1
- import { FC } from 'react';
2
- interface FormPageProps {
3
- formGetDataUrl: string;
4
- formPostDataUrl: string;
5
- formSchema: string;
6
- formUiSchema: string;
7
- sentryData?: {
8
- dsn: string;
9
- appIdentifier: string;
10
- };
11
- }
12
- export declare const FormPage: FC<FormPageProps>;
13
- export {};
@@ -1,27 +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.FormPage = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const Head_1 = require("./layout/Head");
9
- const FormPage = ({ formGetDataUrl, formPostDataUrl, formSchema, formUiSchema, sentryData }) => (react_1.default.createElement("html", { lang: "en" },
10
- react_1.default.createElement(Head_1.Head, { sentryData: sentryData }),
11
- react_1.default.createElement("body", null,
12
- react_1.default.createElement("div", { className: "i_w", style: { maxWidth: '680px', position: 'relative' } },
13
- react_1.default.createElement("crowdin-card", { id: "card", "is-shadowed": true },
14
- react_1.default.createElement("div", { id: "form" }),
15
- react_1.default.createElement("div", { id: "form-loading" },
16
- react_1.default.createElement("crowdin-progress-indicator", null)))),
17
- react_1.default.createElement("crowdin-toasts", null),
18
- react_1.default.createElement("script", { dangerouslySetInnerHTML: {
19
- __html: `
20
- var formGetDataUrl = '${formGetDataUrl}';
21
- var formPostDataUrl = '${formPostDataUrl}';
22
- var formSchema = ${formSchema};
23
- var formUiSchema = ${formUiSchema};
24
- `,
25
- } }),
26
- react_1.default.createElement("script", { src: "/assets/js/form.js" }))));
27
- exports.FormPage = FormPage;
@@ -1,10 +0,0 @@
1
- import { FC } from 'react';
2
- interface InstallPageProps {
3
- name: string;
4
- sentryData?: {
5
- dsn: string;
6
- appIdentifier: string;
7
- };
8
- }
9
- export declare const InstallPage: FC<InstallPageProps>;
10
- export {};
@@ -1,22 +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.InstallPage = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const Head_1 = require("./layout/Head");
9
- const InstallPage = ({ name, sentryData }) => (react_1.default.createElement("html", { lang: "en" },
10
- react_1.default.createElement(Head_1.Head, { sentryData: sentryData }),
11
- react_1.default.createElement("body", null,
12
- react_1.default.createElement("div", { className: "i_w center" },
13
- react_1.default.createElement("div", null,
14
- react_1.default.createElement("h1", null,
15
- "Looks like ",
16
- name,
17
- " is not installed yet!"),
18
- react_1.default.createElement("p", null,
19
- "Contact your organization administrator to install it. More info on",
20
- ' ',
21
- react_1.default.createElement("a", { href: "https://support.crowdin.com" }, "Link to how to install")))))));
22
- exports.InstallPage = InstallPage;
@@ -1,33 +0,0 @@
1
- import { FC } from 'react';
2
- interface LoginField {
3
- key?: string;
4
- label?: string;
5
- labelHtml?: string;
6
- helpText?: string;
7
- helpTextHtml?: string;
8
- type?: string;
9
- defaultValue?: any;
10
- dependencySettings?: string;
11
- isMulti?: boolean;
12
- isSearchable?: boolean;
13
- options?: Array<{
14
- value: string;
15
- label: string;
16
- }>;
17
- noticeType?: string;
18
- noIcon?: boolean;
19
- accept?: string;
20
- }
21
- interface LoginPageProps {
22
- name: string;
23
- loginFields: LoginField[];
24
- oauthLogin?: boolean;
25
- oauthUrl?: string;
26
- oauthMode?: string;
27
- sentryData?: {
28
- dsn: string;
29
- appIdentifier: string;
30
- };
31
- }
32
- export declare const LoginPage: FC<LoginPageProps>;
33
- export {};
@@ -1,199 +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.LoginPage = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const Head_1 = require("./layout/Head");
9
- const renderField = (field, name) => {
10
- var _a;
11
- if (!field.key) {
12
- // Label-only field
13
- return field.labelHtml ? (react_1.default.createElement("crowdin-p", Object.assign({}, (field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), { dangerouslySetInnerHTML: { __html: field.labelHtml } }))) : (react_1.default.createElement("crowdin-p", Object.assign({}, (field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {})), field.label));
14
- }
15
- const commonProps = Object.assign(Object.assign(Object.assign({ id: field.key, label: field.label }, (field.helpText ? { 'help-text': field.helpText } : {})), (field.helpTextHtml ? { 'help-text-html': field.helpTextHtml } : {})), (field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}));
16
- // Special field types
17
- if (['checkbox', 'select', 'textarea', 'file', 'notice'].includes(field.type || '')) {
18
- switch (field.type) {
19
- case 'checkbox':
20
- return (react_1.default.createElement("crowdin-checkbox", Object.assign({}, commonProps, { value: "false", "use-switch": true }, (field.defaultValue === true ? { checked: String(field.defaultValue) } : {}))));
21
- case 'select':
22
- return (react_1.default.createElement("crowdin-select", Object.assign({}, commonProps, (field.isMulti ? { 'is-multi': true, 'close-on-select': 'false' } : {}), (field.isSearchable ? { 'is-searchable': true } : {})), (_a = field.options) === null || _a === void 0 ? void 0 : _a.map((option) => (react_1.default.createElement("option", Object.assign({ value: option.value }, (field.defaultValue === option.value ? { selected: true } : {})), option.label)))));
23
- case 'textarea':
24
- return (react_1.default.createElement("crowdin-textarea", Object.assign({}, commonProps, { value: field.defaultValue || '' })));
25
- case 'notice':
26
- return (react_1.default.createElement("crowdin-alert", Object.assign({}, (field.noticeType ? { type: field.noticeType } : {}), (field.label ? { title: field.label } : {}), (field.noIcon ? { 'no-icon': String(field.noIcon) } : {}), (field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), { dangerouslySetInnerHTML: { __html: field.helpText || '' } })));
27
- case 'file':
28
- return (react_1.default.createElement("div", { className: "file-field" },
29
- field.helpText && react_1.default.createElement("div", { className: "help-text" }, field.helpText),
30
- field.helpTextHtml && react_1.default.createElement("div", { className: "help-text" }, field.helpTextHtml),
31
- react_1.default.createElement("div", { className: "upload" },
32
- react_1.default.createElement("crowdin-button", { outlined: true, onclick: `uploadFiles('${field.key}');` }, field.label),
33
- react_1.default.createElement("textarea", { hidden: true, id: field.key }),
34
- react_1.default.createElement("input", Object.assign({ id: `store_${field.key}`, "data-id": field.key }, (field.accept ? { accept: field.accept } : {}), { 'onchange': 'readFileData(event)' }, { hidden: true, type: field.type })),
35
- react_1.default.createElement("div", { className: "uploaded-file" },
36
- react_1.default.createElement("i", null, "No file")))));
37
- }
38
- }
39
- // Default input field
40
- return (react_1.default.createElement("crowdin-input", Object.assign({}, commonProps, (field.type ? { type: field.type } : {}), { value: field.defaultValue || '' })));
41
- };
42
- const LoginPage = ({ name, loginFields, oauthLogin, oauthUrl, oauthMode, sentryData }) => (react_1.default.createElement("html", { lang: "en" },
43
- react_1.default.createElement(Head_1.Head, { sentryData: sentryData }),
44
- react_1.default.createElement("body", null,
45
- react_1.default.createElement("div", { className: "i_w center" },
46
- react_1.default.createElement("div", null,
47
- react_1.default.createElement("crowdin-card", { "is-shadowed": true, "is-padding-lg": true, className: "login" },
48
- react_1.default.createElement("img", { alt: `${name} logo`, src: "logo.png" }),
49
- react_1.default.createElement("crowdin-h4", { id: "integration-name" }, name),
50
- react_1.default.createElement("div", { className: "inputs" }, loginFields.map((field) => (react_1.default.createElement(react_1.default.Fragment, null,
51
- renderField(field, name),
52
- react_1.default.createElement("div", Object.assign({ style: { padding: '8px' } }, (field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}))))))),
53
- react_1.default.createElement("crowdin-button", { id: "login-button", outlined: true, "icon-after": "arrow_forward", onclick: oauthLogin ? 'oauthLogin()' : 'integrationLogin()' },
54
- "Log In With ",
55
- name)))),
56
- react_1.default.createElement("crowdin-toasts", null),
57
- react_1.default.createElement("script", { type: "text/javascript", dangerouslySetInnerHTML: {
58
- __html: `
59
- const loginButton = document.querySelector('#login-button');
60
- let refreshIntervalId;
61
-
62
- function oauthLogin() {
63
- const url = ${oauthUrl ? `'${oauthUrl}'` : 'undefined'};
64
- if (url) {
65
- openOAuthPopup(url);
66
- return;
67
- }
68
- loginButton.setAttribute('disabled', true);
69
- loginButton.setAttribute('is-loading', true);
70
- checkOrigin()
71
- .then(queryParams =>
72
- fetch(\`api/oauth-url\${queryParams}\`, {
73
- method: 'POST',
74
- headers: { 'Content-Type': 'application/json' },
75
- body: JSON.stringify({ loginForm: getLoginForm() })
76
- })
77
- )
78
- .then(checkResponse)
79
- .then(res => openOAuthPopup(res.url))
80
- .catch(e => {
81
- loginButton.setAttribute('disabled', false);
82
- loginButton.setAttribute('is-loading', false);
83
- catchRejection(e, 'Can\\'t get oauth token');
84
- });
85
- }
86
-
87
- function openOAuthPopup(url) {
88
- const oauthMode = ${oauthMode ? `'${oauthMode}'` : 'undefined'};
89
- const oauthWindow = window.open(url, '${name}', 'location=0,status=0,width=800,height=400');
90
-
91
- if (oauthMode === 'polling') {
92
- if (refreshIntervalId) {
93
- clearInterval(refreshIntervalId);
94
- }
95
- refreshIntervalId = setInterval(() =>
96
- checkOrigin()
97
- .then(queryParams =>
98
- fetch(\`api/oauth-polling\${queryParams}\`, { method: 'POST' })
99
- )
100
- .then(checkResponse)
101
- .then(res => {
102
- if (res.oauthCreds) {
103
- integrationLogin({
104
- refreshToken: res.oauthCreds.refreshToken,
105
- accessToken: res.oauthCreds.accessToken,
106
- expireIn: res.oauthCreds.expireIn,
107
- timestamp: res.oauthCreds.timestamp
108
- });
109
- if (refreshIntervalId) {
110
- clearInterval(refreshIntervalId);
111
- }
112
- }
113
- }), 2000);
114
- return;
115
- }
116
-
117
- postPromises['oauth_popup'] = {
118
- resolve: (data) => {
119
- if (data.error) {
120
- showToast(data.error);
121
- return;
122
- }
123
- integrationLogin({
124
- refreshToken: data.refreshToken,
125
- accessToken: data.accessToken,
126
- expireIn: data.expireIn,
127
- timestamp: data.timestamp
128
- });
129
- }
130
- }
131
- }
132
-
133
- function integrationLogin(oauthCredentials) {
134
- const credentials = oauthCredentials || getLoginForm();
135
- loginButton.setAttribute('disabled', true);
136
- loginButton.setAttribute('is-loading', true);
137
- checkOrigin()
138
- .then(queryParams =>
139
- fetch(\`api/login\${queryParams}\`, {
140
- method: 'POST',
141
- headers: { 'Content-Type': 'application/json' },
142
- body: JSON.stringify({ credentials })
143
- })
144
- )
145
- .then(checkResponse)
146
- .then(localStorage.removeItem('revised_${name}'))
147
- .then(reloadLocation)
148
- .catch(e => {
149
- loginButton.setAttribute('disabled', false);
150
- loginButton.setAttribute('is-loading', false);
151
- catchRejection(e, 'Credentials are not stored');
152
- });
153
- }
154
-
155
- function getLoginForm() {
156
- return {
157
- ${loginFields
158
- .filter((f) => f.key)
159
- .map((f) => {
160
- if (f.type === 'checkbox') {
161
- return `'${f.key}': !!document.querySelector('#${f.key}').checked`;
162
- }
163
- return `'${f.key}': document.querySelector('#${f.key}').getAttribute('value') || document.querySelector('#${f.key}').value`;
164
- })
165
- .join(',\n ')}
166
- };
167
- }
168
-
169
- function uploadFiles(id) {
170
- const input = document.querySelector(\`#store_\${id}\`);
171
- input.value = '';
172
- input.click();
173
- }
174
-
175
- function readFileData(event) {
176
- const reader = new FileReader();
177
- const identifier = event.target.getAttribute('data-id');
178
- const fileName = document.querySelector('.uploaded-file');
179
- const input = document.querySelector(\`#\${identifier}\`);
180
- const file = event.target.files[0];
181
- fileName.innerText = file.name;
182
-
183
- reader.onloadstart = function() {
184
- loginButton.setAttribute('disabled', true);
185
- loginButton.setAttribute('is-loading', true);
186
- };
187
- reader.onloadend = function() {
188
- loginButton.setAttribute('disabled', false);
189
- loginButton.setAttribute('is-loading', false);
190
- };
191
-
192
- reader.onload = () => {
193
- input.value = reader.result;
194
- };
195
- reader.readAsText(file);
196
- }
197
- `,
198
- } }))));
199
- exports.LoginPage = LoginPage;