@webiny/app-admin 5.25.0 → 5.25.1-beta.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 (33) hide show
  1. package/components/AppInstaller/AppInstaller.d.ts +5 -0
  2. package/components/AppInstaller/AppInstaller.js +19 -2
  3. package/components/AppInstaller/AppInstaller.js.map +1 -1
  4. package/components/AppInstaller/useInstaller.d.ts +1 -0
  5. package/components/AppInstaller/useInstaller.js +4 -0
  6. package/components/AppInstaller/useInstaller.js.map +1 -1
  7. package/components/FileManager/FileDetails/Tags.d.ts +2 -0
  8. package/components/FileManager/FileDetails/Tags.js +61 -16
  9. package/components/FileManager/FileDetails/Tags.js.map +1 -1
  10. package/components/FileManager/FileDetails.js +8 -2
  11. package/components/FileManager/FileDetails.js.map +1 -1
  12. package/components/FileManager/FileManagerContext.d.ts +10 -0
  13. package/components/FileManager/FileManagerContext.js +33 -3
  14. package/components/FileManager/FileManagerContext.js.map +1 -1
  15. package/components/FileManager/FileManagerView.d.ts +3 -0
  16. package/components/FileManager/FileManagerView.js +3 -1
  17. package/components/FileManager/FileManagerView.js.map +1 -1
  18. package/components/FileManager/LeftSidebar.d.ts +1 -0
  19. package/components/FileManager/LeftSidebar.js +15 -5
  20. package/components/FileManager/LeftSidebar.js.map +1 -1
  21. package/components/FileManager/graphql.js +2 -2
  22. package/components/FileManager/graphql.js.map +1 -1
  23. package/components/FileManager.d.ts +3 -0
  24. package/components/FileManager.js +8 -2
  25. package/components/FileManager.js.map +1 -1
  26. package/components/SimpleForm/SimpleForm.d.ts +1 -0
  27. package/components/SimpleForm/SimpleForm.js +1 -1
  28. package/components/SimpleForm/SimpleForm.js.map +1 -1
  29. package/components/SplitView/SplitView.d.ts +1 -0
  30. package/components/SplitView/SplitView.js +1 -1
  31. package/components/SplitView/SplitView.js.map +1 -1
  32. package/package.json +19 -19
  33. package/ui/elements/form/FileManagerElement/styled.d.ts +3 -3
@@ -1,2 +1,7 @@
1
1
  import React from "react";
2
+ declare global {
3
+ interface Window {
4
+ Cypress: any;
5
+ }
6
+ }
2
7
  export declare const AppInstaller: React.FC;
