@crowdin/app-project-module 0.106.0 → 0.107.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 (161) hide show
  1. package/out/app-test/integration/get-integration-files.js +0 -1
  2. package/out/app-test/integration/mocks/mock-axios.js +0 -1
  3. package/out/app-test/integration/update-crowdin.js +0 -1
  4. package/out/app-test/integration/update-integration.js +0 -1
  5. package/out/index.d.ts +1 -0
  6. package/out/index.js +30 -12
  7. package/out/middlewares/crowdin-client.d.ts +1 -1
  8. package/out/middlewares/integration-credentials.d.ts +1 -1
  9. package/out/middlewares/integration-credentials.js +4 -1
  10. package/out/middlewares/render-ui-module.d.ts +3 -3
  11. package/out/middlewares/render-ui-module.js +9 -13
  12. package/out/middlewares/ui-module.d.ts +1 -1
  13. package/out/middlewares/ui-module.js +10 -1
  14. package/out/modules/about.d.ts +2 -1
  15. package/out/modules/about.js +10 -3
  16. package/out/modules/ai-prompt-provider/handlers/compile.d.ts +1 -1
  17. package/out/modules/ai-prompt-provider/index.js +2 -2
  18. package/out/modules/ai-provider/handlers/chat-completions.d.ts +1 -1
  19. package/out/modules/ai-provider/handlers/chat-completions.js +0 -1
  20. package/out/modules/ai-provider/handlers/get-model-list.d.ts +1 -1
  21. package/out/modules/ai-provider/index.js +2 -2
  22. package/out/modules/ai-provider/types.d.ts +2 -2
  23. package/out/modules/ai-provider/util/index.js +0 -2
  24. package/out/modules/ai-request-processors/handler.d.ts +1 -1
  25. package/out/modules/ai-tools/handlers/tool-calls.d.ts +1 -1
  26. package/out/modules/ai-tools/index.js +1 -1
  27. package/out/modules/api/api.js +0 -1
  28. package/out/modules/auth-guard/handlers/verify.d.ts +1 -1
  29. package/out/modules/auth-guard/index.js +1 -1
  30. package/out/modules/automation-action/handlers/execute.d.ts +1 -1
  31. package/out/modules/automation-action/handlers/input-schema.d.ts +1 -1
  32. package/out/modules/automation-action/handlers/output-schema.d.ts +1 -1
  33. package/out/modules/automation-action/handlers/validate-settings.d.ts +1 -1
  34. package/out/modules/automation-action/index.js +1 -1
  35. package/out/modules/context-menu/index.js +2 -2
  36. package/out/modules/custom-mt/handlers/translate.d.ts +2 -2
  37. package/out/modules/custom-mt/handlers/translate.js +53 -4
  38. package/out/modules/custom-mt/index.js +6 -3
  39. package/out/modules/custom-mt/types.d.ts +14 -2
  40. package/out/modules/custom-spell-check/handlers/get-languages-list.d.ts +1 -1
  41. package/out/modules/custom-spell-check/handlers/spell-check.d.ts +1 -1
  42. package/out/modules/custom-spell-check/index.js +4 -4
  43. package/out/modules/editor-right-panel/index.js +1 -1
  44. package/out/modules/external-qa-check/handlers/validate.d.ts +1 -1
  45. package/out/modules/external-qa-check/index.js +2 -2
  46. package/out/modules/file-processing/handlers/custom-file-format.d.ts +7 -2
  47. package/out/modules/file-processing/handlers/custom-file-format.js +59 -19
  48. package/out/modules/file-processing/handlers/file-download.d.ts +1 -1
  49. package/out/modules/file-processing/handlers/file-download.js +5 -0
  50. package/out/modules/file-processing/handlers/pre-post-process.d.ts +1 -1
  51. package/out/modules/file-processing/handlers/pre-post-process.js +34 -14
  52. package/out/modules/file-processing/handlers/translations-alignment.d.ts +1 -1
  53. package/out/modules/file-processing/index.js +12 -2
  54. package/out/modules/file-processing/util/defaults.js +50 -6
  55. package/out/modules/file-processing/util/files.js +2 -1
  56. package/out/modules/form-data-display.d.ts +1 -1
  57. package/out/modules/form-data-save.d.ts +1 -1
  58. package/out/modules/install.d.ts +1 -1
  59. package/out/modules/integration/handlers/crowdin-file-progress.d.ts +1 -1
  60. package/out/modules/integration/handlers/crowdin-files.d.ts +1 -1
  61. package/out/modules/integration/handlers/crowdin-project.d.ts +1 -1
  62. package/out/modules/integration/handlers/crowdin-update.d.ts +1 -1
  63. package/out/modules/integration/handlers/crowdin-webhook.d.ts +1 -1
  64. package/out/modules/integration/handlers/integration-data.d.ts +1 -1
  65. package/out/modules/integration/handlers/integration-login.d.ts +1 -1
  66. package/out/modules/integration/handlers/integration-logout.d.ts +1 -1
  67. package/out/modules/integration/handlers/integration-update.d.ts +1 -1
  68. package/out/modules/integration/handlers/integration-webhook.d.ts +1 -1
  69. package/out/modules/integration/handlers/invite-users.d.ts +1 -1
  70. package/out/modules/integration/handlers/job-cancel.d.ts +1 -1
  71. package/out/modules/integration/handlers/job-info-deprecated.d.ts +1 -1
  72. package/out/modules/integration/handlers/job-info.d.ts +1 -1
  73. package/out/modules/integration/handlers/job-list.d.ts +1 -1
  74. package/out/modules/integration/handlers/main.d.ts +1 -1
  75. package/out/modules/integration/handlers/main.js +13 -1
  76. package/out/modules/integration/handlers/oauth-login.d.ts +1 -1
  77. package/out/modules/integration/handlers/oauth-login.js +10 -2
  78. package/out/modules/integration/handlers/oauth-polling.d.ts +1 -1
  79. package/out/modules/integration/handlers/oauth-url.d.ts +1 -1
  80. package/out/modules/integration/handlers/settings-save.d.ts +1 -1
  81. package/out/modules/integration/handlers/settings.d.ts +1 -1
  82. package/out/modules/integration/handlers/sync-settings-save.d.ts +1 -1
  83. package/out/modules/integration/handlers/sync-settings-save.js +0 -2
  84. package/out/modules/integration/handlers/sync-settings.d.ts +1 -1
  85. package/out/modules/integration/handlers/user-errors.d.ts +1 -1
  86. package/out/modules/integration/handlers/users.d.ts +1 -1
  87. package/out/modules/integration/index.js +12 -33
  88. package/out/modules/integration/util/cron.js +1 -10
  89. package/out/modules/integration/util/job.js +0 -4
  90. package/out/modules/integration/util/snapshot.js +1 -5
  91. package/out/modules/integration/util/webhooks.js +1 -8
  92. package/out/modules/manifest.js +15 -13
  93. package/out/modules/modal/index.js +2 -2
  94. package/out/modules/organization-menu/index.js +5 -4
  95. package/out/modules/organization-settings-menu/index.js +5 -4
  96. package/out/modules/profile-resources-menu/index.js +5 -4
  97. package/out/modules/profile-settings-menu/index.js +5 -4
  98. package/out/modules/project-menu/index.js +1 -1
  99. package/out/modules/project-menu-crowdsource/index.js +1 -1
  100. package/out/modules/project-reports/index.js +3 -2
  101. package/out/modules/project-tools/index.js +3 -2
  102. package/out/modules/status.d.ts +1 -1
  103. package/out/modules/status.js +12 -3
  104. package/out/modules/subscription-paid.d.ts +1 -1
  105. package/out/modules/uninstall.d.ts +1 -1
  106. package/out/modules/webhooks/handlers/webhook-handler.d.ts +1 -1
  107. package/out/modules/webhooks/handlers/webhook-handler.js +30 -15
  108. package/out/modules/webhooks/types.d.ts +7 -0
  109. package/out/modules/workflow-step-type/handlers/delete-step.d.ts +1 -1
  110. package/out/modules/workflow-step-type/handlers/step-settings-save.d.ts +1 -1
  111. package/out/modules/workflow-step-type/index.js +2 -2
  112. package/out/storage/d1.d.ts +107 -0
  113. package/out/storage/d1.js +829 -0
  114. package/out/storage/index.js +8 -2
  115. package/out/storage/mysql.js +0 -3
  116. package/out/storage/postgre.js +0 -1
  117. package/out/storage/sqlite.js +0 -3
  118. package/out/types.d.ts +41 -2
  119. package/out/util/axios.js +0 -1
  120. package/out/util/credentials-masker.d.ts +1 -1
  121. package/out/util/cron.d.ts +29 -0
  122. package/out/util/cron.js +87 -0
  123. package/out/util/index.d.ts +12 -1
  124. package/out/util/index.js +54 -6
  125. package/out/util/jsx-renderer.d.ts +6 -0
  126. package/out/util/jsx-renderer.js +13 -0
  127. package/out/util/logger.js +0 -4
  128. package/out/util/static-files.d.ts +19 -0
  129. package/out/util/static-files.js +87 -0
  130. package/out/views/AboutPage.d.ts +10 -0
  131. package/out/views/AboutPage.js +76 -0
  132. package/out/views/ErrorPage.d.ts +18 -0
  133. package/out/views/ErrorPage.js +56 -0
  134. package/out/views/FormPage.d.ts +14 -0
  135. package/out/views/FormPage.js +28 -0
  136. package/out/views/InstallPage.d.ts +10 -0
  137. package/out/views/InstallPage.js +22 -0
  138. package/out/views/LoginPage.d.ts +33 -0
  139. package/out/views/LoginPage.js +200 -0
  140. package/out/views/MainPage.d.ts +81 -0
  141. package/out/views/MainPage.js +1784 -0
  142. package/out/views/OAuthPage.d.ts +7 -0
  143. package/out/views/OAuthPage.js +17 -0
  144. package/out/views/SubscriptionPage.d.ts +7 -0
  145. package/out/views/SubscriptionPage.js +26 -0
  146. package/out/views/index.d.ts +13 -0
  147. package/out/views/index.js +25 -0
  148. package/out/views/layout/Head.d.ts +9 -0
  149. package/out/views/layout/Head.js +54 -0
  150. package/package.json +33 -18
  151. package/out/util/handlebars.d.ts +0 -1
  152. package/out/util/handlebars.js +0 -46
  153. package/out/views/about.handlebars +0 -102
  154. package/out/views/error.handlebars +0 -54
  155. package/out/views/form.handlebars +0 -31
  156. package/out/views/install.handlebars +0 -16
  157. package/out/views/login.handlebars +0 -332
  158. package/out/views/main.handlebars +0 -2042
  159. package/out/views/oauth.handlebars +0 -11
  160. package/out/views/partials/head.handlebars +0 -53
  161. package/out/views/subscription.handlebars +0 -26
