diff --git a/package-lock.json b/package-lock.json index 5ab964ae1..7f84620d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "graph-explorer-v2", - "version": "6.2.0", + "version": "6.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4050,25 +4050,12 @@ }, "dependencies": { "@types/react-dom": { - "version": "18.0.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", - "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz", + "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==", "dev": true, "requires": { - "@types/react": "*" - }, - "dependencies": { - "@types/react": { - "version": "17.0.30", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.30.tgz", - "integrity": "sha512-3Dt/A8gd3TCXi2aRe84y7cK1K8G+N9CZRDG8kDGguOKa0kf/ZkSwTmVIDPsm/KbQOVMaDJXwhBtuOXxqwdpWVg==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - } + "@types/react": "^17" } } } @@ -5652,7 +5639,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "at-least-node": { @@ -6729,7 +6716,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "destroy": { @@ -13048,7 +13035,7 @@ "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -14357,7 +14344,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "pretty-bytes": { @@ -16206,7 +16193,7 @@ "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" diff --git a/package.json b/package.json index a32c92984..7cfd2d22a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graph-explorer-v2", - "version": "6.2.0", + "version": "6.3.0", "private": true, "dependencies": { "@augloop/types-core": "file:packages/types-core-2.16.189.tgz", diff --git a/src/app/services/actions/profile-action-creators.ts b/src/app/services/actions/profile-action-creators.ts index 47ac3f07c..3df642a0d 100644 --- a/src/app/services/actions/profile-action-creators.ts +++ b/src/app/services/actions/profile-action-creators.ts @@ -98,7 +98,7 @@ export async function getBetaProfile(): Promise { const profileType = getProfileType(userInfo); return { ageGroup, profileType }; } catch (error) { - return { ageGroup: 0, profileType: ACCOUNT_TYPE.MSA }; + return { ageGroup: 0, profileType: ACCOUNT_TYPE.UNDEFINED }; } } @@ -151,17 +151,14 @@ export async function getProfileResponse(): Promise { } export async function getTenantInfo(profileType: ACCOUNT_TYPE) { - if(profileType===ACCOUNT_TYPE.AAD) { - try{ - query.sampleUrl = USER_ORGANIZATION_URL; - const { userInfo: tenant } = await getProfileResponse(); - return tenant.value[0]?.displayName; - } catch (error: any) { - return ''; - } - } if(profileType===ACCOUNT_TYPE.MSA) { return 'Personal'; } - return ''; + try{ + query.sampleUrl = USER_ORGANIZATION_URL; + const { userInfo: tenant } = await getProfileResponse(); + return tenant.value[0]?.displayName; + } catch (error: any) { + return ''; + } } diff --git a/src/app/services/actions/query-action-creator-util.ts b/src/app/services/actions/query-action-creator-util.ts index aeb2930d5..125407723 100644 --- a/src/app/services/actions/query-action-creator-util.ts +++ b/src/app/services/actions/query-action-creator-util.ts @@ -106,13 +106,11 @@ function createAuthenticatedRequest( authProvider, msalAuthOptions ) - const graphRequest = GraphClient.getInstance() + return GraphClient.getInstance() .api(encodeHashCharacters(query)) .middlewareOptions([middlewareOptions]) .headers(sampleHeaders) .responseType(ResponseType.RAW); - - return graphRequest; } export function makeGraphRequest(scopes: string[]): Function { @@ -212,8 +210,7 @@ export async function generateResponseDownloadUrl( if (fileContents) { const buffer = await response.arrayBuffer(); const blob = new Blob([buffer], { type: contentType }); - const downloadUrl = URL.createObjectURL(blob); - return downloadUrl; + return URL.createObjectURL(blob); } } catch (error) { return null; diff --git a/src/app/services/actions/snippet-action-creator.ts b/src/app/services/actions/snippet-action-creator.ts index b96609a5b..803b3cdf0 100644 --- a/src/app/services/actions/snippet-action-creator.ts +++ b/src/app/services/actions/snippet-action-creator.ts @@ -5,7 +5,8 @@ import { parseSampleUrl } from '../../utils/sample-url-generation'; import { GET_SNIPPET_ERROR, GET_SNIPPET_PENDING, - GET_SNIPPET_SUCCESS + GET_SNIPPET_SUCCESS, + SET_SNIPPET_TAB_SUCCESS } from '../redux-constants'; export function getSnippetSuccess(response: string): IAction { @@ -28,6 +29,13 @@ export function getSnippetPending(): any { }; } +export function setSnippetTabSuccess(response: string): any { + return { + type: SET_SNIPPET_TAB_SUCCESS, + response + } +} + export function getSnippet(language: string): Function { return async (dispatch: Function, getState: Function) => { const { devxApi, sampleQuery } = getState(); diff --git a/src/app/services/reducers/snippet-reducer.ts b/src/app/services/reducers/snippet-reducer.ts index c01793750..c9db0d0bd 100644 --- a/src/app/services/reducers/snippet-reducer.ts +++ b/src/app/services/reducers/snippet-reducer.ts @@ -1,33 +1,45 @@ import { IAction } from '../../../types/action'; -import { GET_SNIPPET_ERROR, GET_SNIPPET_PENDING, GET_SNIPPET_SUCCESS } from '../redux-constants'; +import { + GET_SNIPPET_ERROR, GET_SNIPPET_PENDING, GET_SNIPPET_SUCCESS, + SET_SNIPPET_TAB_SUCCESS +} from '../redux-constants'; import { ISnippet } from '../../../types/snippets'; const initialState: ISnippet = { pending: false, data: {}, - error: null + error: null, + snippetTab: 'csharp' }; export function snippets(state = initialState, action: IAction): any { switch (action.type) { case GET_SNIPPET_SUCCESS: return { + ...state, pending: false, data: action.response as object, error: null }; case GET_SNIPPET_ERROR: return { + ...state, pending: false, data: null, error: action.response as object }; case GET_SNIPPET_PENDING: return { + ...state, pending: true, data: null, error: null }; + case SET_SNIPPET_TAB_SUCCESS: + return { + ...state, + snippetTab: action.response + } default: return state; } diff --git a/src/app/services/redux-constants.ts b/src/app/services/redux-constants.ts index 419e4b968..299ace217 100644 --- a/src/app/services/redux-constants.ts +++ b/src/app/services/redux-constants.ts @@ -52,4 +52,5 @@ export const GET_POLICY_ERROR = 'GET_POLICY_ERROR'; export const GET_POLICY_PENDING = 'GET_POLICY_PENDING'; export const RESOURCEPATHS_ADD_SUCCESS = 'RESOURCEPATHS_ADD_SUCCESS'; export const RESOURCEPATHS_DELETE_SUCCESS = 'RESOURCEPATHS_DELETE_SUCCESS'; -export const BULK_ADD_HISTORY_ITEMS_SUCCESS = 'BULK_ADD_HISTORY_ITEMS_SUCCESS' +export const BULK_ADD_HISTORY_ITEMS_SUCCESS = 'BULK_ADD_HISTORY_ITEMS_SUCCESS'; +export const SET_SNIPPET_TAB_SUCCESS = 'SET_SNIPPET_TAB_SUCCESS'; diff --git a/src/app/views/query-response/QueryResponse.tsx b/src/app/views/query-response/QueryResponse.tsx index a0825c894..d34c2efc5 100644 --- a/src/app/views/query-response/QueryResponse.tsx +++ b/src/app/views/query-response/QueryResponse.tsx @@ -16,7 +16,7 @@ import { sanitizeQueryUrl } from '../../utils/query-url-sanitization'; import { expandResponseArea } from '../../services/actions/response-expanded-action-creator'; import { translateMessage } from '../../utils/translate-messages'; import { copy } from '../common/copy'; -import { getPivotItems, onPivotItemClick } from './pivot-items/pivot-items'; +import { GetPivotItems, onPivotItemClick } from './pivot-items/pivot-items'; import './query-response.scss'; import { IRootState } from '../../../types/root'; import { CopyButton } from '../common/copy/CopyButton'; @@ -124,7 +124,7 @@ const QueryResponse = (props: IQueryResponseProps) => { className={'pivot-response'} selectedKey={currentTab} > - {getPivotItems()} + {GetPivotItems()} { onModalPivotItemClicked(pivotItem)} selectedKey={currentTab}> - {getPivotItems()} + {GetPivotItems()} } diff --git a/src/app/views/query-response/pivot-items/pivot-items.tsx b/src/app/views/query-response/pivot-items/pivot-items.tsx index 207b15e0f..205ce3837 100644 --- a/src/app/views/query-response/pivot-items/pivot-items.tsx +++ b/src/app/views/query-response/pivot-items/pivot-items.tsx @@ -19,7 +19,7 @@ import { queryResponseStyles } from '../queryResponse.styles'; import { Response } from '../response'; import { Snippets } from '../snippets'; -export const getPivotItems = () => { +export const GetPivotItems = () => { const { graphExplorerMode: mode, sampleQuery, graphResponse: { body } } = useSelector((state: IRootState) => state); @@ -90,7 +90,6 @@ export const getPivotItems = () => {
]; - if (mode === Mode.Complete) { pivotItems.push( state); const supportedLanguages = { 'CSharp': { sdkDownloadLink: 'https://aka.ms/csharpsdk', @@ -28,7 +33,20 @@ function GetSnippets() { } }; - return {renderSnippets(supportedLanguages)}; + const handlePivotItemClick = (pivotItem?: PivotItem) => { + if (!pivotItem) { + return; + } + dispatch(setSnippetTabSuccess(pivotItem.props.itemKey!)) + } + + return + {renderSnippets(supportedLanguages)} + ; } export const Snippets = telemetry.trackReactComponent( GetSnippets, diff --git a/src/app/views/query-response/snippets/snippets-helper.tsx b/src/app/views/query-response/snippets/snippets-helper.tsx index 72f1e8ade..263953d4a 100644 --- a/src/app/views/query-response/snippets/snippets-helper.tsx +++ b/src/app/views/query-response/snippets/snippets-helper.tsx @@ -34,6 +34,7 @@ export function renderSnippets(supportedLanguages: ISupportedLanguages) { headerButtonProps={{ 'aria-controls': `${language}-tab` }} + itemKey={language} > diff --git a/src/app/views/query-runner/QueryRunner.styles.ts b/src/app/views/query-runner/QueryRunner.styles.ts index 84f761f82..dd8ec4436 100644 --- a/src/app/views/query-runner/QueryRunner.styles.ts +++ b/src/app/views/query-runner/QueryRunner.styles.ts @@ -3,7 +3,8 @@ export const queryRunnerStyles = () => { verbSelector: { title: { paddingRight: 0, - color: '#ffffff !important' + color: '#ffffff !important', + background: '' }, caretDown: { color: '#ffffff !important' @@ -15,6 +16,11 @@ export const queryRunnerStyles = () => { border: '1px solid', width: '100%' } + }, + queryButtonStyles: { + root: { + flexBasis: '75px' + } } }; }; \ No newline at end of file diff --git a/src/app/views/query-runner/query-input/QueryInput.tsx b/src/app/views/query-runner/query-input/QueryInput.tsx index 501fd711e..73aebba12 100644 --- a/src/app/views/query-runner/query-input/QueryInput.tsx +++ b/src/app/views/query-runner/query-input/QueryInput.tsx @@ -1,4 +1,4 @@ -import { Dropdown, IDropdownOption } from '@fluentui/react'; +import { Dropdown, IDropdownOption, IStackTokens, Stack } from '@fluentui/react'; import React from 'react'; import { injectIntl } from 'react-intl'; import { useDispatch, useSelector } from 'react-redux'; @@ -34,11 +34,12 @@ const QueryInput = (props: IQueryInputProps) => { }); const { sampleQuery, authToken, - isLoadingData: submitting } = useSelector((state: IRootState) => state); + isLoadingData: submitting, sidebarProperties } = useSelector((state: IRootState) => state); const authenticated = !!authToken.token; + const { mobileScreen } = sidebarProperties; const showError = !authenticated && sampleQuery.selectedVerb !== 'GET'; - const verbSelector: any = queryRunnerStyles().verbSelector; + const { queryButtonStyles, verbSelector } = queryRunnerStyles(); verbSelector.title = { ...verbSelector.title, background: getStyleFor(sampleQuery.selectedVerb) @@ -56,8 +57,8 @@ const QueryInput = (props: IQueryInputProps) => { if (GRAPH_API_VERSIONS.includes(newQueryVersion)) { query.selectedVersion = newQueryVersion; - query.sampleUrl = newUrl; } + query.sampleUrl = newUrl; return query; } @@ -71,10 +72,14 @@ const QueryInput = (props: IQueryInputProps) => { }, 500); }; + const queryInputStackTokens: IStackTokens = { + childrenGap: 7 + }; + return ( <> -
-
+ + { errorMessage={showError ? translateMessage('Sign in to use this method') : undefined} onChange={(event, method) => handleOnMethodChange(method)} /> -
-
+ + handleOnVersionChange(method)} /> -
-
+ + -
-
+ + { submitting={submitting} allowDisabledFocus={true} /> -
-
+ + -
-
+ + ) } diff --git a/src/messages/GE.json b/src/messages/GE.json index 7162a9e29..f7501f67a 100644 --- a/src/messages/GE.json +++ b/src/messages/GE.json @@ -286,8 +286,7 @@ "Learn more about the Microsoft Graph Toolkit": "Microsoft Graph Toolkit public repo", "Open this example in": "Open this example in", "graph toolkit playground": "Graph toolkit playground", - "consent to scopes": " You need to consent to the permissions on the ", - "Permission": "Permission", + "consent to scopes": " Either the signed-in user does not have sufficient privileges, or you need to consent to one of the permissions on the ", "Display string": "Display string", "Description": "Description", "Status": "Status", diff --git a/src/messages/GE_de-DE.json b/src/messages/GE_de-DE.json index 60c29c36a..ca1c87d14 100644 --- a/src/messages/GE_de-DE.json +++ b/src/messages/GE_de-DE.json @@ -286,8 +286,7 @@ "Learn more about the Microsoft Graph Toolkit": "Öffentliches Repo des Microsoft Graph-Toolkit", "Open this example in": "Öffnen Sie dieses Beispiel in", "graph toolkit playground": "Graph-Toolkit-Spielplatz", - "consent to scopes": " Sie müssen den Berechtigungen zustimmen ", - "Permission": "Berechtigung", + "consent to scopes": " Entweder verfügt der angemeldete Benutzer nicht über ausreichende Berechtigungen, oder Sie müssen die Zustimmung geben für eine der Berechtigungen auf dem ", "Display string": "Anzeigezeichenfolge", "Description": "Beschreibung", "Status": "Status", diff --git a/src/messages/GE_es-ES.json b/src/messages/GE_es-ES.json index d79fb79f3..7de6937e3 100644 --- a/src/messages/GE_es-ES.json +++ b/src/messages/GE_es-ES.json @@ -285,9 +285,8 @@ "We did not find a Graph toolkit for this query": "No hay ningún componente del kit de herramientas disponible para esta respuesta. Para obtener más información sobre el kit de herramientas y colaborar en él, consulte", "Learn more about the Microsoft Graph Toolkit": "Repositorio público del Kit de herramientas de Microsoft Graph", "Open this example in": "Abra este ejemplo en", - "graph toolkit playground": "Animación de Graph Toolkit", - "consent to scopes": " Debe dar su consentimiento para conceder los permisos en el ", - "Permission": "Permiso", + "graph toolkit playground": "Animación del Kit de herramientas de Microsoft Graph", + "consent to scopes": " El usuario que ha iniciado sesión no tiene privilegios suficientes o usted debe dar su consentimiento a uno de los permisos en el ", "Display string": "Mostrar cadena", "Description": "Descripción", "Status": "Estado", diff --git a/src/messages/GE_fr-FR.json b/src/messages/GE_fr-FR.json index 14b1a6e48..f5bc94987 100644 --- a/src/messages/GE_fr-FR.json +++ b/src/messages/GE_fr-FR.json @@ -285,9 +285,8 @@ "We did not find a Graph toolkit for this query": "Aucun composant du kit d’outils n’est disponible pour cette réponse. Pour en savoir plus sur et contribuer au kit de ressources, voir le", "Learn more about the Microsoft Graph Toolkit": "Référentiel public du kit de ressources Microsoft Graph", "Open this example in": "Ouvrir cet exemple dans", - "graph toolkit playground": "Air de jeu du kit de ressources Graph", - "consent to scopes": " Vous devez accepter les autorisations sur le ", - "Permission": "Autorisation", + "graph toolkit playground": "Terrain de jeu du kit de ressources Graph", + "consent to scopes": " Soit l’utilisateur connecté ne dispose pas de privilèges suffisants, soit vous devez donner votre consentement à l’une des autorisations sur le ", "Display string": "Chaîne d’affichage", "Description": "Description", "Status": "État", diff --git a/src/messages/GE_ja-JP.json b/src/messages/GE_ja-JP.json index f6eca1b49..f48448710 100644 --- a/src/messages/GE_ja-JP.json +++ b/src/messages/GE_ja-JP.json @@ -286,8 +286,7 @@ "Learn more about the Microsoft Graph Toolkit": "Microsoft Graph ツールキット パブリック リポジトリ", "Open this example in": "この例をこちらで開く", "graph toolkit playground": "Graph のツールキット プレイグラウンド", - "consent to scopes": " こちらの許可に同意する必要があります。 ", - "Permission": "アクセス許可", + "consent to scopes": " サインインしたユーザーが十分な権限を持っていないか、または次のアクセス許可のいずれかに同意する必要があります ", "Display string": "表示文字列", "Description": "説明", "Status": "状態", @@ -449,7 +448,7 @@ "Help": "ヘルプ", "Graph Documentation": "Microsoft Graph API リファレンス", "Parts between {} need to be replaced with real values": "{} 間の部分は実際の値に置き換える必要があります", - "Get started with Graph Explorer": "Microsoft Graph エクスプローラーの使用を開始する", + "Get started with Graph Explorer": "Graph エクスプローラーの使用を開始", "No resources found": "リソース項目が見つかりませんでした", "No samples found": "サンプル クエリが見つかりませんでした" } \ No newline at end of file diff --git a/src/messages/GE_pt-BR.json b/src/messages/GE_pt-BR.json index e5fda9baf..e356c9db1 100644 --- a/src/messages/GE_pt-BR.json +++ b/src/messages/GE_pt-BR.json @@ -285,10 +285,9 @@ "We did not find a Graph toolkit for this query": "Nenhum componente do kit de ferramentas está disponível para esta resposta. Para saber mais sobre e contribuir com o kit de ferramentas, confira o", "Learn more about the Microsoft Graph Toolkit": "Repositório público do Microsoft Graph Toolkit", "Open this example in": "Abrir este exemplo no", - "graph toolkit playground": "Graph Toolkit playground", - "consent to scopes": " Você precisa consentir com as permissões no ", - "Permission": "Permissão", - "Display string": "Sequência de exibição", + "graph toolkit playground": "Playground para o Microsoft Graph Toolkit", + "consent to scopes": " Ou o usuário conectado não tem privilégios suficientes, ou você precisa consentir com uma das permissões na ", + "Display string": "Cadeia de caracteres de exibição", "Description": "Descrição", "Status": "Status", "Admin consent required": "É necessário o consentimento do administrador", diff --git a/src/messages/GE_ru-RU.json b/src/messages/GE_ru-RU.json index 135c92432..d13855bd3 100644 --- a/src/messages/GE_ru-RU.json +++ b/src/messages/GE_ru-RU.json @@ -286,8 +286,7 @@ "Learn more about the Microsoft Graph Toolkit": "Общедоступный репозиторий набора инструментов Microsoft Graph", "Open this example in": "Открыть этот пример в", "graph toolkit playground": "Интерактивная среда набора инструментов Graph", - "consent to scopes": " Необходимо дать согласие на разрешения ", - "Permission": "Разрешение", + "consent to scopes": " У вошедшего пользователя нет достаточных привилегий или необходимо дать согласие на одно из разрешений в ", "Display string": "Отображаемая строка", "Description": "Описание", "Status": "Состояние", diff --git a/src/messages/GE_zh-CN.json b/src/messages/GE_zh-CN.json index d4aebf7c7..ea77452c5 100644 --- a/src/messages/GE_zh-CN.json +++ b/src/messages/GE_zh-CN.json @@ -286,8 +286,7 @@ "Learn more about the Microsoft Graph Toolkit": "Microsoft Graph 工具包公共资源库", "Open this example in": "在 中打开这个号示例", "graph toolkit playground": "图形工具包样本", - "consent to scopes": " 您需要同意以下权限 ", - "Permission": "权限", + "consent to scopes": " 登录的用户没有足够权限,或者你需要同意以下项的权限之一: ", "Display string": "显示字符串", "Description": "说明", "Status": "状态", diff --git a/src/types/snippets.ts b/src/types/snippets.ts index e05127f30..e8b5f6b07 100644 --- a/src/types/snippets.ts +++ b/src/types/snippets.ts @@ -4,4 +4,5 @@ export interface ISnippet extends IApiResponse { pending: boolean; data: any; error: any | null; + snippetTab?: string; }