From 932d9e1df06dd5f004b9fa5fdfd8150b585b8aaf Mon Sep 17 00:00:00 2001 From: SalvadorDalia <160152594+SalvadorDalia@users.noreply.github.com> Date: Thu, 5 Dec 2024 17:24:18 +0100 Subject: [PATCH] Initial commit --- .dev/localhost.cert | 29 + .dev/localhost.key | 52 ++ .editorconfig | 9 + .eslintignore | 4 + .eslintrc.cjs | 40 + .github/workflows/build.yml | 48 ++ .gitignore | 2 + .vscode/settings.json | 6 + Readme.md | 56 ++ common/api-helpers.js | 17 + common/plugin-element-cache.js | 27 + esbuild.config.js | 201 +++++ package.json | 22 + plugin-manifest.json | 15 + plugins/grid-renderers/index.js | 62 ++ plugins/index.js | 20 + plugins/styles/RobotoMono-Medium.ttf | Bin 0 -> 87172 bytes plugins/styles/style.css | 8 + yarn.lock | 1124 ++++++++++++++++++++++++++ 19 files changed, 1742 insertions(+) create mode 100644 .dev/localhost.cert create mode 100644 .dev/localhost.key create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.cjs create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 Readme.md create mode 100644 common/api-helpers.js create mode 100644 common/plugin-element-cache.js create mode 100644 esbuild.config.js create mode 100644 package.json create mode 100644 plugin-manifest.json create mode 100644 plugins/grid-renderers/index.js create mode 100644 plugins/index.js create mode 100644 plugins/styles/RobotoMono-Medium.ttf create mode 100644 plugins/styles/style.css create mode 100644 yarn.lock diff --git a/.dev/localhost.cert b/.dev/localhost.cert new file mode 100644 index 0000000..9194b7d --- /dev/null +++ b/.dev/localhost.cert @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCzCCAvOgAwIBAgIUfLvXiw1GaycV+Ya/jmJ54EqjEb0wDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJMTI3LjAuMC4xMCAXDTI0MDIxNTEyMDMxM1oYDzIwNTEw +NzAyMTIwMzEzWjAUMRIwEAYDVQQDDAkxMjcuMC4wLjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDDdhdcQr1JGffkrBK7zDukb79YkD5Hg1FWWgByztdv +dc0jvEnGLqkgaL8NYlmZqh5NRZ7ncp/A3C01wxGMAL1jhjcX56wt0hQRdszGdi0J +XN8Ixqa2JLcNn20D4152HPgB7F/JlTPviW4Bws67sUs3JT0wrdjtx77rg4tPCL/S +qP6N21EHXokVnwQHkFh/MUx1+agHDZL6U9iB0MKVErL/q2HLibQfjkJs5Y6kzdQQ +WwVwbZul8XzEi9lU90hnBqT4wvDxYYzKZD+o4965B0ThhDbuYN8J4VCLE1mOLlhC +bpKfMdwA3Un881MgWQXImGseAu1vYN7a8P3xy1LsLdjb6Du86/fQ8SL3YfH+wlw6 +5eQ2J3KYheQgpwlpmIvjLNFqc72ymCIjcWWfW7gT81XmdfhlKObo8HQdrp1uMrSN +78xRLu9kRmL1iqHgqTF8kn3jUAGPr5EoUyzf8z8cX2Px0B7y8x/o845+CySHenZv +AMkxA7N46c4M7o8kwHHm79dQO0Ep6dyiCTTII+DWe5BpbNlq1ddWynk5Rc2KQrvT +oBV0cLpjvXQAlWB9YzqG6J4tvnfO3RjgUNgxfSDF2XW2Wi1mtnsk8m4NDGgOjLz0 +lVrPaeEXMDWiofpuMMW02MIYGTTYSFvO/TPO06tjVxq2jDshoUNS9faRhSxuOCEP +CQIDAQABo1MwUTAdBgNVHQ4EFgQU7UYziQNqS7MqiGXjxN5KDKz784UwHwYDVR0j +BBgwFoAU7UYziQNqS7MqiGXjxN5KDKz784UwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQsFAAOCAgEAgZGo35kJFFEYS1iBHeLuo/7grrA2wcjR4e2eONKq21QU +FJfbp+CpWkvMjq0SBq174KgfNpGrKD5KnfpBJoVD/9s43XGSCDzitZeW2mQtQ3uD +nMYWGNE2rceZWmdDOKhhKMeDRdfososIdtFxBYW6nS9Znx2IwAvlDeOobmwgmUzb +C2Y0S3lUnwQ2E7WStIN7zm43aFVRgigIm71sSWKpQoCfoy63ETG4m2q7uu/Ldw3y +vGF2KA//ThrjWljqNu3xIRaSFWYhKJ6/Y78NNsg5vIoiI+Wk4PigY8Z3UQWdGjmW +9tZG7SAN2b4s6Zan2fbF3R4q6H3x3N3ZsjKVlBroyaOLN4WFABIHbU81ggFxIsFO +6RXHfNGDuPuYTrtlogvJ47nI4C5WeUFDWFcZQQ7BrS9ewZcLI5fOvejjlFqvSl87 +Y1StpTgVUEFL08bdjyFtAw7miJeofyT8bO1m/0Hg+snBtvBCCAJxflSVuySLp5Bi +EtFxi53J+kezvRm64Y9ub61NGatXUAuPr7Z0P58ES6MgpoYgzUGeybV97MpDsRQb +ze3fzqL5rE3Upb2asgINWjAXDM2Qhr8aY0OVKJQ1P4c+yyddlb3vzNfw0G5W0bsJ +na+/Pfz1M60k1OxsWUGXWOPIEi29VeERDzSwhC4zShPAKYIlqrUpMunHoAGlGvM= +-----END CERTIFICATE----- diff --git a/.dev/localhost.key b/.dev/localhost.key new file mode 100644 index 0000000..d610506 --- /dev/null +++ b/.dev/localhost.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +0C66dFZAOvWn1oIUWWms2ytx0rg7sA== +-----END PRIVATE KEY----- diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1faf6fa --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +end_of_line = lf + +[*.{js,jsx,mdx,ts,json,mjs,css}] +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..08826a5 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules +dist +.eslintrc.cjs +esbuild.config.js \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..abbe4b7 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,40 @@ +module.exports = { + root: true, + env: { + browser: true, + es6: true, + }, + extends: ["eslint:recommended", "prettier"], + parserOptions: { + sourceType: "module", + ecmaVersion: 2020, + }, + rules: { + "no-unused-vars": ["warn", { argsIgnorePattern: "^_" }], + "linebreak-style": 0, + + /* This rule will warn when it encounters a reference to an identifier that has not yet been declared. */ + "no-use-before-define": [ + "error", + { + variables: false, + }, + ], + + /* Enforce require() on the top-level module scope */ + "global-require": 0, + + "max-len": [ + "error", + { + code: 120, + }, + ], + + "guard-for-in": 0, + "no-underscore-dangle": 0, + "import/prefer-default-export": 0, + "import/no-anonymous-default-export": 0, + "import/no-extraneous-dependencies": 0, + }, +}; diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..d0c8e23 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,48 @@ +name: Build & Release + +permissions: + contents: write + +on: + push: + branches: [ main ] + workflow_dispatch: + pull_request: + +jobs: + build-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js 18.x + uses: actions/setup-node@v4 + with: + node-version: 18.x + - run: yarn + - run: yarn build + - name: Create tar from built plugin + run: | + BUILDFOLDER="dist" + MANIFEST=$(find ./$BUILDFOLDER -name plugin-manifest.json) + [ -z $MANIFEST ] && cp plugin-manifest $BUILDFOLDER + MANIFEST="$BUILDFOLDER/plugin-manifest.json" + VERSION=$(jq '.version' $MANIFEST -r) + echo "version=$VERSION" + mkdir -p output + tar -C $BUILDFOLDER -czf output/$VERSION.tar.gz . + ls -la output + echo "version=$VERSION" >> $GITHUB_ENV + - name: Create artifact + uses: actions/upload-artifact@v4 + with: + name: plugin-package + path: output + - name: Release built plugin + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: output/* + tag: ${{ env.version }} + overwrite: true + file_glob: true + if: github.ref == 'refs/heads/main' \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76add87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..77d612e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "[css][scss][javascript][typescript][javascriptreact][typescriptreact][json][mdx][html]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, +} \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..1ff1d8b --- /dev/null +++ b/Readme.md @@ -0,0 +1,56 @@ +[[_TOC_]] + +# Plain JS Plugin + +## Quick start + +1. `yarn` - to install dependencies +2. `yarn start` - to start development mode - rebuild on file modifications +3. update your `plugin-manifest.json` file to contain the production URL and other plugin information +4. `yarn build` - to build plugins + +## Dev environment + +Dev environment is configured to use: + +* `prettier` - best used with automatic format on save in IDE +* `eslint` - it is built into both `start` and `build` commands + +## Output + +The plugins are built into a single `dist/index.js` file. The manifest is copied to `dist/plugin-manifest.json` file. + +## Deployment + + + +## Loading the plugin + +**Warning:** While developing, you can use `https://localhost:3053/plugin-manifest.json` address to load the plugin manifest. Make sure your browser trusts the local certificate on the latter, to be able to use it e.g. with `https://editor.flotiq.com` + +### URL + +**Hint**: You can use localhost url from development mode `https://localhost:3053/index.js` + +1. Open Flotiq editor +2. Open Chrome Dev console +3. Execute the following script + ```javascript + FlotiqPlugins.loadPlugin('plugin-id', '') + ``` +4. Navigate to the view that is modified by the plugin + +### Directly + +1. Open Flotiq editor +2. Open Chrome Dev console +3. Paste the content of `dist/index.js` +4. Navigate to the view that is modified by the plugin + +### Deployment + +**Hint**: You can use localhost url from development mode `https://localhost:3053/plugin-manifest.json` + +1. Open Flotiq editor +2. Add a new plugin and paste the URL to the hosted `plugin-manifest.json` file +3. Navigate to the view that is modified by the plugin diff --git a/common/api-helpers.js b/common/api-helpers.js new file mode 100644 index 0000000..06f87cd --- /dev/null +++ b/common/api-helpers.js @@ -0,0 +1,17 @@ +const cachedRelationData = {}; + +const getRelationData = (client, dataUrl) => { + if (!dataUrl) return null; + if (cachedRelationData[dataUrl]) return cachedRelationData[dataUrl]; + const { contentTypeName, id } = dataUrl.match( + /(?[^/]+)\/(?[^/]+)$/, + ).groups; + + cachedRelationData[dataUrl] = client[contentTypeName] + .get(id) + .then(({ body }) => body); + + return cachedRelationData[dataUrl]; +}; + +export { getRelationData }; diff --git a/common/plugin-element-cache.js b/common/plugin-element-cache.js new file mode 100644 index 0000000..eb43a2c --- /dev/null +++ b/common/plugin-element-cache.js @@ -0,0 +1,27 @@ +const appRoots = {}; + +export const addElementToCache = (element, key, data = {}) => { + appRoots[key] = { + element, + data, + }; + + element.addEventListener('flotiq.detached', () => { + setTimeout(() => { + return delete appRoots[key]; + }, 50); + }); +}; + +export const getCachedElement = (key) => { + return appRoots[key]; +}; + +export const registerFn = (pluginInfo, callback) => { + if (window.FlotiqPlugins?.add) { + window.FlotiqPlugins.add(pluginInfo, callback); + return; + } + if (!window.initFlotiqPlugins) window.initFlotiqPlugins = []; + window.initFlotiqPlugins.push({ pluginInfo, callback }); +}; diff --git a/esbuild.config.js b/esbuild.config.js new file mode 100644 index 0000000..6c73442 --- /dev/null +++ b/esbuild.config.js @@ -0,0 +1,201 @@ +import chalk from "chalk"; +import * as esbuild from "esbuild"; +import eslint from "esbuild-plugin-eslint"; +import inlineImportPlugin from "esbuild-plugin-inline-import"; +import url from "postcss-url"; +import postcss from "postcss"; +import { copy } from "esbuild-plugin-copy"; + +import http from "node:http"; +import https from "node:https"; +import fs from "fs"; + +const watch = process.argv.includes("--watch"); + +function formatDuration(seconds) { + const time = { + y: 31536000, + d: 86400, + h: 3600, + m: 60, + s: 1, + ms: 0.001, + }, + res = []; + + if (seconds === 0) return "now"; + + for (let key in time) { + if (seconds >= time[key]) { + let val = Math.floor(seconds / time[key]); + res.push((val += key)); + seconds = seconds % time[key]; + } + } + + return res.length > 1 + ? res.join(", ").replace(/,([^,]*)$/, " and" + "$1") + : res[0]; +} + +function postCssTransformer(code, path) { + return new Promise((resolve, reject) => { + postcss([ + url({ + url: "inline", + }), + ]) + .process(code, { from: path }) + .then((result) => { + resolve(result.css); + }) + .catch(reject); + }); +} + +const context = await esbuild.context({ + entryPoints: ["plugins/index.js"], + bundle: true, + minify: true, + sourcemap: true, + outfile: "dist/index.js", + + plugins: [ + copy({ + // this is equal to process.cwd(), which means we use cwd path as base path to resolve `to` path + // if not specified, this plugin uses ESBuild.build outdir/outfile options as base path. + resolveFrom: "cwd", + assets: { + from: ["./plugin-manifest.json"], + to: ["dist/plugin-manifest.json"], + }, + watch: true, + }), + + inlineImportPlugin({ + transform: (code, { path }) => { + if (path.endsWith(".css")) { + return postCssTransformer(code, path); + } + return code; + }, + }), + + eslint({ + throwOnError: !watch, + }), + { + name: "result-message-plugin", + setup(build) { + let startedAt = null; + build.onStart(() => { + startedAt = Date.now(); + console.log("Build started"); + }); + build.onEnd((result) => { + const duration = Date.now() - startedAt; + const durationText = formatDuration(duration / 1000); + console.log( + "Build ended after", + duration > 1000 + ? chalk.red(durationText) + : chalk.green(durationText), + ); + const errors = result?.errors?.length || 0; + const warnings = result?.warnings?.length || 0; + if (result?.errors?.length) { + console.log(chalk.red("Failed. See errors above for details.")); + } else { + console.log(chalk.green("Success")); + } + if (errors || warnings) { + console.log( + `Errors/Warnings: ${errors ? chalk.red(errors) : errors}/${ + warnings ? chalk.yellow(warnings) : warnings + }`, + ); + } + }); + }, + }, + ], +}); + +if (watch) { + console.log("Watching for changes..."); + context.watch(); + + const { host, port } = await context.serve({ + servedir: "dist", + port: 3050, + }); + + const headers = { + "access-control-allow-origin": "*" /* @dev First, read about security */, + "access-control-allow-methods": "OPTIONS, POST, GET", + "access-control-max-age": 2592000, // 30 days + "access-control-allow-headers": "*", + /** add other headers as per requirement */ + }; + + const options = { + key: fs.readFileSync("./.dev/localhost.key"), + cert: fs.readFileSync("./.dev/localhost.cert"), + }; + + // Then start a proxy server on port 3000 + https + .createServer(options, (req, res) => { + const options = { + hostname: host, + port: port, + path: req.url, + method: req.method, + headers: req.headers, + }; + + if (req.method === "OPTIONS") { + res.writeHead(204, headers); + res.end(); + return; + } + + // Forward each incoming request to esbuild + const proxyReq = http.request(options, (proxyRes) => { + // Forward the response from esbuild to the client + // Include CORS headers + res.writeHead(proxyRes.statusCode, { + ...proxyRes.headers, + ...headers, + }); + proxyRes.pipe(res, { end: true }); + }); + + // Forward the body of the request to esbuild + req.pipe(proxyReq, { end: true }); + }) + .listen(3053); + + console.log( + `Serving at http://${host.replace( + "0.0.0.0", + "localhost", + )}:${port}/index.js and https://${host.replace( + "0.0.0.0", + "localhost", + )}:${3053}/index.js`, + ); + + console.log( + `Manifest file is avaiable at http://${host.replace( + "0.0.0.0", + "localhost", + )}:${port}/plugin-manifest.json and https://${host.replace( + "0.0.0.0", + "localhost", + )}:${3053}/plugin-manifest.json`, + ); +} else { + await context.rebuild(); + context.dispose(); +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9556ae4 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "type": "module", + "scripts": { + "build": "node esbuild.config.js", + "start": "node esbuild.config.js --watch" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.23.3", + "esbuild": "^0.20.0", + "esbuild-plugin-eslint": "^0.3.7", + "esbuild-plugin-inline-import": "^1.0.4", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "postcss": "^8.4.35", + "postcss-url": "^10.1.3", + "prettier": "^3.1.1" + }, + "dependencies": { + "chalk": "^5.3.0", + "esbuild-plugin-copy": "^2.1.1" + } +} diff --git a/plugin-manifest.json b/plugin-manifest.json new file mode 100644 index 0000000..35f614d --- /dev/null +++ b/plugin-manifest.json @@ -0,0 +1,15 @@ +{ + "id": "flotiq.plain-js-template", + "name": "Plain JS Plugin Template", + "description": "A plain js example of Flotiq plugin. This plugin changes the rendering of some data in the grid. It renders colorful text properties, bold numbers, and relations as text.", + "version": "0.1.2", + "repository": "https://github.com/flotiq/flotiq-ui-plugin-templates-plain-js", + "url": "https://localhost:3053/index.js", + "permissions": [ + { + "ctdName": "*", + "canRead": true, + "type": "CO" + } + ] +} diff --git a/plugins/grid-renderers/index.js b/plugins/grid-renderers/index.js new file mode 100644 index 0000000..42990c3 --- /dev/null +++ b/plugins/grid-renderers/index.js @@ -0,0 +1,62 @@ +import { getRelationData } from "../../common/api-helpers"; +import { + addElementToCache, + getCachedElement, +} from "../../common/plugin-element-cache"; + +const textColors = [ + "rgb(239 68 68)", + "rgb(249 115 22)", + "rgb(234 179 8)", + "rgb(132 204 22)", + "rgb(34 197 94)", + "rgb(20 184 166)", + "rgb(59 130 246)", + "rgb(139 92 246)", + "rgb(168 85 247)", + "rgb(217 70 239)", +]; + +export function handleGridPlugin( + { accessor, contentObject, inputType, data }, + client, + pluginInfo, +) { + if (!["text", "number", "datasource"].includes(inputType)) return; + + const cacheKey = `${pluginInfo.id}-${contentObject.id}-${accessor}`; + + let element = getCachedElement(cacheKey)?.element; + if (!element) { + element = document.createElement("div"); + element.classList.add("plugin-name-cell-renderer"); + if (inputType === "text") { + const textColor = textColors[Math.floor(Math.random() * 10)]; + element.style.color = textColor; + element.textContent = data; + } else if (inputType === "number") { + element.style.fontWeight = 900; + element.textContent = data; + } else { + if (data) + Promise.all( + data.map((relation) => + getRelationData(client, relation.dataUrl).then( + (data) => + data.internal?.objectTitle || + data.title || + data.name || + data.id, + ), + ), + ).then((resultArray) => { + const joinedData = (resultArray || []).filter((r) => !!r).join(", "); + element.textContent = joinedData; + }); + } + } + + addElementToCache(element, cacheKey); + + return element; +} diff --git a/plugins/index.js b/plugins/index.js new file mode 100644 index 0000000..8882312 --- /dev/null +++ b/plugins/index.js @@ -0,0 +1,20 @@ +import { registerFn } from "../common/plugin-element-cache"; +import pluginInfo from "../plugin-manifest.json"; +import cssString from "inline:./styles/style.css"; +import { handleGridPlugin } from "./grid-renderers"; + +registerFn(pluginInfo, (handler, client) => { + /** + * Add plugin styles to the head of the document + */ + if (!document.getElementById(`${pluginInfo.id}-styles`)) { + const style = document.createElement("style"); + style.id = `${pluginInfo.id}-styles`; + style.textContent = cssString; + document.head.appendChild(style); + } + + handler.on("flotiq.grid.cell::render", (data) => + handleGridPlugin(data, client, pluginInfo), + ); +}); diff --git a/plugins/styles/RobotoMono-Medium.ttf b/plugins/styles/RobotoMono-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f6c149a2035375cc8b09a0611afb89ae4896069d GIT binary patch literal 87172 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