@@ -0,0 +1,76 @@
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, showDebugLink }) => (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
+ storeLink && (react_1.default.createElement("div", null,
63
+ "Read more about",
64
+ ' ',
65
+ react_1.default.createElement("a", { href: storeLink, target: "_blank", title: `${name} on Crowdin Store` }, name),
66
+ ".")),
67
+ showDebugLink && (react_1.default.createElement("div", { className: "mt-4 pt-3 border-top" },
68
+ react_1.default.createElement("p", { className: "mb-2" },
69
+ react_1.default.createElement("strong", null, "Developer Tools")),
70
+ react_1.default.createElement("p", null,
71
+ "Access the",
72
+ ' ',
73
+ react_1.default.createElement("a", { href: "/__debug", target: "_blank", title: "Open developer console in a new tab" }, "Developer Console"),
74
+ ' ',
75
+ "to inspect requests, debug issues, and monitor application behavior."))))))))));
76
+ exports.AboutPage = AboutPage;
@@ -0,0 +1,18 @@
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 {};
@@ -0,0 +1,56 @@
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;
@@ -0,0 +1,14 @@
1
+ import { FC } from 'react';
2
+ interface FormPageProps {
3
+ formGetDataUrl: string;
4
+ formPostDataUrl: string;
5
+ formPatchDataUrl?: string;
6
+ formSchema: string;
7
+ formUiSchema: string;
8
+ sentryData?: {
9
+ dsn: string;
10
+ appIdentifier: string;
11
+ };
12
+ }
13
+ export declare const FormPage: FC<FormPageProps>;
14
+ export {};
@@ -0,0 +1,28 @@
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, formPatchDataUrl, 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 formPatchDataUrl = '${formPatchDataUrl}';
23
+ var formSchema = ${formSchema};
24
+ var formUiSchema = ${formUiSchema};
25
+ `,
26
+ } }),
27
+ react_1.default.createElement("script", { src: "/assets/js/form.js" }))));
28
+ exports.FormPage = FormPage;
@@ -0,0 +1,10 @@
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 {};
@@ -0,0 +1,22 @@
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;
@@ -0,0 +1,33 @@
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 {};
@@ -0,0 +1,200 @@
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
+ const errorMessage = e.message || 'Credentials are not stored';
150
+ loginButton.setAttribute('disabled', false);
151
+ loginButton.setAttribute('is-loading', false);
152
+ catchRejection(e, errorMessage);
153
+ });
154
+ }
155
+
156
+ function getLoginForm() {
157
+ return {
158
+ ${loginFields
159
+ .filter((f) => f.key)
160
+ .map((f) => {
161
+ if (f.type === 'checkbox') {
162
+ return `'${f.key}': !!document.querySelector('#${f.key}').checked`;
163
+ }
164
+ return `'${f.key}': document.querySelector('#${f.key}').getAttribute('value') || document.querySelector('#${f.key}').value`;
165
+ })
166
+ .join(',\n ')}
167
+ };
168
+ }
169
+
170
+ function uploadFiles(id) {
171
+ const input = document.querySelector(\`#store_\${id}\`);
172
+ input.value = '';
173
+ input.click();
174
+ }
175
+
176
+ function readFileData(event) {
177
+ const reader = new FileReader();
178
+ const identifier = event.target.getAttribute('data-id');
179
+ const fileName = document.querySelector('.uploaded-file');
180
+ const input = document.querySelector(\`#\${identifier}\`);
181
+ const file = event.target.files[0];
182
+ fileName.innerText = file.name;
183
+
184
+ reader.onloadstart = function() {
185
+ loginButton.setAttribute('disabled', true);
186
+ loginButton.setAttribute('is-loading', true);
187
+ };
188
+ reader.onloadend = function() {
189
+ loginButton.setAttribute('disabled', false);
190
+ loginButton.setAttribute('is-loading', false);
191
+ };
192
+
193
+ reader.onload = () => {
194
+ input.value = reader.result;
195
+ };
196
+ reader.readAsText(file);
197
+ }
198
+ `,
199
+ } }))));
200
+ exports.LoginPage = LoginPage;
@@ -0,0 +1,81 @@
1
+ import { FC } from 'react';
2
+ interface ConfigField {
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
+ }
20
+ interface ConfigurationTab {
21
+ name: string;
22
+ fields: ConfigField[];
23
+ }
24
+ interface Notice {
25
+ title: string;
26
+ content: string;
27
+ type?: string;
28
+ icon?: boolean;
29
+ close?: boolean;
30
+ }
31
+ interface InfoModal {
32
+ title: string;
33
+ content: string;
34
+ }
35
+ interface MainPageProps {
36
+ name: string;
37
+ userId?: string;
38
+ notice?: Notice;
39
+ checkSubscription?: boolean;
40
+ isManager?: boolean;
41
+ isOwner?: boolean;
42
+ infoModal?: InfoModal;
43
+ configurationFields?: ConfigurationTab[];
44
+ config?: string;
45
+ syncNewElements?: {
46
+ crowdin?: boolean;
47
+ integration?: boolean;
48
+ };
49
+ withCronSync?: {
50
+ crowdin?: boolean;
51
+ integration?: boolean;
52
+ };
53
+ webhooks?: {
54
+ crowdin?: boolean;
55
+ integration?: boolean;
56
+ };
57
+ integrationOneLevelFetching?: boolean;
58
+ integrationSearchListener?: boolean;
59
+ integrationPagination?: boolean;
60
+ uploadTranslations?: boolean;
61
+ excludedTargetLanguages?: boolean;
62
+ forcePushSources?: boolean;
63
+ forcePushTranslations?: boolean;
64
+ filtering?: {
65
+ crowdinLanguages?: boolean;
66
+ integrationFilterConfig?: string;
67
+ };
68
+ hasOrganization?: boolean;
69
+ zenModeUrl?: string;
70
+ asyncProgress?: {
71
+ checkInterval: number;
72
+ };
73
+ reloadOnConfigSave?: boolean;
74
+ progressiveCrowdinFilesLoading?: boolean;
75
+ sentryData?: {
76
+ dsn: string;
77
+ appIdentifier: string;
78
+ };
79
+ }
80
+ export declare const MainPage: FC<MainPageProps>;
81
+ export {};