1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace GraphQLAPI\GraphQLAPI\Admin\Menus; |
6
|
|
|
|
7
|
|
|
use GraphQLAPI\GraphQLAPI\General\RequestParams; |
8
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\Menus\AbstractMenu; |
9
|
|
|
use GraphQLAPI\GraphQLAPI\Security\UserAuthorization; |
10
|
|
|
use GraphQLAPI\GraphQLAPI\Facades\ModuleRegistryFacade; |
11
|
|
|
use GraphQLAPI\GraphQLAPI\Admin\MenuPages\AboutMenuPage; |
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
|
|
|
]; |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
public function addMenuPagesTop(): void |
50
|
|
|
{ |
51
|
|
|
parent::addMenuPagesTop(); |
52
|
|
|
|
53
|
|
|
$instanceManager = InstanceManagerFacade::getInstance(); |
54
|
|
|
|
55
|
|
|
$schemaEditorAccessCapability = UserAuthorization::getSchemaEditorAccessCapability(); |
56
|
|
|
\add_menu_page( |
57
|
|
|
__('GraphQL API', 'graphql-api'), |
58
|
|
|
__('GraphQL API', 'graphql-api'), |
59
|
|
|
$schemaEditorAccessCapability, |
60
|
|
|
self::NAME, |
61
|
|
|
function () { |
62
|
|
|
}, |
63
|
|
|
'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=' |
64
|
|
|
); |
65
|
|
|
|
66
|
|
|
/** |
67
|
|
|
* @var GraphiQLMenuPage |
68
|
|
|
*/ |
69
|
|
|
$graphiQLMenuPage = $instanceManager->getInstance(GraphiQLMenuPage::class); |
70
|
|
|
if ($hookName = \add_submenu_page( |
71
|
|
|
self::NAME, |
72
|
|
|
__('GraphiQL', 'graphql-api'), |
73
|
|
|
__('GraphiQL', 'graphql-api'), |
74
|
|
|
$schemaEditorAccessCapability, |
75
|
|
|
self::NAME, |
76
|
|
|
[$graphiQLMenuPage, 'print'] |
77
|
|
|
) |
78
|
|
|
) { |
79
|
|
|
$graphiQLMenuPage->setHookName($hookName); |
80
|
|
|
} |
81
|
|
|
|
82
|
|
|
/** |
83
|
|
|
* @var GraphQLVoyagerMenuPage |
84
|
|
|
*/ |
85
|
|
|
$graphQLVoyagerMenuPage = $instanceManager->getInstance(GraphQLVoyagerMenuPage::class); |
86
|
|
|
if ($hookName = \add_submenu_page( |
87
|
|
|
self::NAME, |
88
|
|
|
__('Interactive Schema', 'graphql-api'), |
89
|
|
|
__('Interactive Schema', 'graphql-api'), |
90
|
|
|
$schemaEditorAccessCapability, |
91
|
|
|
$graphQLVoyagerMenuPage->getScreenID(), |
92
|
|
|
[$graphQLVoyagerMenuPage, 'print'] |
93
|
|
|
) |
94
|
|
|
) { |
95
|
|
|
$graphQLVoyagerMenuPage->setHookName($hookName); |
96
|
|
|
} |
97
|
|
|
} |
98
|
|
|
|
99
|
|
|
/** |
100
|
|
|
* Either the Modules menu page, or the Module Documentation menu page, |
101
|
|
|
* based on parameter ?tab="docs" or not |
102
|
|
|
*/ |
103
|
|
|
protected function getModuleMenuPageClass(): string |
104
|
|
|
{ |
105
|
|
|
return |
106
|
|
|
($_GET[RequestParams::TAB] == RequestParams::TAB_DOCS) ? |
107
|
|
|
ModuleDocumentationMenuPage::class : |
108
|
|
|
ModulesMenuPage::class; |
109
|
|
|
} |
110
|
|
|
|
111
|
|
|
/** |
112
|
|
|
* Either the About menu page, or the Release Notes menu page, |
113
|
|
|
* based on parameter ?tab="docs" or not |
114
|
|
|
*/ |
115
|
|
|
protected function getAboutMenuPageClass(): string |
116
|
|
|
{ |
117
|
|
|
return |
118
|
|
|
($_GET[RequestParams::TAB] == RequestParams::TAB_DOCS) ? |
119
|
|
|
ReleaseNotesAboutMenuPage::class : |
120
|
|
|
AboutMenuPage::class; |
121
|
|
|
} |
122
|
|
|
|
123
|
|
|
public function addMenuPagesBottom(): void |
124
|
|
|
{ |
125
|
|
|
parent::addMenuPagesBottom(); |
126
|
|
|
|
127
|
|
|
$instanceManager = InstanceManagerFacade::getInstance(); |
128
|
|
|
$menuPageClass = $this->getModuleMenuPageClass(); |
129
|
|
|
/** |
130
|
|
|
* @var AbstractMenuPage |
131
|
|
|
*/ |
132
|
|
|
$modulesMenuPage = $instanceManager->getInstance($menuPageClass); |
133
|
|
|
/** |
134
|
|
|
* @var callable |
135
|
|
|
*/ |
136
|
|
|
$callable = [$modulesMenuPage, 'print']; |
137
|
|
|
if ($hookName = \add_submenu_page( |
138
|
|
|
self::NAME, |
139
|
|
|
__('Modules', 'graphql-api'), |
140
|
|
|
__('Modules', 'graphql-api'), |
141
|
|
|
'manage_options', |
142
|
|
|
$modulesMenuPage->getScreenID(), |
143
|
|
|
$callable |
144
|
|
|
) |
145
|
|
|
) { |
146
|
|
|
$modulesMenuPage->setHookName($hookName); |
147
|
|
|
} |
148
|
|
|
|
149
|
|
|
/** |
150
|
|
|
* @var SettingsMenuPage |
151
|
|
|
*/ |
152
|
|
|
$settingsMenuPage = $instanceManager->getInstance(SettingsMenuPage::class); |
153
|
|
|
if ($hookName = \add_submenu_page( |
154
|
|
|
self::NAME, |
155
|
|
|
__('Settings', 'graphql-api'), |
156
|
|
|
__('Settings', 'graphql-api'), |
157
|
|
|
'manage_options', |
158
|
|
|
$settingsMenuPage->getScreenID(), |
159
|
|
|
[$settingsMenuPage, 'print'] |
160
|
|
|
) |
161
|
|
|
) { |
162
|
|
|
$settingsMenuPage->setHookName($hookName); |
163
|
|
|
} |
164
|
|
|
|
165
|
|
|
$moduleRegistry = ModuleRegistryFacade::getInstance(); |
166
|
|
|
if ($moduleRegistry->isModuleEnabled(ClientFunctionalityModuleResolver::GRAPHIQL_FOR_SINGLE_ENDPOINT)) { |
167
|
|
|
global $submenu; |
168
|
|
|
$clientPath = GraphQLClientsForWPComponentConfiguration::getGraphiQLClientEndpoint(); |
169
|
|
|
$submenu[self::NAME][] = [ |
170
|
|
|
__('GraphiQL (public client)', 'graphql-api'), |
171
|
|
|
'read', |
172
|
|
|
home_url($clientPath), |
173
|
|
|
]; |
174
|
|
|
} |
175
|
|
|
|
176
|
|
|
if ($moduleRegistry->isModuleEnabled(ClientFunctionalityModuleResolver::INTERACTIVE_SCHEMA_FOR_SINGLE_ENDPOINT)) { |
177
|
|
|
global $submenu; |
178
|
|
|
$clientPath = GraphQLClientsForWPComponentConfiguration::getVoyagerClientEndpoint(); |
179
|
|
|
$submenu[self::NAME][] = [ |
180
|
|
|
__('Interactive Schema (public client)', 'graphql-api'), |
181
|
|
|
'read', |
182
|
|
|
home_url($clientPath), |
183
|
|
|
]; |
184
|
|
|
} |
185
|
|
|
|
186
|
|
|
$aboutPageClass = $this->getAboutMenuPageClass(); |
187
|
|
|
/** |
188
|
|
|
* @var AbstractMenuPage |
189
|
|
|
*/ |
190
|
|
|
$aboutMenuPage = $instanceManager->getInstance($aboutPageClass); |
191
|
|
|
if ($hookName = \add_submenu_page( |
192
|
|
|
self::NAME, |
193
|
|
|
__('About', 'graphql-api'), |
194
|
|
|
__('About', 'graphql-api'), |
195
|
|
|
'read', |
196
|
|
|
$aboutMenuPage->getScreenID(), |
197
|
|
|
[$aboutMenuPage, 'print'] |
198
|
|
|
) |
199
|
|
|
) { |
200
|
|
|
$aboutMenuPage->setHookName($hookName); |
201
|
|
|
} |
202
|
|
|
|
203
|
|
|
// $schemaEditorAccessCapability = UserAuthorization::getSchemaEditorAccessCapability(); |
204
|
|
|
// if (\current_user_can($schemaEditorAccessCapability)) { |
205
|
|
|
// global $submenu; |
206
|
|
|
// $submenu[self::NAME][] = [ |
207
|
|
|
// __('Documentation', 'graphql-api'), |
208
|
|
|
// $schemaEditorAccessCapability, |
209
|
|
|
// 'https://graphql-api.com/documentation/', |
210
|
|
|
// ]; |
211
|
|
|
// } |
212
|
|
|
} |
213
|
|
|
} |
214
|
|
|
|