@@ -18,6 +18,14 @@ export var AppInstaller = function AppInstaller(_ref) {
18
18
  var tenantId = localStorage.get("webiny_tenant") || "root";
19
19
  var lsKey = "webiny_installation_".concat(tenantId);
20
20
  var wbyVersion = appConfig.getKey("WEBINY_VERSION", process.env.REACT_APP_WEBINY_VERSION);
21
+ var isRootTenant = tenantId === "root";
22
+ /*
23
+ * This flag allows us to avoid rendering the <iframe> when the app is tested with Cypress
24
+ * (Cypress doesn't work with cross domains because of security-related implications).
25
+ * @see https://docs.cypress.io/guides/guides/web-security#Insecure-Content
26
+ */
27
+
28
+ var isCypressTest = window && window.Cypress;
21
29
 
22
30
  var markInstallerAsCompleted = function markInstallerAsCompleted() {
23
31
  localStorage.set(lsKey, wbyVersion);
@@ -41,6 +49,7 @@ export var AppInstaller = function AppInstaller(_ref) {
41
49
  loading = _useInstaller.loading,
42
50
  installers = _useInstaller.installers,
43
51
  installer = _useInstaller.installer,
52
+ isFirstInstall = _useInstaller.isFirstInstall,
44
53
  showNextInstaller = _useInstaller.showNextInstaller,
45
54
  showLogin = _useInstaller.showLogin,
46
55
  onUser = _useInstaller.onUser,
@@ -126,11 +135,19 @@ export var AppInstaller = function AppInstaller(_ref) {
126
135
 
127
136
  return renderLayout(renderBody( /*#__PURE__*/React.createElement(Elevation, {
128
137
  z: 1
129
- }, /*#__PURE__*/React.createElement(SuccessDialog, null, /*#__PURE__*/React.createElement("p", null, "You have successfully installed all new applications!"), /*#__PURE__*/React.createElement(ButtonPrimary, {
138
+ }, /*#__PURE__*/React.createElement(SuccessDialog, null, /*#__PURE__*/React.createElement("p", null, "You have successfully installed all new applications!"), !isCypressTest && isRootTenant && isFirstInstall ? /*#__PURE__*/React.createElement("iframe", {
139
+ height: "0",
140
+ width: "0",
141
+ frameBorder: "0",
142
+ style: {
143
+ opacity: "0"
144
+ },
145
+ src: "https://www.webiny.com/thank-you/new-install"
146
+ }) : null, /*#__PURE__*/React.createElement(ButtonPrimary, {
130
147
  "data-testid": "open-webiny-cms-admin-button",
131
148
  onClick: function onClick() {
132
149
  markInstallerAsCompleted();
133
150
  setFinished(true);
134
151
  }
135
- }, "Open Admin Area")))), true);
152
+ }, isFirstInstall ? "Finish install" : "Finish upgrade")))), true);
136
153
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["AppInstaller.tsx"],"names":["React","useEffect","useState","default","localStorage","LoginScreen","useSecurity","CircularProgress","ButtonPrimary","SplitView","LeftPanel","RightPanel","Grid","Cell","Typography","Elevation","useInstaller","Sidebar","Wrapper","alertClass","InnerContent","InstallContent","installerSplitView","SuccessDialog","config","appConfig","AppInstaller","children","tenantId","get","lsKey","wbyVersion","getKey","process","env","REACT_APP_WEBINY_VERSION","markInstallerAsCompleted","set","isInstallerCompleted","finished","setFinished","identity","isInstalled","loading","installers","installer","showNextInstaller","showLogin","onUser","skippingVersions","renderLayout","content","secure","renderBody","length","render","onInstalled","latest","current","availableUpgrades","filter","v","map"],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { default as localStorage } from \"store\";\nimport { LoginScreen } from \"~/index\";\nimport { useSecurity } from \"@webiny/app-security\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { ButtonPrimary } from \"@webiny/ui/Button\";\nimport { SplitView, LeftPanel, RightPanel } from \"../SplitView\";\nimport { Grid, Cell } from \"@webiny/ui/Grid\";\nimport { Typography } from \"@webiny/ui/Typography\";\nimport { Elevation } from \"@webiny/ui/Elevation\";\nimport { useInstaller } from \"./useInstaller\";\nimport Sidebar from \"./Sidebar\";\nimport {\n Wrapper,\n alertClass,\n InnerContent,\n InstallContent,\n installerSplitView,\n SuccessDialog\n} from \"./styled\";\nimport { config as appConfig } from \"@webiny/app/config\";\n\nexport const AppInstaller: React.FC = ({ children }) => {\n const tenantId = localStorage.get(\"webiny_tenant\") || \"root\";\n\n const lsKey = `webiny_installation_${tenantId}`;\n const wbyVersion = appConfig.getKey(\"WEBINY_VERSION\", process.env.REACT_APP_WEBINY_VERSION);\n\n const markInstallerAsCompleted = () => {\n localStorage.set(lsKey, wbyVersion);\n };\n\n const isInstallerCompleted = () => {\n return localStorage.get(lsKey) === wbyVersion;\n };\n\n const [finished, setFinished] = useState(false);\n const { identity } = useSecurity();\n const {\n loading,\n installers,\n installer,\n showNextInstaller,\n showLogin,\n onUser,\n skippingVersions\n } = useInstaller({ isInstalled: isInstallerCompleted() });\n\n useEffect(() => {\n if (identity) {\n onUser();\n }\n }, [identity]);\n\n if (isInstallerCompleted()) {\n return <LoginScreen>{children}</LoginScreen>;\n }\n\n const renderLayout = (content: React.ReactNode, secure = false): React.ReactElement => {\n return (\n <SplitView className={installerSplitView}>\n <LeftPanel span={2}>\n <Sidebar\n allInstallers={installers}\n installer={installer}\n showLogin={showLogin}\n />\n </LeftPanel>\n <RightPanel span={10}>\n {!showLogin && !secure && content}\n {(showLogin || secure) && <LoginScreen>{content}</LoginScreen>}\n </RightPanel>\n </SplitView>\n );\n };\n\n const renderBody = (content: React.ReactNode): React.ReactElement => {\n return (\n <Wrapper>\n <InstallContent>\n <InnerContent>{content}</InnerContent>\n </InstallContent>\n </Wrapper>\n );\n };\n\n // Loading installers data\n if (loading) {\n return <CircularProgress label={\"Checking apps...\"} />;\n }\n\n // This means there are no installers to run or installation was finished\n if (!loading && (installers.length === 0 || finished)) {\n markInstallerAsCompleted();\n return <LoginScreen>{children}</LoginScreen>;\n }\n\n if (installer) {\n return renderLayout(\n renderBody(installer.render({ onInstalled: showNextInstaller })),\n installer.secure\n );\n }\n\n if (skippingVersions) {\n return renderBody(\n <Elevation z={1} className={alertClass}>\n <Grid>\n <Cell span={12}>\n <Typography use={\"headline4\"}>Important!</Typography>\n </Cell>\n <Cell span={12}>\n <Typography use={\"body1\"} tag={\"div\"}>\n We&apos;ve detected that your current application is running Webiny{\" \"}\n <strong>v{skippingVersions.latest}</strong>. However, your API is\n running <strong>v{skippingVersions.current}</strong>. Unfortunately, we\n can&apos;t upgrade your system by skipping versions in between.\n <br />\n <br />\n Here&apos;s a list of versions you skipped, that contain upgrades you\n need to install:\n <ul>\n {skippingVersions.availableUpgrades\n .filter(v => v !== skippingVersions.latest)\n .map(v => (\n <li key={v}>v{v}</li>\n ))}\n </ul>\n For instructions on how to upgrade Webiny, please consult our{\" \"}\n <a\n href={\"https://docs.webiny.com/docs/how-to-guides/upgrade-webiny\"}\n target={\"_blank\"}\n rel={\"noreferrer noopener\"}\n >\n Upgrade Webiny\n </a>{\" \"}\n guide. Note that some versions may have a dedicated article with upgrade\n instructions, so look out for those in the upgrade guide.\n <br />\n <br />\n If you run into problems, find us on our{\" \"}\n <a\n href={\"https://www.webiny.com/slack\"}\n target={\"_blank\"}\n rel={\"noreferrer noopener\"}\n >\n Slack community.\n </a>\n </Typography>\n </Cell>\n </Grid>\n </Elevation>\n );\n }\n\n return renderLayout(\n renderBody(\n <Elevation z={1}>\n <SuccessDialog>\n <p>You have successfully installed all new applications!</p>\n <ButtonPrimary\n data-testid={\"open-webiny-cms-admin-button\"}\n onClick={() => {\n markInstallerAsCompleted();\n setFinished(true);\n }}\n >\n Open Admin Area\n </ButtonPrimary>\n </SuccessDialog>\n </Elevation>\n ),\n true\n );\n};\n"]}
1
+ {"version":3,"sources":["AppInstaller.tsx"],"names":["React","useEffect","useState","default","localStorage","LoginScreen","useSecurity","CircularProgress","ButtonPrimary","SplitView","LeftPanel","RightPanel","Grid","Cell","Typography","Elevation","useInstaller","Sidebar","Wrapper","alertClass","InnerContent","InstallContent","installerSplitView","SuccessDialog","config","appConfig","AppInstaller","children","tenantId","get","lsKey","wbyVersion","getKey","process","env","REACT_APP_WEBINY_VERSION","isRootTenant","isCypressTest","window","Cypress","markInstallerAsCompleted","set","isInstallerCompleted","finished","setFinished","identity","isInstalled","loading","installers","installer","isFirstInstall","showNextInstaller","showLogin","onUser","skippingVersions","renderLayout","content","secure","renderBody","length","render","onInstalled","latest","current","availableUpgrades","filter","v","map","opacity"],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { default as localStorage } from \"store\";\nimport { LoginScreen } from \"~/index\";\nimport { useSecurity } from \"@webiny/app-security\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { ButtonPrimary } from \"@webiny/ui/Button\";\nimport { SplitView, LeftPanel, RightPanel } from \"../SplitView\";\nimport { Grid, Cell } from \"@webiny/ui/Grid\";\nimport { Typography } from \"@webiny/ui/Typography\";\nimport { Elevation } from \"@webiny/ui/Elevation\";\nimport { useInstaller } from \"./useInstaller\";\nimport Sidebar from \"./Sidebar\";\n\ndeclare global {\n interface Window {\n Cypress: any;\n }\n}\n\nimport {\n Wrapper,\n alertClass,\n InnerContent,\n InstallContent,\n installerSplitView,\n SuccessDialog\n} from \"./styled\";\nimport { config as appConfig } from \"@webiny/app/config\";\n\nexport const AppInstaller: React.FC = ({ children }) => {\n const tenantId = localStorage.get(\"webiny_tenant\") || \"root\";\n const lsKey = `webiny_installation_${tenantId}`;\n const wbyVersion = appConfig.getKey(\"WEBINY_VERSION\", process.env.REACT_APP_WEBINY_VERSION);\n const isRootTenant = tenantId === \"root\";\n /*\n * This flag allows us to avoid rendering the <iframe> when the app is tested with Cypress\n * (Cypress doesn't work with cross domains because of security-related implications).\n * @see https://docs.cypress.io/guides/guides/web-security#Insecure-Content\n */\n const isCypressTest = window && window.Cypress;\n\n const markInstallerAsCompleted = () => {\n localStorage.set(lsKey, wbyVersion);\n };\n\n const isInstallerCompleted = () => {\n return localStorage.get(lsKey) === wbyVersion;\n };\n\n const [finished, setFinished] = useState(false);\n const { identity } = useSecurity();\n const {\n loading,\n installers,\n installer,\n isFirstInstall,\n showNextInstaller,\n showLogin,\n onUser,\n skippingVersions\n } = useInstaller({ isInstalled: isInstallerCompleted() });\n\n useEffect(() => {\n if (identity) {\n onUser();\n }\n }, [identity]);\n\n if (isInstallerCompleted()) {\n return <LoginScreen>{children}</LoginScreen>;\n }\n\n const renderLayout = (content: React.ReactNode, secure = false): React.ReactElement => {\n return (\n <SplitView className={installerSplitView}>\n <LeftPanel span={2}>\n <Sidebar\n allInstallers={installers}\n installer={installer}\n showLogin={showLogin}\n />\n </LeftPanel>\n <RightPanel span={10}>\n {!showLogin && !secure && content}\n {(showLogin || secure) && <LoginScreen>{content}</LoginScreen>}\n </RightPanel>\n </SplitView>\n );\n };\n\n const renderBody = (content: React.ReactNode): React.ReactElement => {\n return (\n <Wrapper>\n <InstallContent>\n <InnerContent>{content}</InnerContent>\n </InstallContent>\n </Wrapper>\n );\n };\n\n // Loading installers data\n if (loading) {\n return <CircularProgress label={\"Checking apps...\"} />;\n }\n\n // This means there are no installers to run or installation was finished\n if (!loading && (installers.length === 0 || finished)) {\n markInstallerAsCompleted();\n return <LoginScreen>{children}</LoginScreen>;\n }\n\n if (installer) {\n return renderLayout(\n renderBody(installer.render({ onInstalled: showNextInstaller })),\n installer.secure\n );\n }\n\n if (skippingVersions) {\n return renderBody(\n <Elevation z={1} className={alertClass}>\n <Grid>\n <Cell span={12}>\n <Typography use={\"headline4\"}>Important!</Typography>\n </Cell>\n <Cell span={12}>\n <Typography use={\"body1\"} tag={\"div\"}>\n We&apos;ve detected that your current application is running Webiny{\" \"}\n <strong>v{skippingVersions.latest}</strong>. However, your API is\n running <strong>v{skippingVersions.current}</strong>. Unfortunately, we\n can&apos;t upgrade your system by skipping versions in between.\n <br />\n <br />\n Here&apos;s a list of versions you skipped, that contain upgrades you\n need to install:\n <ul>\n {skippingVersions.availableUpgrades\n .filter(v => v !== skippingVersions.latest)\n .map(v => (\n <li key={v}>v{v}</li>\n ))}\n </ul>\n For instructions on how to upgrade Webiny, please consult our{\" \"}\n <a\n href={\"https://docs.webiny.com/docs/how-to-guides/upgrade-webiny\"}\n target={\"_blank\"}\n rel={\"noreferrer noopener\"}\n >\n Upgrade Webiny\n </a>{\" \"}\n guide. Note that some versions may have a dedicated article with upgrade\n instructions, so look out for those in the upgrade guide.\n <br />\n <br />\n If you run into problems, find us on our{\" \"}\n <a\n href={\"https://www.webiny.com/slack\"}\n target={\"_blank\"}\n rel={\"noreferrer noopener\"}\n >\n Slack community.\n </a>\n </Typography>\n </Cell>\n </Grid>\n </Elevation>\n );\n }\n\n return renderLayout(\n renderBody(\n <Elevation z={1}>\n <SuccessDialog>\n <p>You have successfully installed all new applications!</p>\n {!isCypressTest && isRootTenant && isFirstInstall ? (\n <iframe\n height=\"0\"\n width=\"0\"\n frameBorder=\"0\"\n style={{ opacity: \"0\" }}\n src=\"https://www.webiny.com/thank-you/new-install\"\n ></iframe>\n ) : null}\n <ButtonPrimary\n data-testid={\"open-webiny-cms-admin-button\"}\n onClick={() => {\n markInstallerAsCompleted();\n setFinished(true);\n }}\n >\n {isFirstInstall ? \"Finish install\" : \"Finish upgrade\"}\n </ButtonPrimary>\n </SuccessDialog>\n </Elevation>\n ),\n true\n );\n};\n"]}
@@ -21,6 +21,7 @@ export interface Installer extends BaseInstaller {
21
21
  export declare const useInstaller: (params: UseInstallerParams) => {
22
22
  loading: boolean;
23
23
  installers: Installer[];
24
+ isFirstInstall: boolean;
24
25
  installer: Installer;
25
26
  showNextInstaller: () => any;
26
27
  showLogin: boolean;
@@ -278,9 +278,13 @@ export var useInstaller = function useInstaller(params) {
278
278
  }, _callee2);
279
279
  }))();
280
280
  }, []);
