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\ModuleDocumentationMenuPage; |
19
|
|
|
use GraphQLAPI\GraphQLAPI\ModuleResolvers\ClientFunctionalityModuleResolver; |
20
|
|
|
use GraphQLByPoP\GraphQLClientsForWP\ComponentConfiguration as GraphQLClientsForWPComponentConfiguration; |
21
|
|
|
|
22
|
|
|
/** |
23
|
|
|
* Admin menu class |
24
|
|
|
*/ |
25
|
|
|
class Menu extends AbstractMenu |
26
|
|
|
{ |
27
|
|
|
public const NAME = 'graphql_api'; |
28
|
|
|
|
29
|
|
|
public static function getName(): string |
30
|
|
|
{ |
31
|
|
|
return static::NAME; |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
/** |
35
|
|
|
* @return string[] |
36
|
|
|
*/ |
37
|
|
|
protected function getMenuPageClasses(): array |
38
|
|
|
{ |
39
|
|
|
return [ |
40
|
|
|
GraphiQLMenuPage::class, |
41
|
|
|
GraphQLVoyagerMenuPage::class, |
42
|
|
|
SettingsMenuPage::class, |
43
|
|
|
$this->getModuleMenuPageClass(), |
44
|
|
|
AboutMenuPage::class, |
45
|
|
|
]; |
46
|
|
|
} |
47
|
|
|
|
48
|
|
|
public function addMenuPagesTop(): void |
49
|
|
|
{ |
50
|
|
|
parent::addMenuPagesTop(); |
51
|
|
|
|
52
|
|
|
$instanceManager = InstanceManagerFacade::getInstance(); |
53
|
|
|
|
54
|
|
|
$schemaEditorAccessCapability = UserAuthorization::getSchemaEditorAccessCapability(); |
55
|
|
|
\add_menu_page( |
56
|
|
|
__('GraphQL API', 'graphql-api'), |
57
|
|
|
__('GraphQL API', 'graphql-api'), |
58
|
|
|
$schemaEditorAccessCapability, |
59
|
|
|
self::NAME, |
60
|
|
|
function () { |
61
|
|
|
}, |
62
|
|
|
'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=' |
63
|
|
|
); |
64
|
|
|
|
65
|
|
|
/** |
66
|
|
|
* @var GraphiQLMenuPage |
67
|
|
|
*/ |
68
|
|
|
$graphiQLMenuPage = $instanceManager->getInstance(GraphiQLMenuPage::class); |
69
|
|
|
if ($hookName = \add_submenu_page( |
70
|
|
|
self::NAME, |
71
|
|
|
__('GraphiQL', 'graphql-api'), |
72
|
|
|
__('GraphiQL', 'graphql-api'), |
73
|
|
|
$schemaEditorAccessCapability, |
74
|
|
|
self::NAME, |
75
|
|
|
[$graphiQLMenuPage, 'print'] |
76
|
|
|
) |
77
|
|
|
) { |
78
|
|
|
$graphiQLMenuPage->setHookName($hookName); |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
/** |
82
|
|
|
* @var GraphQLVoyagerMenuPage |
83
|
|
|
*/ |
84
|
|
|
$graphQLVoyagerMenuPage = $instanceManager->getInstance(GraphQLVoyagerMenuPage::class); |
85
|
|
|
if ($hookName = \add_submenu_page( |
86
|
|
|
self::NAME, |
87
|
|
|
__('Interactive Schema', 'graphql-api'), |
88
|
|
|
__('Interactive Schema', 'graphql-api'), |
89
|
|
|
$schemaEditorAccessCapability, |
90
|
|
|
$graphQLVoyagerMenuPage->getScreenID(), |
91
|
|
|
[$graphQLVoyagerMenuPage, 'print'] |
92
|
|
|
) |
93
|
|
|
) { |
94
|
|
|
$graphQLVoyagerMenuPage->setHookName($hookName); |
95
|
|
|
} |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
/** |
99
|
|
|
* Either the Modules menu page, or the Module Documentation menu page, |
100
|
|
|
* based on parameter ?tab="docs" or not |
101
|
|
|
* |
102
|
|
|
* @return string |
103
|
|
|
*/ |
104
|
|
|
protected function getModuleMenuPageClass(): string |
105
|
|
|
{ |
106
|
|
|
return |
107
|
|
|
($_GET[RequestParams::TAB] == RequestParams::TAB_DOCS) ? |
108
|
|
|
ModuleDocumentationMenuPage::class : |
109
|
|
|
ModulesMenuPage::class; |
110
|
|
|
} |
111
|
|
|
|
112
|
|
|
public function addMenuPagesBottom(): void |
113
|
|
|
{ |
114
|
|
|
parent::addMenuPagesBottom(); |
115
|
|
|
|
116
|
|
|
$instanceManager = InstanceManagerFacade::getInstance(); |
117
|
|
|
$menuPageClass = $this->getModuleMenuPageClass(); |
118
|
|
|
/** |
119
|
|
|
* @var AbstractMenuPage |
120
|
|
|
*/ |
121
|
|
|
$modulesMenuPage = $instanceManager->getInstance($menuPageClass); |
122
|
|
|
/** |
123
|
|
|
* @var callable |
124
|
|
|
*/ |
125
|
|
|
$callable = [$modulesMenuPage, 'print']; |
126
|
|
|
if ($hookName = \add_submenu_page( |
127
|
|
|
self::NAME, |
128
|
|
|
__('Modules', 'graphql-api'), |
129
|
|
|
__('Modules', 'graphql-api'), |
130
|
|
|
'manage_options', |
131
|
|
|
$modulesMenuPage->getScreenID(), |
132
|
|
|
$callable |
133
|
|
|
) |
134
|
|
|
) { |
135
|
|
|
$modulesMenuPage->setHookName($hookName); |
136
|
|
|
} |
137
|
|
|
|
138
|
|
|
/** |
139
|
|
|
* @var SettingsMenuPage |
140
|
|
|
*/ |
141
|
|
|
$settingsMenuPage = $instanceManager->getInstance(SettingsMenuPage::class); |
142
|
|
|
if ($hookName = \add_submenu_page( |
143
|
|
|
self::NAME, |
144
|
|
|
__('Settings', 'graphql-api'), |
145
|
|
|
__('Settings', 'graphql-api'), |
146
|
|
|
'manage_options', |
147
|
|
|
$settingsMenuPage->getScreenID(), |
148
|
|
|
[$settingsMenuPage, 'print'] |
149
|
|
|
) |
150
|
|
|
) { |
151
|
|
|
$settingsMenuPage->setHookName($hookName); |
152
|
|
|
} |
153
|
|
|
|
154
|
|
|
$moduleRegistry = ModuleRegistryFacade::getInstance(); |
155
|
|
|
if ($moduleRegistry->isModuleEnabled(ClientFunctionalityModuleResolver::GRAPHIQL_FOR_SINGLE_ENDPOINT)) { |
156
|
|
|
global $submenu; |
157
|
|
|
$clientPath = GraphQLClientsForWPComponentConfiguration::getGraphiQLClientEndpoint(); |
158
|
|
|
$submenu[self::NAME][] = [ |
159
|
|
|
__('GraphiQL (public client)', 'graphql-api'), |
160
|
|
|
'read', |
161
|
|
|
home_url($clientPath), |
162
|
|
|
]; |
163
|
|
|
} |
164
|
|
|
|
165
|
|
|
if ($moduleRegistry->isModuleEnabled(ClientFunctionalityModuleResolver::INTERACTIVE_SCHEMA_FOR_SINGLE_ENDPOINT)) { |
166
|
|
|
global $submenu; |
167
|
|
|
$clientPath = GraphQLClientsForWPComponentConfiguration::getVoyagerClientEndpoint(); |
168
|
|
|
$submenu[self::NAME][] = [ |
169
|
|
|
__('Interactive Schema (public client)', 'graphql-api'), |
170
|
|
|
'read', |
171
|
|
|
home_url($clientPath), |
172
|
|
|
]; |
173
|
|
|
} |
174
|
|
|
|
175
|
|
|
/** |
176
|
|
|
* @var AboutMenuPage |
177
|
|
|
*/ |
178
|
|
|
$aboutMenuPage = $instanceManager->getInstance(AboutMenuPage::class); |
179
|
|
|
if ($hookName = \add_submenu_page( |
180
|
|
|
self::NAME, |
181
|
|
|
__('About', 'graphql-api'), |
182
|
|
|
__('About', 'graphql-api'), |
183
|
|
|
'read', |
184
|
|
|
$aboutMenuPage->getScreenID(), |
185
|
|
|
[$aboutMenuPage, 'print'] |
186
|
|
|
) |
187
|
|
|
) { |
188
|
|
|
$aboutMenuPage->setHookName($hookName); |
189
|
|
|
} |
190
|
|
|
|
191
|
|
|
// $schemaEditorAccessCapability = UserAuthorization::getSchemaEditorAccessCapability(); |
192
|
|
|
// if (\current_user_can($schemaEditorAccessCapability)) { |
193
|
|
|
// global $submenu; |
194
|
|
|
// $submenu[self::NAME][] = [ |
195
|
|
|
// __('Documentation', 'graphql-api'), |
196
|
|
|
// $schemaEditorAccessCapability, |
197
|
|
|
// 'https://graphql-api.com/documentation/', |
198
|
|
|
// ]; |
199
|
|
|
// } |
200
|
|
|
} |
201
|
|
|
} |
202
|
|
|
|