1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace GraphQLAPI\GraphQLAPI\ConditionalOnEnvironment\Admin\Services\Menus; |
6
|
|
|
|
7
|
|
|
use GraphQLAPI\GraphQLAPI\General\RequestParams; |
8
|
|
|
use GraphQLAPI\GraphQLAPI\Security\UserAuthorization; |
9
|
|
|
use GraphQLAPI\GraphQLAPI\Facades\ModuleRegistryFacade; |
10
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\AboutMenuPage; |
11
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\SupportMenuPage; |
12
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\ModulesMenuPage; |
13
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\AbstractMenuPage; |
14
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\GraphiQLMenuPage; |
15
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\SettingsMenuPage; |
16
|
|
|
use PoP\ComponentModel\Facades\Instances\InstanceManagerFacade; |
17
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\GraphQLVoyagerMenuPage; |
18
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\ReleaseNotesAboutMenuPage; |
19
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\ModuleDocumentationMenuPage; |
20
|
|
|
use GraphQLAPI\GraphQLAPI\ModuleResolvers\ClientFunctionalityModuleResolver; |
21
|
|
|
use GraphQLByPoP\GraphQLClientsForWP\ComponentConfiguration as GraphQLClientsForWPComponentConfiguration; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* Admin menu class |
25
|
|
|
*/ |
26
|
|
|
class Menu extends AbstractMenu |
27
|
|
|
{ |
28
|
|
|
public const NAME = 'graphql_api'; |
29
|
|
|
|
30
|
|
|
public static function getName(): string |
31
|
|
|
{ |
32
|
|
|
return static::NAME; |
33
|
|
|
} |
34
|
|
|
|
35
|
|
|
/** |
36
|
|
|
* @return string[] |
37
|
|
|
*/ |
38
|
|
|
protected function getMenuPageClasses(): array |
39
|
|
|
{ |
40
|
|
|
return [ |
41
|
|
|
GraphiQLMenuPage::class, |
42
|
|
|
GraphQLVoyagerMenuPage::class, |
43
|
|
|
SettingsMenuPage::class, |
44
|
|
|
$this->getModuleMenuPageClass(), |
45
|
|
|
$this->getAboutMenuPageClass(), |
46
|
|
|
SupportMenuPage::class, |
47
|
|
|
]; |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
public function addMenuPagesTop(): void |
51
|
|
|
{ |
52
|
|
|
parent::addMenuPagesTop(); |
53
|
|
|
|
54
|
|
|
$instanceManager = InstanceManagerFacade::getInstance(); |
55
|
|
|
|
56
|
|
|
$schemaEditorAccessCapability = UserAuthorization::getSchemaEditorAccessCapability(); |
57
|
|
|
\add_menu_page( |
58
|
|
|
__('GraphQL API', 'graphql-api'), |
59
|
|
|
__('GraphQL API', 'graphql-api'), |
60
|
|
|
$schemaEditorAccessCapability, |
61
|
|
|
self::NAME, |
62
|
|
|
function () { |
63
|
|
|
}, |
64
|
|
|
'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkdyYXBoUUxfTG9nbyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4Ig0KCSB5PSIwcHgiIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA0MDAgNDAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8Zz4NCgkJCQ0KCQkJCTxyZWN0IHg9IjEyMiIgeT0iLTAuNCIgdHJhbnNmb3JtPSJtYXRyaXgoLTAuODY2IC0wLjUgMC41IC0wLjg2NiAxNjMuMzE5NiAzNjMuMzEzNikiIGZpbGw9IiNFNTM1QUIiIHdpZHRoPSIxNi42IiBoZWlnaHQ9IjMyMC4zIi8+DQoJCTwvZz4NCgk8L2c+DQoJPGc+DQoJCTxnPg0KCQkJPHJlY3QgeD0iMzkuOCIgeT0iMjcyLjIiIGZpbGw9IiNFNTM1QUIiIHdpZHRoPSIzMjAuMyIgaGVpZ2h0PSIxNi42Ii8+DQoJCTwvZz4NCgk8L2c+DQoJPGc+DQoJCTxnPg0KCQkJDQoJCQkJPHJlY3QgeD0iMzcuOSIgeT0iMzEyLjIiIHRyYW5zZm9ybT0ibWF0cml4KC0wLjg2NiAtMC41IDAuNSAtMC44NjYgODMuMDY5MyA2NjMuMzQwOSkiIGZpbGw9IiNFNTM1QUIiIHdpZHRoPSIxODUiIGhlaWdodD0iMTYuNiIvPg0KCQk8L2c+DQoJPC9nPg0KCTxnPg0KCQk8Zz4NCgkJCQ0KCQkJCTxyZWN0IHg9IjE3Ny4xIiB5PSI3MS4xIiB0cmFuc2Zvcm09Im1hdHJpeCgtMC44NjYgLTAuNSAwLjUgLTAuODY2IDQ2My4zNDA5IDI4My4wNjkzKSIgZmlsbD0iI0U1MzVBQiIgd2lkdGg9IjE4NSIgaGVpZ2h0PSIxNi42Ii8+DQoJCTwvZz4NCgk8L2c+DQoJPGc+DQoJCTxnPg0KCQkJDQoJCQkJPHJlY3QgeD0iMTIyLjEiIHk9Ii0xMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTAuNSAtMC44NjYgMC44NjYgLTAuNSAxMjYuNzkwMyAyMzIuMTIyMSkiIGZpbGw9IiNFNTM1QUIiIHdpZHRoPSIxNi42IiBoZWlnaHQ9IjE4NSIvPg0KCQk8L2c+DQoJPC9nPg0KCTxnPg0KCQk8Zz4NCgkJCQ0KCQkJCTxyZWN0IHg9IjEwOS42IiB5PSIxNTEuNiIgdHJhbnNmb3JtPSJtYXRyaXgoLTAuNSAtMC44NjYgMC44NjYgLTAuNSAyNjYuMDgyOCA0NzMuMzc2NikiIGZpbGw9IiNFNTM1QUIiIHdpZHRoPSIzMjAuMyIgaGVpZ2h0PSIxNi42Ii8+DQoJCTwvZz4NCgk8L2c+DQoJPGc+DQoJCTxnPg0KCQkJPHJlY3QgeD0iNTIuNSIgeT0iMTA3LjUiIGZpbGw9IiNFNTM1QUIiIHdpZHRoPSIxNi42IiBoZWlnaHQ9IjE4NSIvPg0KCQk8L2c+DQoJPC9nPg0KCTxnPg0KCQk8Zz4NCgkJCTxyZWN0IHg9IjMzMC45IiB5PSIxMDcuNSIgZmlsbD0iI0U1MzVBQiIgd2lkdGg9IjE2LjYiIGhlaWdodD0iMTg1Ii8+DQoJCTwvZz4NCgk8L2c+DQoJPGc+DQoJCTxnPg0KCQkJDQoJCQkJPHJlY3QgeD0iMjYyLjQiIHk9IjI0MC4xIiB0cmFuc2Zvcm09Im1hdHJpeCgtMC41IC0wLjg2NiAwLjg2NiAtMC41IDEyNi43OTUzIDcxNC4yODc1KSIgZmlsbD0iI0U1MzVBQiIgd2lkdGg9IjE0LjUiIGhlaWdodD0iMTYwLjkiLz4NCgkJPC9nPg0KCTwvZz4NCgk8cGF0aCBmaWxsPSIjRTUzNUFCIiBkPSJNMzY5LjUsMjk3LjljLTkuNiwxNi43LTMxLDIyLjQtNDcuNywxMi44Yy0xNi43LTkuNi0yMi40LTMxLTEyLjgtNDcuN2M5LjYtMTYuNywzMS0yMi40LDQ3LjctMTIuOA0KCQlDMzczLjUsMjU5LjksMzc5LjIsMjgxLjIsMzY5LjUsMjk3LjkiLz4NCgk8cGF0aCBmaWxsPSIjRTUzNUFCIiBkPSJNOTAuOSwxMzdjLTkuNiwxNi43LTMxLDIyLjQtNDcuNywxMi44Yy0xNi43LTkuNi0yMi40LTMxLTEyLjgtNDcuN2M5LjYtMTYuNywzMS0yMi40LDQ3LjctMTIuOA0KCQlDOTQuOCw5OSwxMDAuNSwxMjAuMyw5MC45LDEzNyIvPg0KCTxwYXRoIGZpbGw9IiNFNTM1QUIiIGQ9Ik0zMC41LDI5Ny45Yy05LjYtMTYuNy0zLjktMzgsMTIuOC00Ny43YzE2LjctOS42LDM4LTMuOSw0Ny43LDEyLjhjOS42LDE2LjcsMy45LDM4LTEyLjgsNDcuNw0KCQlDNjEuNCwzMjAuMyw0MC4xLDMxNC42LDMwLjUsMjk3LjkiLz4NCgk8cGF0aCBmaWxsPSIjRTUzNUFCIiBkPSJNMzA5LjEsMTM3Yy05LjYtMTYuNy0zLjktMzgsMTIuOC00Ny43YzE2LjctOS42LDM4LTMuOSw0Ny43LDEyLjhjOS42LDE2LjcsMy45LDM4LTEyLjgsNDcuNw0KCQlDMzQwLjEsMTU5LjQsMzE4LjcsMTUzLjcsMzA5LjEsMTM3Ii8+DQoJPHBhdGggZmlsbD0iI0U1MzVBQiIgZD0iTTIwMCwzOTUuOGMtMTkuMywwLTM0LjktMTUuNi0zNC45LTM0LjljMC0xOS4zLDE1LjYtMzQuOSwzNC45LTM0LjljMTkuMywwLDM0LjksMTUuNiwzNC45LDM0LjkNCgkJQzIzNC45LDM4MC4xLDIxOS4zLDM5NS44LDIwMCwzOTUuOCIvPg0KCTxwYXRoIGZpbGw9IiNFNTM1QUIiIGQ9Ik0yMDAsNzRjLTE5LjMsMC0zNC45LTE1LjYtMzQuOS0zNC45YzAtMTkuMywxNS42LTM0LjksMzQuOS0zNC45YzE5LjMsMCwzNC45LDE1LjYsMzQuOSwzNC45DQoJCUMyMzQuOSw1OC40LDIxOS4zLDc0LDIwMCw3NCIvPg0KPC9nPg0KPC9zdmc+DQo=' |
65
|
|
|
); |
66
|
|
|
|
67
|
|
|
/** |
68
|
|
|
* @var GraphiQLMenuPage |
69
|
|
|
*/ |
70
|
|
|
$graphiQLMenuPage = $instanceManager->getInstance(GraphiQLMenuPage::class); |
71
|
|
|
if ( |
72
|
|
|
$hookName = \add_submenu_page( |
73
|
|
|
self::NAME, |
74
|
|
|
__('GraphiQL', 'graphql-api'), |
75
|
|
|
__('GraphiQL', 'graphql-api'), |
76
|
|
|
$schemaEditorAccessCapability, |
77
|
|
|
self::NAME, |
78
|
|
|
[$graphiQLMenuPage, 'print'] |
79
|
|
|
) |
80
|
|
|
) { |
81
|
|
|
$graphiQLMenuPage->setHookName($hookName); |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* @var GraphQLVoyagerMenuPage |
86
|
|
|
*/ |
87
|
|
|
$graphQLVoyagerMenuPage = $instanceManager->getInstance(GraphQLVoyagerMenuPage::class); |
88
|
|
|
if ( |
89
|
|
|
$hookName = \add_submenu_page( |
90
|
|
|
self::NAME, |
91
|
|
|
__('Interactive Schema', 'graphql-api'), |
92
|
|
|
__('Interactive Schema', 'graphql-api'), |
93
|
|
|
$schemaEditorAccessCapability, |
94
|
|
|
$graphQLVoyagerMenuPage->getScreenID(), |
95
|
|
|
[$graphQLVoyagerMenuPage, 'print'] |
96
|
|
|
) |
97
|
|
|
) { |
98
|
|
|
$graphQLVoyagerMenuPage->setHookName($hookName); |
99
|
|
|
} |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
/** |
103
|
|
|
* Either the Modules menu page, or the Module Documentation menu page, |
104
|
|
|
* based on parameter ?tab="docs" or not |
105
|
|
|
*/ |
106
|
|
|
protected function getModuleMenuPageClass(): string |
107
|
|
|
{ |
108
|
|
|
return |
109
|
|
|
(isset($_GET[RequestParams::TAB]) && $_GET[RequestParams::TAB] == RequestParams::TAB_DOCS) ? |
110
|
|
|
ModuleDocumentationMenuPage::class : |
111
|
|
|
ModulesMenuPage::class; |
112
|
|
|
} |
113
|
|
|
|
114
|
|
|
/** |
115
|
|
|
* Either the About menu page, or the Release Notes menu page, |
116
|
|
|
* based on parameter ?tab="docs" or not |
117
|
|
|
*/ |
118
|
|
|
protected function getAboutMenuPageClass(): string |
119
|
|
|
{ |
120
|
|
|
return |
121
|
|
|
(isset($_GET[RequestParams::TAB]) && $_GET[RequestParams::TAB] == RequestParams::TAB_DOCS) ? |
122
|
|
|
ReleaseNotesAboutMenuPage::class : |
123
|
|
|
AboutMenuPage::class; |
124
|
|
|
} |
125
|
|
|
|
126
|
|
|
public function addMenuPagesBottom(): void |
127
|
|
|
{ |
128
|
|
|
parent::addMenuPagesBottom(); |
129
|
|
|
|
130
|
|
|
$instanceManager = InstanceManagerFacade::getInstance(); |
131
|
|
|
$menuPageClass = $this->getModuleMenuPageClass(); |
132
|
|
|
/** |
133
|
|
|
* @var AbstractMenuPage |
134
|
|
|
*/ |
135
|
|
|
$modulesMenuPage = $instanceManager->getInstance($menuPageClass); |
136
|
|
|
/** |
137
|
|
|
* @var callable |
138
|
|
|
*/ |
139
|
|
|
$callable = [$modulesMenuPage, 'print']; |
140
|
|
|
if ( |
141
|
|
|
$hookName = \add_submenu_page( |
142
|
|
|
self::NAME, |
143
|
|
|
__('Modules', 'graphql-api'), |
144
|
|
|
__('Modules', 'graphql-api'), |
145
|
|
|
'manage_options', |
146
|
|
|
$modulesMenuPage->getScreenID(), |
147
|
|
|
$callable |
148
|
|
|
) |
149
|
|
|
) { |
150
|
|
|
$modulesMenuPage->setHookName($hookName); |
151
|
|
|
} |
152
|
|
|
|
153
|
|
|
/** |
154
|
|
|
* @var SettingsMenuPage |
155
|
|
|
*/ |
156
|
|
|
$settingsMenuPage = $instanceManager->getInstance(SettingsMenuPage::class); |
157
|
|
|
if ( |
158
|
|
|
$hookName = \add_submenu_page( |
159
|
|
|
self::NAME, |
160
|
|
|
__('Settings', 'graphql-api'), |
161
|
|
|
__('Settings', 'graphql-api'), |
162
|
|
|
'manage_options', |
163
|
|
|
$settingsMenuPage->getScreenID(), |
164
|
|
|
[$settingsMenuPage, 'print'] |
165
|
|
|
) |
166
|
|
|
) { |
167
|
|
|
$settingsMenuPage->setHookName($hookName); |
168
|
|
|
} |
169
|
|
|
|
170
|
|
|
$moduleRegistry = ModuleRegistryFacade::getInstance(); |
171
|
|
|
if ($moduleRegistry->isModuleEnabled(ClientFunctionalityModuleResolver::GRAPHIQL_FOR_SINGLE_ENDPOINT)) { |
172
|
|
|
global $submenu; |
173
|
|
|
$clientPath = GraphQLClientsForWPComponentConfiguration::getGraphiQLClientEndpoint(); |
174
|
|
|
$submenu[self::NAME][] = [ |
175
|
|
|
__('GraphiQL (public client)', 'graphql-api'), |
176
|
|
|
'read', |
177
|
|
|
home_url($clientPath), |
178
|
|
|
]; |
179
|
|
|
} |
180
|
|
|
|
181
|
|
|
if ($moduleRegistry->isModuleEnabled(ClientFunctionalityModuleResolver::INTERACTIVE_SCHEMA_FOR_SINGLE_ENDPOINT)) { |
182
|
|
|
global $submenu; |
183
|
|
|
$clientPath = GraphQLClientsForWPComponentConfiguration::getVoyagerClientEndpoint(); |
184
|
|
|
$submenu[self::NAME][] = [ |
185
|
|
|
__('Interactive Schema (public client)', 'graphql-api'), |
186
|
|
|
'read', |
187
|
|
|
home_url($clientPath), |
188
|
|
|
]; |
189
|
|
|
} |
190
|
|
|
|
191
|
|
|
/** |
192
|
|
|
* Only show the About page when actually loading it |
193
|
|
|
* So it doesn't appear on the menu, but it's still available |
194
|
|
|
* to display the release notes on the modal window |
195
|
|
|
*/ |
196
|
|
|
$aboutPageClass = $this->getAboutMenuPageClass(); |
197
|
|
|
/** |
198
|
|
|
* @var AbstractMenuPage |
199
|
|
|
*/ |
200
|
|
|
$aboutMenuPage = $instanceManager->getInstance($aboutPageClass); |
201
|
|
|
if (isset($_GET['page']) && $_GET['page'] == $aboutMenuPage->getScreenID()) { |
202
|
|
|
if ( |
203
|
|
|
$hookName = \add_submenu_page( |
204
|
|
|
self::NAME, |
205
|
|
|
__('About', 'graphql-api'), |
206
|
|
|
__('About', 'graphql-api'), |
207
|
|
|
'read', |
208
|
|
|
$aboutMenuPage->getScreenID(), |
209
|
|
|
[$aboutMenuPage, 'print'] |
210
|
|
|
) |
211
|
|
|
) { |
212
|
|
|
$aboutMenuPage->setHookName($hookName); |
213
|
|
|
} |
214
|
|
|
} |
215
|
|
|
|
216
|
|
|
/** |
217
|
|
|
* @var SupportMenuPage |
218
|
|
|
*/ |
219
|
|
|
$supportMenuPage = $instanceManager->getInstance(SupportMenuPage::class); |
220
|
|
|
if ( |
221
|
|
|
$hookName = \add_submenu_page( |
222
|
|
|
self::NAME, |
223
|
|
|
__('Support', 'graphql-api'), |
224
|
|
|
__('Support', 'graphql-api'), |
225
|
|
|
'read', |
226
|
|
|
$supportMenuPage->getScreenID(), |
227
|
|
|
[$supportMenuPage, 'print'] |
228
|
|
|
) |
229
|
|
|
) { |
230
|
|
|
$supportMenuPage->setHookName($hookName); |
231
|
|
|
} |
232
|
|
|
|
233
|
|
|
// $schemaEditorAccessCapability = UserAuthorization::getSchemaEditorAccessCapability(); |
234
|
|
|
// if (\current_user_can($schemaEditorAccessCapability)) { |
235
|
|
|
// global $submenu; |
236
|
|
|
// $submenu[self::NAME][] = [ |
237
|
|
|
// __('Documentation', 'graphql-api'), |
238
|
|
|
// $schemaEditorAccessCapability, |
239
|
|
|
// 'https://graphql-api.com/documentation/', |
240
|
|
|
// ]; |
241
|
|
|
// } |
242
|
|
|
} |
243
|
|
|
} |
244
|
|
|
|