281
+ var isFirstInstall = installers.some(function (installer) {
282
+ return installer.installed;
283
+ });
281
284
  return {
282
285
  loading: loading,
283
286
  installers: installers,
287
+ isFirstInstall: isFirstInstall,
284
288
  installer: installers[installerIndex],
285
289
  showNextInstaller: showNextInstaller,
286
290
  showLogin: showLogin,
@@ -1 +1 @@
1
- {"version":3,"sources":["useInstaller.tsx"],"names":["React","useCallback","useReducer","useEffect","Suspense","Graph","alg","sort","gt","lte","useApolloClient","plugins","CircularProgress","config","appConfig","Loader","children","props","cloneElement","useInstaller","params","isInstalled","prev","next","loading","installers","installerIndex","showLogin","skippingVersions","state","setState","client","validateGraph","graph","isAcyclic","cycles","findCycles","msg","forEach","cycle","index","fromAToB","join","fromBToA","reverse","padLength","length","push","padStart","Error","createGraph","plugin","setNode","name","pl","Array","isArray","dependencies","dep","setEdge","getInstallers","toInstall","toUpgrade","leaf","sinks","installer","find","inst","removeNode","installed","type","title","render","secure","wbyVersion","getKey","process","env","REACT_APP_WEBINY_VERSION","upgrades","filter","version","availableUpgrades","map","u","latestUpgrade","current","latest","onInstalled","Component","getComponent","a","b","onUser","showNextInstaller","prevInstaller","undefined","nextIndex","nextInstaller","prevSecure","nextSecure","allInstallers","Promise","all","byType","getInstalledVersion"],"mappings":"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","sourcesContent":["import React, { useCallback, useReducer, useEffect, Suspense } from \"react\";\nimport { Graph, alg } from \"graphlib\";\nimport { sort, gt, lte } from \"semver\";\nimport { useApolloClient } from \"@apollo/react-hooks\";\nimport { plugins } from \"@webiny/plugins\";\nimport { AdminInstallationPlugin } from \"~/types\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { config as appConfig } from \"@webiny/app/config\";\n\nconst Loader: React.FC<{ children: React.ReactElement }> = ({ children, ...props }) => (\n <Suspense fallback={<CircularProgress label={\"Loading...\"} />}>\n {React.cloneElement(children, props)}\n </Suspense>\n);\n\ninterface GetInstallersResult {\n toInstall: Installer[];\n toUpgrade: Installer[];\n}\n\ninterface UseInstallerParams {\n isInstalled: boolean;\n}\n\ninterface SkippingVersionState {\n current: string;\n latest: string;\n availableUpgrades: string[];\n}\n\ninterface BaseInstaller {\n installed: string | null;\n plugin: AdminInstallationPlugin;\n}\n\nexport interface Installer extends BaseInstaller {\n type: \"install\" | \"upgrade\";\n name: string;\n title: string;\n render: AdminInstallationPlugin[\"render\"];\n secure?: boolean;\n}\ninterface State {\n loading: boolean;\n installers: Installer[];\n installerIndex: number;\n showLogin: boolean;\n skippingVersions: SkippingVersionState | null;\n}\n\ninterface Reducer {\n (prev: State, next: Partial<State>): State;\n}\n\nexport const useInstaller = (params: UseInstallerParams) => {\n const { isInstalled } = params;\n const [state, setState] = useReducer<Reducer>((prev, next) => ({ ...prev, ...next }), {\n loading: true,\n installers: [],\n installerIndex: -1,\n showLogin: false,\n skippingVersions: null\n });\n const { loading, installers, installerIndex, showLogin, skippingVersions } = state;\n\n const client = useApolloClient();\n\n const validateGraph = (graph: Graph): void => {\n const isAcyclic = alg.isAcyclic(graph);\n if (isAcyclic) {\n return;\n }\n const cycles = alg.findCycles(graph);\n const msg = [\"Your installers have circular dependencies:\"];\n cycles.forEach((cycle, index) => {\n let fromAToB = cycle.join(\" --> \");\n fromAToB = `${index + 1}. ${fromAToB}`;\n const fromBToA = cycle.reverse().join(\" <-- \");\n const padLength = fromAToB.length + 4;\n msg.push(fromAToB.padStart(padLength));\n msg.push(fromBToA.padStart(padLength));\n }, cycles);\n throw new Error(msg.join(\"\\n\"));\n };\n\n const createGraph = (installers: BaseInstaller[]): Graph => {\n const graph = new Graph();\n installers.forEach(({ plugin }) => {\n graph.setNode(plugin.name as string, plugin);\n });\n\n installers.forEach(({ plugin: pl }) => {\n if (Array.isArray(pl.dependencies)) {\n pl.dependencies.forEach(dep => {\n graph.setEdge(pl.name as string, dep);\n });\n }\n });\n\n validateGraph(graph);\n\n return graph;\n };\n\n const getInstallers = useCallback(\n (\n installers: BaseInstaller[],\n graph: Graph,\n toInstall: Installer[] = [],\n toUpgrade: Installer[] = []\n ): GetInstallersResult => {\n const leaf = graph.sinks()[0];\n if (leaf) {\n const installer = installers.find(inst => inst.plugin.name === leaf);\n if (!installer) {\n throw new Error(`Missing installer plugin \"${leaf}\"!`);\n }\n\n graph.removeNode(leaf);\n if (!installer.installed) {\n toInstall.push({\n type: \"install\",\n name: `${installer.plugin.name}-install`,\n title: installer.plugin.title,\n render: installer.plugin.render,\n secure: installer.plugin.secure,\n installed: null,\n plugin: installer.plugin\n });\n } else {\n const wbyVersion = appConfig.getKey(\n \"WEBINY_VERSION\",\n process.env.REACT_APP_WEBINY_VERSION as string\n );\n\n const upgrades = (installer.plugin.upgrades || []).filter(({ version }) => {\n // TODO use coerce\n return lte(version, wbyVersion) && gt(version, installer.installed || \"\");\n });\n\n if (upgrades.length > 1) {\n const availableUpgrades = sort(upgrades.map(u => u.version));\n const latestUpgrade = availableUpgrades[availableUpgrades.length - 1];\n setState({\n skippingVersions: {\n current: installer.installed,\n latest: latestUpgrade,\n availableUpgrades\n }\n });\n } else if (upgrades.length === 1) {\n toUpgrade.push({\n type: \"upgrade\",\n name: `${installer.plugin.name}-upgrade`,\n title: installer.plugin.title,\n secure: true,\n installed: null,\n plugin: installer.plugin,\n render({ onInstalled }) {\n const Component = upgrades[0].getComponent();\n return (\n <Loader>\n <Component onInstalled={onInstalled} />\n </Loader>\n );\n }\n });\n }\n }\n return getInstallers(installers, graph, toInstall, toUpgrade);\n }\n toInstall.sort((a, b) => {\n if (a.secure && !b.secure) {\n return 1;\n } else if (!a.secure && b.secure) {\n return -1;\n }\n return 0;\n });\n return { toInstall, toUpgrade };\n },\n []\n );\n\n const onUser = () => {\n setState({ showLogin: false });\n };\n\n /**\n * If set to anything else, it breaks in AppInstaller.tsx\n */\n const showNextInstaller = (): any => {\n const prevInstaller = installers[installerIndex];\n\n installers[installerIndex].installed = appConfig.getKey(\n \"WEBINY_VERSION\",\n process.env.REACT_APP_WEBINY_VERSION as string\n );\n setState({ installers });\n\n if (installers.length < installerIndex + 1) {\n setState({ installerIndex: undefined });\n return;\n }\n\n const nextIndex = installerIndex + 1;\n\n let showLogin = false;\n const nextInstaller = installers[nextIndex];\n\n const prevSecure = prevInstaller && prevInstaller.secure;\n const nextSecure = nextInstaller && nextInstaller.secure;\n if (!prevSecure && nextSecure) {\n showLogin = true;\n }\n setState({ installerIndex: nextIndex, showLogin });\n };\n\n useEffect(() => {\n (async () => {\n if (isInstalled) {\n return;\n }\n\n const allInstallers: BaseInstaller[] = [];\n await Promise.all(\n plugins.byType<AdminInstallationPlugin>(\"admin-installation\").map(async pl => {\n const installed = await pl.getInstalledVersion({ client });\n allInstallers.push({ plugin: pl, installed });\n })\n );\n\n const graph = createGraph(allInstallers);\n const { toInstall, toUpgrade } = getInstallers(allInstallers, graph);\n const installers = [...toUpgrade, ...toInstall];\n setState({\n installers,\n installerIndex: 0,\n loading: false,\n showLogin: toUpgrade.length > 0 || (toInstall.length > 0 && toInstall[0].secure)\n });\n })();\n }, []);\n\n return {\n loading,\n installers,\n installer: installers[installerIndex],\n showNextInstaller,\n showLogin,\n onUser,\n skippingVersions\n };\n};\n"]}
1
+ {"version":3,"sources":["useInstaller.tsx"],"names":["React","useCallback","useReducer","useEffect","Suspense","Graph","alg","sort","gt","lte","useApolloClient","plugins","CircularProgress","config","appConfig","Loader","children","props","cloneElement","useInstaller","params","isInstalled","prev","next","loading","installers","installerIndex","showLogin","skippingVersions","state","setState","client","validateGraph","graph","isAcyclic","cycles","findCycles","msg","forEach","cycle","index","fromAToB","join","fromBToA","reverse","padLength","length","push","padStart","Error","createGraph","plugin","setNode","name","pl","Array","isArray","dependencies","dep","setEdge","getInstallers","toInstall","toUpgrade","leaf","sinks","installer","find","inst","removeNode","installed","type","title","render","secure","wbyVersion","getKey","process","env","REACT_APP_WEBINY_VERSION","upgrades","filter","version","availableUpgrades","map","u","latestUpgrade","current","latest","onInstalled","Component","getComponent","a","b","onUser","showNextInstaller","prevInstaller","undefined","nextIndex","nextInstaller","prevSecure","nextSecure","allInstallers","Promise","all","byType","getInstalledVersion","isFirstInstall","some"],"mappings":"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","sourcesContent":["import React, { useCallback, useReducer, useEffect, Suspense } from \"react\";\nimport { Graph, alg } from \"graphlib\";\nimport { sort, gt, lte } from \"semver\";\nimport { useApolloClient } from \"@apollo/react-hooks\";\nimport { plugins } from \"@webiny/plugins\";\nimport { AdminInstallationPlugin } from \"~/types\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { config as appConfig } from \"@webiny/app/config\";\n\nconst Loader: React.FC<{ children: React.ReactElement }> = ({ children, ...props }) => (\n <Suspense fallback={<CircularProgress label={\"Loading...\"} />}>\n {React.cloneElement(children, props)}\n </Suspense>\n);\n\ninterface GetInstallersResult {\n toInstall: Installer[];\n toUpgrade: Installer[];\n}\n\ninterface UseInstallerParams {\n isInstalled: boolean;\n}\n\ninterface SkippingVersionState {\n current: string;\n latest: string;\n availableUpgrades: string[];\n}\n\ninterface BaseInstaller {\n installed: string | null;\n plugin: AdminInstallationPlugin;\n}\n\nexport interface Installer extends BaseInstaller {\n type: \"install\" | \"upgrade\";\n name: string;\n title: string;\n render: AdminInstallationPlugin[\"render\"];\n secure?: boolean;\n}\ninterface State {\n loading: boolean;\n installers: Installer[];\n installerIndex: number;\n showLogin: boolean;\n skippingVersions: SkippingVersionState | null;\n}\n\ninterface Reducer {\n (prev: State, next: Partial<State>): State;\n}\n\nexport const useInstaller = (params: UseInstallerParams) => {\n const { isInstalled } = params;\n const [state, setState] = useReducer<Reducer>((prev, next) => ({ ...prev, ...next }), {\n loading: true,\n installers: [],\n installerIndex: -1,\n showLogin: false,\n skippingVersions: null\n });\n const { loading, installers, installerIndex, showLogin, skippingVersions } = state;\n\n const client = useApolloClient();\n\n const validateGraph = (graph: Graph): void => {\n const isAcyclic = alg.isAcyclic(graph);\n if (isAcyclic) {\n return;\n }\n const cycles = alg.findCycles(graph);\n const msg = [\"Your installers have circular dependencies:\"];\n cycles.forEach((cycle, index) => {\n let fromAToB = cycle.join(\" --> \");\n fromAToB = `${index + 1}. ${fromAToB}`;\n const fromBToA = cycle.reverse().join(\" <-- \");\n const padLength = fromAToB.length + 4;\n msg.push(fromAToB.padStart(padLength));\n msg.push(fromBToA.padStart(padLength));\n }, cycles);\n throw new Error(msg.join(\"\\n\"));\n };\n\n const createGraph = (installers: BaseInstaller[]): Graph => {\n const graph = new Graph();\n installers.forEach(({ plugin }) => {\n graph.setNode(plugin.name as string, plugin);\n });\n\n installers.forEach(({ plugin: pl }) => {\n if (Array.isArray(pl.dependencies)) {\n pl.dependencies.forEach(dep => {\n graph.setEdge(pl.name as string, dep);\n });\n }\n });\n\n validateGraph(graph);\n\n return graph;\n };\n\n const getInstallers = useCallback(\n (\n installers: BaseInstaller[],\n graph: Graph,\n toInstall: Installer[] = [],\n toUpgrade: Installer[] = []\n ): GetInstallersResult => {\n const leaf = graph.sinks()[0];\n if (leaf) {\n const installer = installers.find(inst => inst.plugin.name === leaf);\n if (!installer) {\n throw new Error(`Missing installer plugin \"${leaf}\"!`);\n }\n\n graph.removeNode(leaf);\n if (!installer.installed) {\n toInstall.push({\n type: \"install\",\n name: `${installer.plugin.name}-install`,\n title: installer.plugin.title,\n render: installer.plugin.render,\n secure: installer.plugin.secure,\n installed: null,\n plugin: installer.plugin\n });\n } else {\n const wbyVersion = appConfig.getKey(\n \"WEBINY_VERSION\",\n process.env.REACT_APP_WEBINY_VERSION as string\n );\n\n const upgrades = (installer.plugin.upgrades || []).filter(({ version }) => {\n // TODO use coerce\n return lte(version, wbyVersion) && gt(version, installer.installed || \"\");\n });\n\n if (upgrades.length > 1) {\n const availableUpgrades = sort(upgrades.map(u => u.version));\n const latestUpgrade = availableUpgrades[availableUpgrades.length - 1];\n setState({\n skippingVersions: {\n current: installer.installed,\n latest: latestUpgrade,\n availableUpgrades\n }\n });\n } else if (upgrades.length === 1) {\n toUpgrade.push({\n type: \"upgrade\",\n name: `${installer.plugin.name}-upgrade`,\n title: installer.plugin.title,\n secure: true,\n installed: null,\n plugin: installer.plugin,\n render({ onInstalled }) {\n const Component = upgrades[0].getComponent();\n return (\n <Loader>\n <Component onInstalled={onInstalled} />\n </Loader>\n );\n }\n });\n }\n }\n return getInstallers(installers, graph, toInstall, toUpgrade);\n }\n toInstall.sort((a, b) => {\n if (a.secure && !b.secure) {\n return 1;\n } else if (!a.secure && b.secure) {\n return -1;\n }\n return 0;\n });\n return { toInstall, toUpgrade };\n },\n []\n );\n\n const onUser = () => {\n setState({ showLogin: false });\n };\n\n /**\n * If set to anything else, it breaks in AppInstaller.tsx\n */\n const showNextInstaller = (): any => {\n const prevInstaller = installers[installerIndex];\n\n installers[installerIndex].installed = appConfig.getKey(\n \"WEBINY_VERSION\",\n process.env.REACT_APP_WEBINY_VERSION as string\n );\n setState({ installers });\n\n if (installers.length < installerIndex + 1) {\n setState({ installerIndex: undefined });\n return;\n }\n\n const nextIndex = installerIndex + 1;\n\n let showLogin = false;\n const nextInstaller = installers[nextIndex];\n\n const prevSecure = prevInstaller && prevInstaller.secure;\n const nextSecure = nextInstaller && nextInstaller.secure;\n if (!prevSecure && nextSecure) {\n showLogin = true;\n }\n setState({ installerIndex: nextIndex, showLogin });\n };\n\n useEffect(() => {\n (async () => {\n if (isInstalled) {\n return;\n }\n\n const allInstallers: BaseInstaller[] = [];\n await Promise.all(\n plugins.byType<AdminInstallationPlugin>(\"admin-installation\").map(async pl => {\n const installed = await pl.getInstalledVersion({ client });\n allInstallers.push({ plugin: pl, installed });\n })\n );\n\n const graph = createGraph(allInstallers);\n const { toInstall, toUpgrade } = getInstallers(allInstallers, graph);\n const installers = [...toUpgrade, ...toInstall];\n setState({\n installers,\n installerIndex: 0,\n loading: false,\n showLogin: toUpgrade.length > 0 || (toInstall.length > 0 && toInstall[0].secure)\n });\n })();\n }, []);\n\n const isFirstInstall = installers.some(installer => installer.installed);\n\n return {\n loading,\n installers,\n isFirstInstall,\n installer: installers[installerIndex],\n showNextInstaller,\n showLogin,\n onUser,\n skippingVersions\n };\n};\n"]}
@@ -1,5 +1,7 @@
1
1
  import React from "react";
2
2
  import { FileItem } from "../types";
3
+ export declare const formatTagAsLabel: (tag: string, scope: string | undefined) => string;
4
+ export declare const tagWithoutScopePrefix: (tags: string[], scope: string) => string[];
3
5
  interface TagsProps {
4
6
  file: FileItem;
5
7
  canEdit: (file: FileItem) => boolean;
@@ -1,6 +1,8 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
1
2
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
3
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
4
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ var _excluded = ["value"];
4
6
  import _regeneratorRuntime from "@babel/runtime/regenerator";
5
7
  import React, { useCallback, useState } from "react";
6
8
  import classNames from "classnames";
@@ -15,10 +17,25 @@ import { MultiAutoComplete } from "@webiny/ui/AutoComplete";
15
17
  import { Icon } from "@webiny/ui/Icon";
16
18
  import { Form } from "@webiny/form";
17
19
  import { useSnackbar } from "../../../hooks/useSnackbar";
18
- import { useFileManager } from "./../FileManagerContext";
20
+ import { getWhere, useFileManager } from "./../FileManagerContext";
19
21
  import { UPDATE_FILE, LIST_FILES, LIST_TAGS } from "./../graphql";
20
22
  import { ReactComponent as EditIcon } from "./../icons/round-edit-24px.svg";
21
23
  import { ReactComponent as LabelIcon } from "./../icons/round-label-24px.svg";
24
+ var SCOPE_SEPARATOR = ":";
25
+ export var formatTagAsLabel = function formatTagAsLabel(tag, scope) {
26
+ if (!scope) {
27
+ return tag;
28
+ }
29
+
30
+ return tag.replace("".concat(scope).concat(SCOPE_SEPARATOR), "");
31
+ };
32
+ export var tagWithoutScopePrefix = function tagWithoutScopePrefix(tags, scope) {
33
+ return tags.filter(function (tag) {
34
+ return tag !== scope;
35
+ }).map(function (tag) {
36
+ return formatTagAsLabel(tag, scope);
37
+ });
38
+ };
22
39
  var chipsStyle = /*#__PURE__*/css({
23
40
  "&.mdc-chip-set": {
24
41
  padding: 0,
@@ -78,8 +95,13 @@ var Tags = function Tags(_ref) {
78
95
  var handleEdit = useCallback(function () {
79
96
  return setEdit(true);
80
97
  }, []);
81
- var listTagsQuery = useQuery(LIST_TAGS);
82
- var allTags = get(listTagsQuery, "data.fileManager.listTags") || [];
98
+ var listTagsQuery = useQuery(LIST_TAGS, {
99
+ variables: {
100
+ where: getWhere(queryParams.scope)
101
+ }
102
+ });
103
+ var listTags = get(listTagsQuery, "data.fileManager.listTags", []);
104
+ var allTags = tagWithoutScopePrefix(listTags, queryParams.scope);
83
105
  var isEditingAllowed = canEdit(file);
84
106
  var renderHeaderContent = useCallback(function (_ref2) {
85
107
  var data = _ref2.data;
@@ -94,11 +116,13 @@ var Tags = function Tags(_ref) {
94
116
  // Render existing tags and "edit tags" action.
95
117
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Chips, {
96
118
  className: classNames("list-item__content", chipsStyle)
97
- }, data.tags.map(function (tag, index) {
119
+ }, data.tags.filter(function (tag) {
120
+ return tag !== queryParams.scope;
121
+ }).map(function (tag, index) {
98
122
  var label = typeof tag === "string" ? tag : tag.name;
99
123
  return /*#__PURE__*/React.createElement(Chip, {
100
124
  key: label + index,
101
- label: label
125
+ label: formatTagAsLabel(label, queryParams.scope)
102
126
  });
103
127
  })), isEditingAllowed && /*#__PURE__*/React.createElement(IconButton, {
104
128
  className: iconButtonStyle,
@@ -160,7 +184,10 @@ var Tags = function Tags(_ref) {
160
184
  if (Array.isArray(newFileData.tags)) {
161
185
  // Get list tags data
162
186
  var listTagsData = cloneDeep(cache.readQuery({
163
- query: LIST_TAGS
187
+ query: LIST_TAGS,
188
+ variables: {
189
+ where: getWhere(queryParams.scope)
190
+ }
164
191
  }));
165
192
 
166
193
  if (!listTagsData) {
@@ -182,6 +209,9 @@ var Tags = function Tags(_ref) {
182
209
 
183
210
  cache.writeQuery({
184
211
  query: LIST_TAGS,
212
+ variables: {
213
+ where: getWhere(queryParams.scope)
214
+ },
185
215
  data: listTagsData
186
216
  });
187
217
  }
@@ -221,19 +251,34 @@ var Tags = function Tags(_ref) {
221
251
  name: "tags",
222
252
  beforeChange: function beforeChange(tags, baseOnChange) {
223
253
  var formattedTags = tags.map(function (tag) {
224
- return tag.toLowerCase();
254
+ var tagInLowerCase = tag.toLowerCase();
255
+ /**
256
+ * If "scope" exists, prefix tag with "scope" if not already.
257
+ */
258
+
259
+ if (queryParams.scope && !tagInLowerCase.startsWith(queryParams.scope)) {
260
+ return "".concat(queryParams.scope).concat(SCOPE_SEPARATOR).concat(tagInLowerCase);
261
+ }
262
+
263
+ return tagInLowerCase;
225
264
  });
226
265
  baseOnChange(formattedTags);
227
266
  }
228
- }, /*#__PURE__*/React.createElement(MultiAutoComplete, {
229
- options: allTags,
230
- placeholder: "homepage asset",
231
- description: "Type in a new tag or select an existing one.",
232
- unique: true,
233
- allowFreeInput: true,
234
- useSimpleValues: true,
235
- disabled: saving
236
- })), /*#__PURE__*/React.createElement("div", {
267
+ }, function (_ref6) {
268
+ var value = _ref6.value,
269
+ bindProps = _objectWithoutProperties(_ref6, _excluded);
270
+
271
+ return /*#__PURE__*/React.createElement(MultiAutoComplete, Object.assign({}, bindProps, {
272
+ value: tagWithoutScopePrefix(value, queryParams.scope),
273
+ options: allTags,
274
+ placeholder: "homepage asset",
275
+ description: "Type in a new tag or select an existing one.",
276
+ unique: true,
277
+ allowFreeInput: true,
278
+ useSimpleValues: true,
279
+ disabled: saving
280
+ }));
281
+ }), /*#__PURE__*/React.createElement("div", {
237
282
  className: actionWrapperStyle
238
283
  }, /*#__PURE__*/React.createElement(ButtonPrimary, {
239
284
  small: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["Tags.tsx"],"names":["React","useCallback","useState","classNames","css","useApolloClient","useQuery","set","get","cloneDeep","Chips","Chip","ButtonSecondary","ButtonPrimary","ButtonDefault","IconButton","MultiAutoComplete","Icon","Form","useSnackbar","useFileManager","UPDATE_FILE","LIST_FILES","LIST_TAGS","ReactComponent","EditIcon","LabelIcon","chipsStyle","padding","marginLeft","backgroundColor","iconButtonStyle","width","height","addTagsStyle","color","textTransform","letterSpacing","actionWrapperStyle","marginTop","marginRight","Tags","file","canEdit","client","editing","setEdit","saving","setSaving","Array","isArray","tags","initialTags","setInitialTags","showSnackbar","queryParams","handleEdit","listTagsQuery","allTags","isEditingAllowed","renderHeaderContent","data","hasTags","length","map","tag","index","label","name","mutate","mutation","variables","id","update","cache","updated","newFileData","readQuery","query","fileManager","listFiles","forEach","item","key","writeQuery","listTagsData","updatedTagsList","listTags","includes","push","then","Bind","setValue","submit","baseOnChange","formattedTags","toLowerCase","ev"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { css } from \"emotion\";\nimport { useApolloClient, useQuery } from \"@apollo/react-hooks\";\nimport set from \"lodash/set\";\nimport get from \"lodash/get\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport { Chips, Chip } from \"@webiny/ui/Chips\";\nimport { ButtonSecondary, ButtonPrimary, ButtonDefault, IconButton } from \"@webiny/ui/Button\";\nimport { MultiAutoComplete } from \"@webiny/ui/AutoComplete\";\nimport { Icon } from \"@webiny/ui/Icon\";\nimport { Form } from \"@webiny/form\";\nimport { useSnackbar } from \"~/hooks/useSnackbar\";\nimport { useFileManager } from \"./../FileManagerContext\";\nimport {\n UPDATE_FILE,\n LIST_FILES,\n LIST_TAGS,\n ListFilesQueryResponse,\n ListFileTagsQueryResponse\n} from \"./../graphql\";\nimport { ReactComponent as EditIcon } from \"./../icons/round-edit-24px.svg\";\nimport { ReactComponent as LabelIcon } from \"./../icons/round-label-24px.svg\";\nimport { FileItem } from \"../types\";\n\nconst chipsStyle = css({\n \"&.mdc-chip-set\": {\n padding: 0,\n marginLeft: -4,\n \"& .mdc-chip\": {\n backgroundColor: \"var(--mdc-theme-background)\"\n }\n }\n});\nconst iconButtonStyle = css({\n \"&.mdc-icon-button svg\": {\n width: 20,\n height: 20\n }\n});\nconst addTagsStyle = css({\n \"&.mdc-button:not(:disabled)\": {\n color: \"var(--mdc-theme-text-secondary-on-background)\",\n textTransform: \"capitalize\",\n letterSpacing: \"initial\",\n marginLeft: -8\n }\n});\nconst actionWrapperStyle = css({\n marginTop: 16,\n \"& button:first-child\": {\n marginRight: 16\n }\n});\n\ninterface TagsProps {\n file: FileItem;\n canEdit: (file: FileItem) => boolean;\n}\nconst Tags: React.FC<TagsProps> = ({ file, canEdit }) => {\n const client = useApolloClient();\n\n const [editing, setEdit] = useState(false);\n const [saving, setSaving] = useState(false);\n const [initialTags, setInitialTags] = useState(Array.isArray(file.tags) ? [...file.tags] : []);\n const { showSnackbar } = useSnackbar();\n const { queryParams } = useFileManager();\n const handleEdit = useCallback(() => setEdit(true), []);\n const listTagsQuery = useQuery(LIST_TAGS);\n const allTags = get(listTagsQuery, \"data.fileManager.listTags\") || [];\n\n const isEditingAllowed = canEdit(file);\n\n const renderHeaderContent = useCallback(\n ({ data }: { data: { tags: { name: string }[] } }) => {\n if (editing) {\n return null;\n }\n const hasTags = data.tags.length > 0;\n\n if (hasTags) {\n // Render existing tags and \"edit tags\" action.\n return (\n <>\n <Chips className={classNames(\"list-item__content\", chipsStyle)}>\n {data.tags.map((tag, index) => {\n const label = typeof tag === \"string\" ? tag : tag.name;\n return <Chip key={label + index} label={label} />;\n })}\n </Chips>\n {isEditingAllowed && (\n <IconButton\n className={iconButtonStyle}\n icon={<EditIcon />}\n onClick={handleEdit}\n />\n )}\n </>\n );\n }\n // Render \"add tags\" action.\n return (\n <ButtonDefault\n className={addTagsStyle}\n onClick={handleEdit}\n disabled={!isEditingAllowed}\n >\n Add tags...\n </ButtonDefault>\n );\n },\n [editing, isEditingAllowed]\n );\n\n return (\n <Form\n data={{\n tags: initialTags\n }}\n onSubmit={async ({ tags }) => {\n setSaving(true);\n client\n .mutate({\n mutation: UPDATE_FILE,\n variables: {\n id: file.id,\n data: { tags }\n },\n update: (cache, updated) => {\n const newFileData: FileItem = get(\n updated,\n \"data.fileManager.updateFile.data\"\n );\n\n // 1. Update files list cache\n const data = cloneDeep(\n cache.readQuery<ListFilesQueryResponse>({\n query: LIST_FILES,\n variables: queryParams\n })\n );\n\n if (data) {\n data.fileManager.listFiles.data.forEach(item => {\n if (item.key === newFileData.key) {\n item.tags = newFileData.tags;\n }\n });\n }\n\n cache.writeQuery({\n query: LIST_FILES,\n variables: queryParams,\n data\n });\n // 2. Update \"LIST_TAGS\" cache\n if (Array.isArray(newFileData.tags)) {\n // Get list tags data\n const listTagsData = cloneDeep(\n cache.readQuery<ListFileTagsQueryResponse>({\n query: LIST_TAGS\n })\n );\n if (!listTagsData) {\n return;\n }\n // Add new tag in list\n const updatedTagsList = [...newFileData.tags];\n\n if (Array.isArray(listTagsData.fileManager.listTags)) {\n listTagsData.fileManager.listTags.forEach(tag => {\n if (!updatedTagsList.includes(tag)) {\n updatedTagsList.push(tag);\n }\n });\n }\n\n set(listTagsData, \"fileManager.listTags\", updatedTagsList);\n // Write it to cache\n cache.writeQuery({\n query: LIST_TAGS,\n data: listTagsData\n });\n }\n }\n })\n .then(() => {\n setInitialTags(tags);\n setSaving(false);\n setEdit(false);\n showSnackbar(\"Tags successfully updated.\");\n });\n }}\n >\n {({ Bind, data, setValue, submit }) => (\n <React.Fragment>\n <li-title>\n <Icon className={\"list-item__icon\"} icon={<LabelIcon />} />\n {renderHeaderContent({\n // TODO @ts-refactor\n // @ts-ignore\n data\n })}\n </li-title>\n {editing && (\n <li-content>\n <Bind\n name={\"tags\"}\n beforeChange={(\n tags: string[],\n baseOnChange: (tags: string[]) => void\n ) => {\n const formattedTags = tags.map(tag => tag.toLowerCase());\n baseOnChange(formattedTags);\n }}\n >\n <MultiAutoComplete\n options={allTags}\n placeholder={\"homepage asset\"}\n description={\"Type in a new tag or select an existing one.\"}\n unique={true}\n allowFreeInput={true}\n useSimpleValues={true}\n disabled={saving}\n />\n </Bind>\n <div className={actionWrapperStyle}>\n <ButtonPrimary\n small\n onClick={ev => {\n submit(ev);\n }}\n data-testid={\"fm.tags.submit\"}\n >\n Submit\n </ButtonPrimary>\n <ButtonSecondary\n small\n onClick={() => {\n setValue(\"tags\", initialTags);\n setEdit(false);\n }}\n >\n Cancel\n </ButtonSecondary>\n </div>\n </li-content>\n )}\n </React.Fragment>\n )}\n </Form>\n );\n};\n\nexport default Tags;\n"]}
1
+ {"version":3,"sources":["Tags.tsx"],"names":["React","useCallback","useState","classNames","css","useApolloClient","useQuery","set","get","cloneDeep","Chips","Chip","ButtonSecondary","ButtonPrimary","ButtonDefault","IconButton","MultiAutoComplete","Icon","Form","useSnackbar","getWhere","useFileManager","UPDATE_FILE","LIST_FILES","LIST_TAGS","ReactComponent","EditIcon","LabelIcon","SCOPE_SEPARATOR","formatTagAsLabel","tag","scope","replace","tagWithoutScopePrefix","tags","filter","map","chipsStyle","padding","marginLeft","backgroundColor","iconButtonStyle","width","height","addTagsStyle","color","textTransform","letterSpacing","actionWrapperStyle","marginTop","marginRight","Tags","file","canEdit","client","editing","setEdit","saving","setSaving","Array","isArray","initialTags","setInitialTags","showSnackbar","queryParams","handleEdit","listTagsQuery","variables","where","listTags","allTags","isEditingAllowed","renderHeaderContent","data","hasTags","length","index","label","name","mutate","mutation","id","update","cache","updated","newFileData","readQuery","query","fileManager","listFiles","forEach","item","key","writeQuery","listTagsData","updatedTagsList","includes","push","then","Bind","setValue","submit","baseOnChange","formattedTags","tagInLowerCase","toLowerCase","startsWith","value","bindProps","ev"],"mappings":";;;;;;AAAA,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,QAA7B,QAA6C,OAA7C;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,GAAT,QAAoB,SAApB;AACA,SAASC,eAAT,EAA0BC,QAA1B,QAA0C,qBAA1C;AACA,OAAOC,GAAP,MAAgB,YAAhB;AACA,OAAOC,GAAP,MAAgB,YAAhB;AACA,OAAOC,SAAP,MAAsB,kBAAtB;AACA,SAASC,KAAT,EAAgBC,IAAhB,QAA4B,kBAA5B;AACA,SAASC,eAAT,EAA0BC,aAA1B,EAAyCC,aAAzC,EAAwDC,UAAxD,QAA0E,mBAA1E;AACA,SAASC,iBAAT,QAAkC,yBAAlC;AACA,SAASC,IAAT,QAAqB,iBAArB;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,SAASC,WAAT;AACA,SAASC,QAAT,EAAmBC,cAAnB;AACA,SACIC,WADJ,EAEIC,UAFJ,EAGIC,SAHJ;AAOA,SAASC,cAAc,IAAIC,QAA3B;AACA,SAASD,cAAc,IAAIE,SAA3B;AAGA,IAAMC,eAAe,GAAG,GAAxB;AAEA,OAAO,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAmB,CAACC,GAAD,EAAcC,KAAd,EAA4C;AACxE,MAAI,CAACA,KAAL,EAAY;AACR,WAAOD,GAAP;AACH;;AACD,SAAOA,GAAG,CAACE,OAAJ,WAAeD,KAAf,SAAuBH,eAAvB,GAA0C,EAA1C,CAAP;AACH,CALM;AAOP,OAAO,IAAMK,qBAAqB,GAAG,SAAxBA,qBAAwB,CAACC,IAAD,EAAiBH,KAAjB,EAAmC;AACpE,SAAOG,IAAI,CAACC,MAAL,CAAY,UAAAL,GAAG;AAAA,WAAIA,GAAG,KAAKC,KAAZ;AAAA,GAAf,EAAkCK,GAAlC,CAAsC,UAAAN,GAAG;AAAA,WAAID,gBAAgB,CAACC,GAAD,EAAMC,KAAN,CAApB;AAAA,GAAzC,CAAP;AACH,CAFM;AAIP,IAAMM,UAAU,gBAAGjC,GAAG,CAAC;AACnB,oBAAkB;AACdkC,IAAAA,OAAO,EAAE,CADK;AAEdC,IAAAA,UAAU,EAAE,CAAC,CAFC;AAGd,mBAAe;AACXC,MAAAA,eAAe,EAAE;AADN;AAHD;AADC,CAAD,sBAAtB;AASA,IAAMC,eAAe,gBAAGrC,GAAG,CAAC;AACxB,2BAAyB;AACrBsC,IAAAA,KAAK,EAAE,EADc;AAErBC,IAAAA,MAAM,EAAE;AAFa;AADD,CAAD,2BAA3B;AAMA,IAAMC,YAAY,gBAAGxC,GAAG,CAAC;AACrB,iCAA+B;AAC3ByC,IAAAA,KAAK,EAAE,+CADoB;AAE3BC,IAAAA,aAAa,EAAE,YAFY;AAG3BC,IAAAA,aAAa,EAAE,SAHY;AAI3BR,IAAAA,UAAU,EAAE,CAAC;AAJc;AADV,CAAD,wBAAxB;AAQA,IAAMS,kBAAkB,gBAAG5C,GAAG,CAAC;AAC3B6C,EAAAA,SAAS,EAAE,EADgB;AAE3B,0BAAwB;AACpBC,IAAAA,WAAW,EAAE;AADO;AAFG,CAAD,8BAA9B;;AAYA,IAAMC,IAAyB,GAAG,SAA5BA,IAA4B,OAAuB;AAAA,MAApBC,IAAoB,QAApBA,IAAoB;AAAA,MAAdC,OAAc,QAAdA,OAAc;AACrD,MAAMC,MAAM,GAAGjD,eAAe,EAA9B;;AAEA,kBAA2BH,QAAQ,CAAC,KAAD,CAAnC;AAAA;AAAA,MAAOqD,OAAP;AAAA,MAAgBC,OAAhB;;AACA,mBAA4BtD,QAAQ,CAAC,KAAD,CAApC;AAAA;AAAA,MAAOuD,MAAP;AAAA,MAAeC,SAAf;;AACA,mBAAsCxD,QAAQ,CAACyD,KAAK,CAACC,OAAN,CAAcR,IAAI,CAAClB,IAAnB,uBAA+BkB,IAAI,CAAClB,IAApC,IAA4C,EAA7C,CAA9C;AAAA;AAAA,MAAO2B,WAAP;AAAA,MAAoBC,cAApB;;AACA,qBAAyB3C,WAAW,EAApC;AAAA,MAAQ4C,YAAR,gBAAQA,YAAR;;AACA,wBAAwB1C,cAAc,EAAtC;AAAA,MAAQ2C,WAAR,mBAAQA,WAAR;;AACA,MAAMC,UAAU,GAAGhE,WAAW,CAAC;AAAA,WAAMuD,OAAO,CAAC,IAAD,CAAb;AAAA,GAAD,EAAsB,EAAtB,CAA9B;AACA,MAAMU,aAAa,GAAG5D,QAAQ,CAACkB,SAAD,EAAY;AACtC2C,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAEhD,QAAQ,CAAC4C,WAAW,CAACjC,KAAb;AAAjB;AAD2B,GAAZ,CAA9B;AAGA,MAAMsC,QAAQ,GAAG7D,GAAG,CAAC0D,aAAD,EAAgB,2BAAhB,EAA6C,EAA7C,CAApB;AACA,MAAMI,OAAO,GAAGrC,qBAAqB,CAACoC,QAAD,EAAWL,WAAW,CAACjC,KAAvB,CAArC;AAEA,MAAMwC,gBAAgB,GAAGlB,OAAO,CAACD,IAAD,CAAhC;AAEA,MAAMoB,mBAAmB,GAAGvE,WAAW,CACnC,iBAAsD;AAAA,QAAnDwE,IAAmD,SAAnDA,IAAmD;;AAClD,QAAIlB,OAAJ,EAAa;AACT,aAAO,IAAP;AACH;;AACD,QAAMmB,OAAO,GAAGD,IAAI,CAACvC,IAAL,CAAUyC,MAAV,GAAmB,CAAnC;;AAEA,QAAID,OAAJ,EAAa;AACT;AACA,0BACI,uDACI,oBAAC,KAAD;AAAO,QAAA,SAAS,EAAEvE,UAAU,CAAC,oBAAD,EAAuBkC,UAAvB;AAA5B,SACKoC,IAAI,CAACvC,IAAL,CACIC,MADJ,CACW,UAAAL,GAAG;AAAA,eAAIA,GAAG,KAAKkC,WAAW,CAACjC,KAAxB;AAAA,OADd,EAEIK,GAFJ,CAEQ,UAACN,GAAD,EAAM8C,KAAN,EAAgB;AACjB,YAAMC,KAAK,GAAG,OAAO/C,GAAP,KAAe,QAAf,GAA0BA,GAA1B,GAAgCA,GAAG,CAACgD,IAAlD;AACA,4BACI,oBAAC,IAAD;AACI,UAAA,GAAG,EAAED,KAAK,GAAGD,KADjB;AAEI,UAAA,KAAK,EAAE/C,gBAAgB,CAACgD,KAAD,EAAQb,WAAW,CAACjC,KAApB;AAF3B,UADJ;AAMH,OAVJ,CADL,CADJ,EAcKwC,gBAAgB,iBACb,oBAAC,UAAD;AACI,QAAA,SAAS,EAAE9B,eADf;AAEI,QAAA,IAAI,eAAE,oBAAC,QAAD,OAFV;AAGI,QAAA,OAAO,EAAEwB;AAHb,QAfR,CADJ;AAwBH,KAhCiD,CAiClD;;;AACA,wBACI,oBAAC,aAAD;AACI,MAAA,SAAS,EAAErB,YADf;AAEI,MAAA,OAAO,EAAEqB,UAFb;AAGI,MAAA,QAAQ,EAAE,CAACM;AAHf,qBADJ;AASH,GA5CkC,EA6CnC,CAAChB,OAAD,EAAUgB,gBAAV,CA7CmC,CAAvC;AAgDA,sBACI,oBAAC,IAAD;AACI,IAAA,IAAI,EAAE;AACFrC,MAAAA,IAAI,EAAE2B;AADJ,KADV;AAII,IAAA,QAAQ;AAAA,2EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAS3B,gBAAAA,IAAT,SAASA,IAAT;AACNwB,gBAAAA,SAAS,CAAC,IAAD,CAAT;AACAJ,gBAAAA,MAAM,CACDyB,MADL,CACY;AACJC,kBAAAA,QAAQ,EAAE1D,WADN;AAEJ6C,kBAAAA,SAAS,EAAE;AACPc,oBAAAA,EAAE,EAAE7B,IAAI,CAAC6B,EADF;AAEPR,oBAAAA,IAAI,EAAE;AAAEvC,sBAAAA,IAAI,EAAJA;AAAF;AAFC,mBAFP;AAMJgD,kBAAAA,MAAM,EAAE,gBAACC,KAAD,EAAQC,OAAR,EAAoB;AACxB,wBAAMC,WAAqB,GAAG7E,GAAG,CAC7B4E,OAD6B,EAE7B,kCAF6B,CAAjC,CADwB,CAMxB;;AACA,wBAAMX,IAAI,GAAGhE,SAAS,CAClB0E,KAAK,CAACG,SAAN,CAAwC;AACpCC,sBAAAA,KAAK,EAAEhE,UAD6B;AAEpC4C,sBAAAA,SAAS,EAAEH;AAFyB,qBAAxC,CADkB,CAAtB;;AAOA,wBAAIS,IAAJ,EAAU;AACNA,sBAAAA,IAAI,CAACe,WAAL,CAAiBC,SAAjB,CAA2BhB,IAA3B,CAAgCiB,OAAhC,CAAwC,UAAAC,IAAI,EAAI;AAC5C,4BAAIA,IAAI,CAACC,GAAL,KAAaP,WAAW,CAACO,GAA7B,EAAkC;AAC9BD,0BAAAA,IAAI,CAACzD,IAAL,GAAYmD,WAAW,CAACnD,IAAxB;AACH;AACJ,uBAJD;AAKH;;AAEDiD,oBAAAA,KAAK,CAACU,UAAN,CAAiB;AACbN,sBAAAA,KAAK,EAAEhE,UADM;AAEb4C,sBAAAA,SAAS,EAAEH,WAFE;AAGbS,sBAAAA,IAAI,EAAJA;AAHa,qBAAjB,EAtBwB,CA2BxB;;AACA,wBAAId,KAAK,CAACC,OAAN,CAAcyB,WAAW,CAACnD,IAA1B,CAAJ,EAAqC;AACjC;AACA,0BAAM4D,YAAY,GAAGrF,SAAS,CAC1B0E,KAAK,CAACG,SAAN,CAA2C;AACvCC,wBAAAA,KAAK,EAAE/D,SADgC;AAEvC2C,wBAAAA,SAAS,EAAE;AAAEC,0BAAAA,KAAK,EAAEhD,QAAQ,CAAC4C,WAAW,CAACjC,KAAb;AAAjB;AAF4B,uBAA3C,CAD0B,CAA9B;;AAMA,0BAAI,CAAC+D,YAAL,EAAmB;AACf;AACH,uBAVgC,CAWjC;;;AACA,0BAAMC,eAAe,sBAAOV,WAAW,CAACnD,IAAnB,CAArB;;AAEA,0BAAIyB,KAAK,CAACC,OAAN,CAAckC,YAAY,CAACN,WAAb,CAAyBnB,QAAvC,CAAJ,EAAsD;AAClDyB,wBAAAA,YAAY,CAACN,WAAb,CAAyBnB,QAAzB,CAAkCqB,OAAlC,CAA0C,UAAA5D,GAAG,EAAI;AAC7C,8BAAI,CAACiE,eAAe,CAACC,QAAhB,CAAyBlE,GAAzB,CAAL,EAAoC;AAChCiE,4BAAAA,eAAe,CAACE,IAAhB,CAAqBnE,GAArB;AACH;AACJ,yBAJD;AAKH;;AAEDvB,sBAAAA,GAAG,CAACuF,YAAD,EAAe,sBAAf,EAAuCC,eAAvC,CAAH,CAtBiC,CAuBjC;;AACAZ,sBAAAA,KAAK,CAACU,UAAN,CAAiB;AACbN,wBAAAA,KAAK,EAAE/D,SADM;AAEb2C,wBAAAA,SAAS,EAAE;AAAEC,0BAAAA,KAAK,EAAEhD,QAAQ,CAAC4C,WAAW,CAACjC,KAAb;AAAjB,yBAFE;AAGb0C,wBAAAA,IAAI,EAAEqB;AAHO,uBAAjB;AAKH;AACJ;AAhEG,iBADZ,EAmEKI,IAnEL,CAmEU,YAAM;AACRpC,kBAAAA,cAAc,CAAC5B,IAAD,CAAd;AACAwB,kBAAAA,SAAS,CAAC,KAAD,CAAT;AACAF,kBAAAA,OAAO,CAAC,KAAD,CAAP;AACAO,kBAAAA,YAAY,CAAC,4BAAD,CAAZ;AACH,iBAxEL;;AAFM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAF;;AAAA;AAAA;AAAA;AAAA;AAJZ,KAiFK;AAAA,QAAGoC,IAAH,SAAGA,IAAH;AAAA,QAAS1B,IAAT,SAASA,IAAT;AAAA,QAAe2B,QAAf,SAAeA,QAAf;AAAA,QAAyBC,MAAzB,SAAyBA,MAAzB;AAAA,wBACG,oBAAC,KAAD,CAAO,QAAP,qBACI,mDACI,oBAAC,IAAD;AAAM,MAAA,SAAS,EAAE,iBAAjB;AAAoC,MAAA,IAAI,eAAE,oBAAC,SAAD;AAA1C,MADJ,EAEK7B,mBAAmB,CAAC;AACjB;AACA;AACAC,MAAAA,IAAI,EAAJA;AAHiB,KAAD,CAFxB,CADJ,EASKlB,OAAO,iBACJ,qDACI,oBAAC,IAAD;AACI,MAAA,IAAI,EAAE,MADV;AAEI,MAAA,YAAY,EAAE,sBACVrB,IADU,EAEVoE,YAFU,EAGT;AACD,YAAMC,aAAa,GAAGrE,IAAI,CAACE,GAAL,CAAS,UAAAN,GAAG,EAAI;AAClC,cAAM0E,cAAc,GAAG1E,GAAG,CAAC2E,WAAJ,EAAvB;AACA;AACxC;AACA;;AACwC,cACIzC,WAAW,CAACjC,KAAZ,IACA,CAACyE,cAAc,CAACE,UAAf,CAA0B1C,WAAW,CAACjC,KAAtC,CAFL,EAGE;AACE,6BAAUiC,WAAW,CAACjC,KAAtB,SAA8BH,eAA9B,SAAgD4E,cAAhD;AACH;;AACD,iBAAOA,cAAP;AACH,SAZqB,CAAtB;AAaAF,QAAAA,YAAY,CAACC,aAAD,CAAZ;AACH;AApBL,OAsBK;AAAA,UAAGI,KAAH,SAAGA,KAAH;AAAA,UAAaC,SAAb;;AAAA,0BACG,oBAAC,iBAAD,oBACQA,SADR;AAEI,QAAA,KAAK,EAAE3E,qBAAqB,CAAC0E,KAAD,EAAQ3C,WAAW,CAACjC,KAApB,CAFhC;AAGI,QAAA,OAAO,EAAEuC,OAHb;AAII,QAAA,WAAW,EAAE,gBAJjB;AAKI,QAAA,WAAW,EAAE,8CALjB;AAMI,QAAA,MAAM,EAAE,IANZ;AAOI,QAAA,cAAc,EAAE,IAPpB;AAQI,QAAA,eAAe,EAAE,IARrB;AASI,QAAA,QAAQ,EAAEb;AATd,SADH;AAAA,KAtBL,CADJ,eAqCI;AAAK,MAAA,SAAS,EAAET;AAAhB,oBACI,oBAAC,aAAD;AACI,MAAA,KAAK,MADT;AAEI,MAAA,OAAO,EAAE,iBAAA6D,EAAE,EAAI;AACXR,QAAAA,MAAM,CAACQ,EAAD,CAAN;AACH,OAJL;AAKI,qBAAa;AALjB,gBADJ,eAUI,oBAAC,eAAD;AACI,MAAA,KAAK,MADT;AAEI,MAAA,OAAO,EAAE,mBAAM;AACXT,QAAAA,QAAQ,CAAC,MAAD,EAASvC,WAAT,CAAR;AACAL,QAAAA,OAAO,CAAC,KAAD,CAAP;AACH;AALL,gBAVJ,CArCJ,CAVR,CADH;AAAA,GAjFL,CADJ;AA4JH,CA7ND;;AA+NA,eAAeL,IAAf","sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { css } from \"emotion\";\nimport { useApolloClient, useQuery } from \"@apollo/react-hooks\";\nimport set from \"lodash/set\";\nimport get from \"lodash/get\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport { Chips, Chip } from \"@webiny/ui/Chips\";\nimport { ButtonSecondary, ButtonPrimary, ButtonDefault, IconButton } from \"@webiny/ui/Button\";\nimport { MultiAutoComplete } from \"@webiny/ui/AutoComplete\";\nimport { Icon } from \"@webiny/ui/Icon\";\nimport { Form } from \"@webiny/form\";\nimport { useSnackbar } from \"~/hooks/useSnackbar\";\nimport { getWhere, useFileManager } from \"./../FileManagerContext\";\nimport {\n UPDATE_FILE,\n LIST_FILES,\n LIST_TAGS,\n ListFilesQueryResponse,\n ListFileTagsQueryResponse\n} from \"./../graphql\";\nimport { ReactComponent as EditIcon } from \"./../icons/round-edit-24px.svg\";\nimport { ReactComponent as LabelIcon } from \"./../icons/round-label-24px.svg\";\nimport { FileItem } from \"../types\";\n\nconst SCOPE_SEPARATOR = \":\";\n\nexport const formatTagAsLabel = (tag: string, scope: string | undefined) => {\n if (!scope) {\n return tag;\n }\n return tag.replace(`${scope}${SCOPE_SEPARATOR}`, \"\");\n};\n\nexport const tagWithoutScopePrefix = (tags: string[], scope: string) => {\n return tags.filter(tag => tag !== scope).map(tag => formatTagAsLabel(tag, scope));\n};\n\nconst chipsStyle = css({\n \"&.mdc-chip-set\": {\n padding: 0,\n marginLeft: -4,\n \"& .mdc-chip\": {\n backgroundColor: \"var(--mdc-theme-background)\"\n }\n }\n});\nconst iconButtonStyle = css({\n \"&.mdc-icon-button svg\": {\n width: 20,\n height: 20\n }\n});\nconst addTagsStyle = css({\n \"&.mdc-button:not(:disabled)\": {\n color: \"var(--mdc-theme-text-secondary-on-background)\",\n textTransform: \"capitalize\",\n letterSpacing: \"initial\",\n marginLeft: -8\n }\n});\nconst actionWrapperStyle = css({\n marginTop: 16,\n \"& button:first-child\": {\n marginRight: 16\n }\n});\n\ninterface TagsProps {\n file: FileItem;\n canEdit: (file: FileItem) => boolean;\n}\n\nconst Tags: React.FC<TagsProps> = ({ file, canEdit }) => {\n const client = useApolloClient();\n\n const [editing, setEdit] = useState(false);\n const [saving, setSaving] = useState(false);\n const [initialTags, setInitialTags] = useState(Array.isArray(file.tags) ? [...file.tags] : []);\n const { showSnackbar } = useSnackbar();\n const { queryParams } = useFileManager();\n const handleEdit = useCallback(() => setEdit(true), []);\n const listTagsQuery = useQuery(LIST_TAGS, {\n variables: { where: getWhere(queryParams.scope) }\n });\n const listTags = get(listTagsQuery, \"data.fileManager.listTags\", []);\n const allTags = tagWithoutScopePrefix(listTags, queryParams.scope);\n\n const isEditingAllowed = canEdit(file);\n\n const renderHeaderContent = useCallback(\n ({ data }: { data: { tags: { name: string }[] } }) => {\n if (editing) {\n return null;\n }\n const hasTags = data.tags.length > 0;\n\n if (hasTags) {\n // Render existing tags and \"edit tags\" action.\n return (\n <>\n <Chips className={classNames(\"list-item__content\", chipsStyle)}>\n {data.tags\n .filter(tag => tag !== queryParams.scope)\n .map((tag, index) => {\n const label = typeof tag === \"string\" ? tag : tag.name;\n return (\n <Chip\n key={label + index}\n label={formatTagAsLabel(label, queryParams.scope)}\n />\n );\n })}\n </Chips>\n {isEditingAllowed && (\n <IconButton\n className={iconButtonStyle}\n icon={<EditIcon />}\n onClick={handleEdit}\n />\n )}\n </>\n );\n }\n // Render \"add tags\" action.\n return (\n <ButtonDefault\n className={addTagsStyle}\n onClick={handleEdit}\n disabled={!isEditingAllowed}\n >\n Add tags...\n </ButtonDefault>\n );\n },\n [editing, isEditingAllowed]\n );\n\n return (\n <Form\n data={{\n tags: initialTags\n }}\n onSubmit={async ({ tags }) => {\n setSaving(true);\n client\n .mutate({\n mutation: UPDATE_FILE,\n variables: {\n id: file.id,\n data: { tags }\n },\n update: (cache, updated) => {\n const newFileData: FileItem = get(\n updated,\n \"data.fileManager.updateFile.data\"\n );\n\n // 1. Update files list cache\n const data = cloneDeep(\n cache.readQuery<ListFilesQueryResponse>({\n query: LIST_FILES,\n variables: queryParams\n })\n );\n\n if (data) {\n data.fileManager.listFiles.data.forEach(item => {\n if (item.key === newFileData.key) {\n item.tags = newFileData.tags;\n }\n });\n }\n\n cache.writeQuery({\n query: LIST_FILES,\n variables: queryParams,\n data\n });\n // 2. Update \"LIST_TAGS\" cache\n if (Array.isArray(newFileData.tags)) {\n // Get list tags data\n const listTagsData = cloneDeep(\n cache.readQuery<ListFileTagsQueryResponse>({\n query: LIST_TAGS,\n variables: { where: getWhere(queryParams.scope) }\n })\n );\n if (!listTagsData) {\n return;\n }\n // Add new tag in list\n const updatedTagsList = [...newFileData.tags];\n\n if (Array.isArray(listTagsData.fileManager.listTags)) {\n listTagsData.fileManager.listTags.forEach(tag => {\n if (!updatedTagsList.includes(tag)) {\n updatedTagsList.push(tag);\n }\n });\n }\n\n set(listTagsData, \"fileManager.listTags\", updatedTagsList);\n // Write it to cache\n cache.writeQuery({\n query: LIST_TAGS,\n variables: { where: getWhere(queryParams.scope) },\n data: listTagsData\n });\n }\n }\n })\n .then(() => {\n setInitialTags(tags);\n setSaving(false);\n setEdit(false);\n showSnackbar(\"Tags successfully updated.\");\n });\n }}\n >\n {({ Bind, data, setValue, submit }) => (\n <React.Fragment>\n <li-title>\n <Icon className={\"list-item__icon\"} icon={<LabelIcon />} />\n {renderHeaderContent({\n // TODO @ts-refactor\n // @ts-ignore\n data\n })}\n </li-title>\n {editing && (\n <li-content>\n <Bind\n name={\"tags\"}\n beforeChange={(\n tags: string[],\n baseOnChange: (tags: string[]) => void\n ) => {\n const formattedTags = tags.map(tag => {\n const tagInLowerCase = tag.toLowerCase();\n /**\n * If \"scope\" exists, prefix tag with \"scope\" if not already.\n */\n if (\n queryParams.scope &&\n !tagInLowerCase.startsWith(queryParams.scope)\n ) {\n return `${queryParams.scope}${SCOPE_SEPARATOR}${tagInLowerCase}`;\n }\n return tagInLowerCase;\n });\n baseOnChange(formattedTags);\n }}\n >\n {({ value, ...bindProps }) => (\n <MultiAutoComplete\n {...bindProps}\n value={tagWithoutScopePrefix(value, queryParams.scope)}\n options={allTags}\n placeholder={\"homepage asset\"}\n description={\"Type in a new tag or select an existing one.\"}\n unique={true}\n allowFreeInput={true}\n useSimpleValues={true}\n disabled={saving}\n />\n )}\n </Bind>\n <div className={actionWrapperStyle}>\n <ButtonPrimary\n small\n onClick={ev => {\n submit(ev);\n }}\n data-testid={\"fm.tags.submit\"}\n >\n Submit\n </ButtonPrimary>\n <ButtonSecondary\n small\n onClick={() => {\n setValue(\"tags\", initialTags);\n setEdit(false);\n }}\n >\n Cancel\n </ButtonSecondary>\n </div>\n </li-content>\n )}\n </React.Fragment>\n )}\n </Form>\n );\n};\n\nexport default Tags;\n"]}
@@ -33,7 +33,7 @@ import { ReactComponent as ImageIcon } from "../../assets/icons/insert_photo-24p
33
33
  import { ReactComponent as FileIcon } from "../../assets/icons/insert_drive_file-24px.svg";
34
34
  import { ReactComponent as CalendarIcon } from "../../assets/icons/today-24px.svg";
35
35
  import { ReactComponent as HighlightIcon } from "../../assets/icons/highlight-24px.svg";
36
- import { useFileManager } from "./FileManagerContext";
36
+ import { getWhere, useFileManager } from "./FileManagerContext";
37
37
  import { useMutation } from "@apollo/react-hooks";
38
38
  import { useSnackbar } from "../../hooks/useSnackbar";
39
39
  import { useSecurity } from "@webiny/app-security";
@@ -260,7 +260,10 @@ var FileDetails = function FileDetails(props) {
260
260
 
261
261
  // Get tags from cache
262
262
  var listTagsData = cloneDeep(cache.readQuery({
263
- query: LIST_TAGS
263
+ query: LIST_TAGS,
264
+ variables: {
265
+ where: getWhere(queryParams.scope)
266
+ }
264
267
  })); // Remove selected file tags from list.
265
268
 
266
269
  // Remove selected file tags from list.
@@ -275,6 +278,9 @@ var FileDetails = function FileDetails(props) {
275
278
  // Write it to cache
276
279
  cache.writeQuery({
277
280
  query: LIST_TAGS,
281
+ variables: {
282
+ where: getWhere(queryParams.scope)
283
+ },
278
284
  data: set(data, "fileManager.listTags", filteredTags)
279
285
  });
280
286
  }