Fix the update server #978 issue. Fixed the change log to load all entries, not just the last one. Fixed #983 so that database updates are created when adding a new adminview. Moved a few builder arrays to the Compiler Registry. Adds super powers to JCB. Adds Gitea API library. Improves Power filters. Fix #991 to add the Utilities service class. Adds Superpower Key (SPK) replacement feature. Adds Superpower search (GREP) feature. Adds Power Insert/Update Classe. Fix #995 that all update sites are using the correct URL.

This commit is contained in:
Llewellyn van der Merwe 2023-05-02 02:10:55 +02:00
parent d6c73987f5
commit df16b2e3ad
Signed by untrusted user: Llewellyn
GPG Key ID: A9201372263741E7
246 changed files with 24890 additions and 4141 deletions

View File

@ -9,4 +9,19 @@
- We fixed the server class to load new client if server details changed. - We fixed the server class to load new client if server details changed.
- We fixed the readme placeholder issue #978. - We fixed the readme placeholder issue #978.
- We fixed the empty server url issue #978. - We fixed the empty server url issue #978.
- Fixed Package import to now use the phplibsec version 3 - Fixed Package import to now use the phplibsec version 3
# v3.1.24
- Fix the update server #978 issue.
- Fixed the change log to load all entries, not just the last one.
- Fixed #983 so that database updates are created when adding a new adminview
- Moved a few builder arrays to the Compiler Registry
- Adds super powers to JCB
- Adds Gitea API library
- Improves Power filters
- Fix #991 to add the Utilities service class
- Adds Superpower Key (SPK) replacement feature
- Adds Superpower search (GREP) feature
- Adds Power Insert/Update Classes
- Fix #995 that all update sites are using the correct URL

View File

@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo
Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have!
You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.19) with **ALL** its features and **ALL** concepts totally open-source and free! You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.24) with **ALL** its features and **ALL** concepts totally open-source and free!
> Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45)
@ -106,8 +106,8 @@ Where can you get support and help?
- [Hello World](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45). - [Hello World](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45).
- [Discussions](https://github.com/vdm-io/Joomla-Component-Builder/discussions). - [Discussions](https://github.com/vdm-io/Joomla-Component-Builder/discussions).
- [Wiki](https://git.vdm.dev/joomla/Component-Builder/wiki). - [Wiki](https://git.vdm.dev/joomla/Component-Builder/wiki).
- [Issues](https://git.vdm.dev/joomla/Component-Builder/issues). - [Issues](https://git.vdm.dev/joomla/Component-Builder/issues). ^^
- [Issues Stream](https://t.me/jcb_issues). ^^ - [Issues Stream](https://t.me/jcb_issues).
- [Updates](https://t.me/jcb_updates). - [Updates](https://t.me/jcb_updates).
- [User Group](https://t.me/jcb_group). - [User Group](https://t.me/jcb_group).
- [Announcement](https://t.me/Joomla_component_builder). - [Announcement](https://t.me/Joomla_component_builder).
@ -144,14 +144,14 @@ TODO
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
+ *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder)
+ *First Build*: 30th April, 2015 + *First Build*: 30th April, 2015
+ *Last Build*: 27th February, 2023 + *Last Build*: 2nd May, 2023
+ *Version*: 3.1.19 + *Version*: 3.1.24
+ *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt + *License*: GNU General Public License version 2 or later; see LICENSE.txt
+ *Line count*: **366135** + *Line count*: **557762**
+ *Field count*: **2021** + *Field count*: **2041**
+ *File count*: **2339** + *File count*: **3930**
+ *Folder count*: **411** + *Folder count*: **432**
> This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com).
> Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) > Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com)

View File

@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo
Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have!
You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.19) with **ALL** its features and **ALL** concepts totally open-source and free! You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.24) with **ALL** its features and **ALL** concepts totally open-source and free!
> Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45)
@ -106,8 +106,8 @@ Where can you get support and help?
- [Hello World](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45). - [Hello World](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45).
- [Discussions](https://github.com/vdm-io/Joomla-Component-Builder/discussions). - [Discussions](https://github.com/vdm-io/Joomla-Component-Builder/discussions).
- [Wiki](https://git.vdm.dev/joomla/Component-Builder/wiki). - [Wiki](https://git.vdm.dev/joomla/Component-Builder/wiki).
- [Issues](https://git.vdm.dev/joomla/Component-Builder/issues). - [Issues](https://git.vdm.dev/joomla/Component-Builder/issues). ^^
- [Issues Stream](https://t.me/jcb_issues). ^^ - [Issues Stream](https://t.me/jcb_issues).
- [Updates](https://t.me/jcb_updates). - [Updates](https://t.me/jcb_updates).
- [User Group](https://t.me/jcb_group). - [User Group](https://t.me/jcb_group).
- [Announcement](https://t.me/Joomla_component_builder). - [Announcement](https://t.me/Joomla_component_builder).
@ -144,14 +144,14 @@ TODO
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
+ *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder)
+ *First Build*: 30th April, 2015 + *First Build*: 30th April, 2015
+ *Last Build*: 27th February, 2023 + *Last Build*: 2nd May, 2023
+ *Version*: 3.1.19 + *Version*: 3.1.24
+ *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt + *License*: GNU General Public License version 2 or later; see LICENSE.txt
+ *Line count*: **366135** + *Line count*: **557762**
+ *Field count*: **2021** + *Field count*: **2041**
+ *File count*: **2339** + *File count*: **3930**
+ *Folder count*: **411** + *Folder count*: **432**
> This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com).
> Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) > Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com)

View File

@ -483,7 +483,10 @@
<action name="placeholder.export" title="COM_COMPONENTBUILDER_PLACEHOLDERS_EXPORT" description="COM_COMPONENTBUILDER_PLACEHOLDERS_EXPORT_DESC" /> <action name="placeholder.export" title="COM_COMPONENTBUILDER_PLACEHOLDERS_EXPORT" description="COM_COMPONENTBUILDER_PLACEHOLDERS_EXPORT_DESC" />
<action name="placeholder.import" title="COM_COMPONENTBUILDER_PLACEHOLDERS_IMPORT" description="COM_COMPONENTBUILDER_PLACEHOLDERS_IMPORT_DESC" /> <action name="placeholder.import" title="COM_COMPONENTBUILDER_PLACEHOLDERS_IMPORT" description="COM_COMPONENTBUILDER_PLACEHOLDERS_IMPORT_DESC" />
<action name="placeholder.submenu" title="COM_COMPONENTBUILDER_PLACEHOLDERS_SUBMENU" description="COM_COMPONENTBUILDER_PLACEHOLDERS_SUBMENU_DESC" /> <action name="placeholder.submenu" title="COM_COMPONENTBUILDER_PLACEHOLDERS_SUBMENU" description="COM_COMPONENTBUILDER_PLACEHOLDERS_SUBMENU_DESC" />
<action name="power.init" title="COM_COMPONENTBUILDER_POWER_INIT_BUTTON_ACCESS" description="COM_COMPONENTBUILDER_POWER_INIT_BUTTON_ACCESS_DESC" />
<action name="power.reset" title="COM_COMPONENTBUILDER_POWER_RESET_BUTTON_ACCESS" description="COM_COMPONENTBUILDER_POWER_RESET_BUTTON_ACCESS_DESC" />
<action name="power.run_expansion" title="COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS" description="COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS_DESC" /> <action name="power.run_expansion" title="COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS" description="COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS_DESC" />
<action name="power.sync" title="COM_COMPONENTBUILDER_POWER_SYNC_BUTTON_ACCESS" description="COM_COMPONENTBUILDER_POWER_SYNC_BUTTON_ACCESS_DESC" />
<action name="power.access" title="COM_COMPONENTBUILDER_POWERS_ACCESS" description="COM_COMPONENTBUILDER_POWERS_ACCESS_DESC" /> <action name="power.access" title="COM_COMPONENTBUILDER_POWERS_ACCESS" description="COM_COMPONENTBUILDER_POWERS_ACCESS_DESC" />
<action name="power.batch" title="COM_COMPONENTBUILDER_POWERS_BATCH_USE" description="COM_COMPONENTBUILDER_POWERS_BATCH_USE_DESC" /> <action name="power.batch" title="COM_COMPONENTBUILDER_POWERS_BATCH_USE" description="COM_COMPONENTBUILDER_POWERS_BATCH_USE_DESC" />
<action name="power.create" title="COM_COMPONENTBUILDER_POWERS_CREATE" description="COM_COMPONENTBUILDER_POWERS_CREATE_DESC" /> <action name="power.create" title="COM_COMPONENTBUILDER_POWERS_CREATE" description="COM_COMPONENTBUILDER_POWERS_CREATE_DESC" />

View File

@ -679,6 +679,202 @@
default="" default=""
/> />
</fieldset> </fieldset>
<fieldset
name="super_power_custom_config"
label="COM_COMPONENTBUILDER_CONFIG_SUPER_POWER">
<!-- Note_not_ready_super_powers Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="note_not_ready_super_powers" label="COM_COMPONENTBUILDER_CONFIG_NOTE_NOT_READY_SUPER_POWERS_LABEL" heading="h2" class="alert alert-error note_not_ready_super_powers" />
<!-- Super_powers_documentation Field. Type: Radio. (joomla) -->
<field
type="radio"
name="super_powers_documentation"
label="COM_COMPONENTBUILDER_CONFIG_SUPER_POWERS_DOCUMENTATION_LABEL"
description="COM_COMPONENTBUILDER_CONFIG_SUPER_POWERS_DOCUMENTATION_DESCRIPTION"
class="btn-group btn-group-yesno"
default="0">
<!-- Option Set. -->
<option value="1">
COM_COMPONENTBUILDER_CONFIG_SHOW</option>
<option value="0">
COM_COMPONENTBUILDER_CONFIG_HIDE</option>
</field>
<!-- Note_super_powers Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="note_super_powers" label="COM_COMPONENTBUILDER_CONFIG_NOTE_SUPER_POWERS_LABEL" description="COM_COMPONENTBUILDER_CONFIG_NOTE_SUPER_POWERS_DESCRIPTION" heading="h4" class="alert alert-info note_super_powers" showon="super_powers_documentation:1" />
<!-- Powers_repository Field. Type: Radio. (joomla) -->
<field
type="radio"
name="powers_repository"
label="COM_COMPONENTBUILDER_CONFIG_POWERS_REPOSITORY_LABEL"
description="COM_COMPONENTBUILDER_CONFIG_POWERS_REPOSITORY_DESCRIPTION"
class="btn-group btn-group-yesno"
default="0"
required="true">
<!-- Option Set. -->
<option value="1">
COM_COMPONENTBUILDER_CONFIG_YES</option>
<option value="0">
COM_COMPONENTBUILDER_CONFIG_NO</option>
</field>
<!-- Super_powers_repositories Field. Type: Radio. (joomla) -->
<field
type="radio"
name="super_powers_repositories"
label="COM_COMPONENTBUILDER_CONFIG_SUPER_POWERS_REPOSITORIES_LABEL"
description="COM_COMPONENTBUILDER_CONFIG_SUPER_POWERS_REPOSITORIES_DESCRIPTION"
class="btn-group btn-group-yesno"
default="0"
required="true"
showon="powers_repository:1">
<!-- Option Set. -->
<option value="1">
COM_COMPONENTBUILDER_CONFIG_YES</option>
<option value="0">
COM_COMPONENTBUILDER_CONFIG_NO</option>
</field>
<!-- Note_super_powers_repositories Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="note_super_powers_repositories" label="COM_COMPONENTBUILDER_CONFIG_NOTE_SUPER_POWERS_REPOSITORIES_LABEL" description="COM_COMPONENTBUILDER_CONFIG_NOTE_SUPER_POWERS_REPOSITORIES_DESCRIPTION" heading="h4" class="alert alert-info note_super_powers_repositories" showon="powers_repository:1[AND]super_powers_repositories:1" />
<!-- Approved_paths Field. Type: Subform. (joomla) -->
<field
type="subform"
name="approved_paths"
label="COM_COMPONENTBUILDER_CONFIG_APPROVED_PATHS_LABEL"
layout="joomla.form.field.subform.repeatable-table"
multiple="true"
buttons="add,remove,move"
icon="list"
max="30"
min="1"
showon="powers_repository:1[AND]super_powers_repositories:1">
<form hidden="true" name="list_approved_paths_modal" repeat="true">
<!-- Owner Field. Type: Text. (joomla) -->
<field
type="text"
name="owner"
label="COM_COMPONENTBUILDER_CONFIG_OWNER_LABEL"
size="70"
maxlength="150"
class="text_area span12"
readonly="false"
filter="CMD"
hint="COM_COMPONENTBUILDER_CONFIG_OWNER_HINT"
autocomplete="on"
/>
<!-- Repo Field. Type: Text. (joomla) -->
<field
type="text"
name="repo"
label="COM_COMPONENTBUILDER_CONFIG_REPO_LABEL"
size="70"
maxlength="150"
class="text_area span12"
readonly="false"
filter="CMD"
hint="COM_COMPONENTBUILDER_CONFIG_REPO_HINT"
autocomplete="on"
/>
<!-- Branch Field. Type: Text. (joomla) -->
<field
type="text"
name="branch"
label="COM_COMPONENTBUILDER_CONFIG_BRANCH_LABEL"
size="70"
maxlength="150"
default="default"
class="text_area span12"
readonly="false"
filter="CMD"
hint="COM_COMPONENTBUILDER_CONFIG_BRANCH_HINT"
autocomplete="on"
/>
</form>
</field>
<!-- Note_powers_repository_path Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="note_powers_repository_path" label="COM_COMPONENTBUILDER_CONFIG_NOTE_POWERS_REPOSITORY_PATH_LABEL" description="COM_COMPONENTBUILDER_CONFIG_NOTE_POWERS_REPOSITORY_PATH_DESCRIPTION" heading="h4" class="alert alert-info note_powers_repository_path" showon="powers_repository:1" />
<!-- Local_powers_repository_path Field. Type: Text. (joomla) -->
<field
type="text"
name="local_powers_repository_path"
label="COM_COMPONENTBUILDER_CONFIG_LOCAL_POWERS_REPOSITORY_PATH_LABEL"
size="70"
maxlength="150"
description="COM_COMPONENTBUILDER_CONFIG_LOCAL_POWERS_REPOSITORY_PATH_DESCRIPTION"
class="text_area"
readonly="false"
disabled="false"
required="false"
filter="PATH"
message="COM_COMPONENTBUILDER_CONFIG_LOCAL_POWERS_REPOSITORY_PATH_MESSAGE"
hint="COM_COMPONENTBUILDER_CONFIG_LOCAL_POWERS_REPOSITORY_PATH_HINT"
autocomplete="on"
showon="powers_repository:1"
/>
<!-- Add_custom_gitea_url Field. Type: Radio. (joomla) -->
<field
type="radio"
name="add_custom_gitea_url"
label="COM_COMPONENTBUILDER_CONFIG_ADD_CUSTOM_GITEA_URL_LABEL"
description="COM_COMPONENTBUILDER_CONFIG_ADD_CUSTOM_GITEA_URL_DESCRIPTION"
class="btn-group btn-group-yesno"
default="1">
<!-- Option Set. -->
<option value="1">
COM_COMPONENTBUILDER_CONFIG_GITVDMDEV</option>
<option value="2">
COM_COMPONENTBUILDER_CONFIG_CUSTOMGITEA</option>
</field>
<!-- Note_custom_gitea_url Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="note_custom_gitea_url" label="COM_COMPONENTBUILDER_CONFIG_NOTE_CUSTOM_GITEA_URL_LABEL" description="COM_COMPONENTBUILDER_CONFIG_NOTE_CUSTOM_GITEA_URL_DESCRIPTION" heading="h3" class="alert alert-success note_custom_gitea_url" showon="add_custom_gitea_url:2" />
<!-- Custom_gitea_url Field. Type: Url. (joomla) -->
<field
type="url"
name="custom_gitea_url"
label="COM_COMPONENTBUILDER_CONFIG_CUSTOM_GITEA_URL_LABEL"
size="70"
maxlength="150"
default="https://git.vdm.dev"
description="COM_COMPONENTBUILDER_CONFIG_CUSTOM_GITEA_URL_DESCRIPTION"
class="text_area"
filter="url"
validated="url"
scheme="http,https"
message="COM_COMPONENTBUILDER_CONFIG_CUSTOM_GITEA_URL_MESSAGE"
hint="COM_COMPONENTBUILDER_CONFIG_CUSTOM_GITEA_URL_HINT"
autocomplete="on"
showon="add_custom_gitea_url:2"
/>
<!-- Custom_gitea_token Field. Type: Password. (joomla) -->
<field
type="password"
name="custom_gitea_token"
label="COM_COMPONENTBUILDER_CONFIG_CUSTOM_GITEA_TOKEN_LABEL"
size="128"
description="COM_COMPONENTBUILDER_CONFIG_CUSTOM_GITEA_TOKEN_DESCRIPTION"
message="Error! Please add token here."
class="text_area"
readonly="false"
disabled="false"
required="false"
filter="STRING"
hint="COM_COMPONENTBUILDER_CONFIG_CUSTOM_GITEA_TOKEN_HINT"
autocomplete="off"
showon="add_custom_gitea_url:2"
/>
<!-- Super_powers_core Field. Type: Text. (joomla) -->
<field
type="text"
name="super_powers_core"
label="COM_COMPONENTBUILDER_CONFIG_SUPER_POWERS_CORE_LABEL"
size="70"
maxlength="150"
default="joomla/super-powers"
class="text_area"
filter="PATH"
hint="COM_COMPONENTBUILDER_CONFIG_SUPER_POWERS_CORE_HINT"
autocomplete="on"
showon="add_custom_gitea_url:2"
/>
</fieldset>
<fieldset <fieldset
name="compiler_custom_config" name="compiler_custom_config"
label="COM_COMPONENTBUILDER_CONFIG_COMPILER"> label="COM_COMPONENTBUILDER_CONFIG_COMPILER">

View File

@ -42,6 +42,94 @@ class ComponentbuilderControllerPower extends FormController
parent::__construct($config); parent::__construct($config);
} }
public function syncPowers()
{
// Check for request forgeries
JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
// get IDS of the selected powers
$item = $this->input->post->get('jform', array(), 'array');
// check if there is any selections
if (empty($item['id']))
{
// set error message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_NOT_SAVED').'</h1>';
$message .= '<p>'.JText::_('COM_COMPONENTBUILDER_YOU_MUST_FIRST_SAVE_THE_POWER_BEFORE_YOU_CAN_USE_THIS_FEATURE').'</p>';
// set redirect
$redirect_url = \JRoute::_(
'index.php?option=com_componentbuilder&view=power'
. $this->getRedirectToItemAppend(), false
);
$this->setRedirect($redirect_url, $message, 'error');
return false;
}
// check if user has the right
$user = JFactory::getUser();
if($user->authorise('power.sync', 'com_componentbuilder'))
{
// set success message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_THIS_SYNC_FEATURE_IS_STILL_UNDER_DEVELOPMENT').'</h1>';
$message .= '<p>'.JText::sprintf('COM_COMPONENTBUILDER_PLEASE_CHECK_AGAIN_SOON_ANDOR_FOLLOW_THE_PROGRESS_ON_SGITVDMDEVA', '<a href="https://git.vdm.dev/joomla/Component-Builder/issues/984" target="_blank">').'</p>';
// set redirect
$redirect_url = \JRoute::_(
'index.php?option=com_componentbuilder&view=power'
. $this->getRedirectToItemAppend($item['id']), false
);
$this->setRedirect($redirect_url, $message);
return true;
}
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url);
return false;
}
public function resetPowers()
{
// Check for request forgeries
JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
// get IDS of the selected powers
$item = $this->input->post->get('jform', array(), 'array');
// check if there is any selections
if (empty($item['id']))
{
// set error message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_NOT_SAVED').'</h1>';
$message .= '<p>'.JText::_('COM_COMPONENTBUILDER_YOU_MUST_FIRST_SAVE_THE_POWER_BEFORE_YOU_CAN_USE_THIS_FEATURE').'</p>';
// set redirect
$redirect_url = \JRoute::_(
'index.php?option=com_componentbuilder&view=power'
. $this->getRedirectToItemAppend(), false
);
$this->setRedirect($redirect_url, $message, 'error');
return false;
}
// check if user has the right
$user = JFactory::getUser();
if($user->authorise('power.reset', 'com_componentbuilder'))
{
// set success message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_THIS_RESET_FEATURE_IS_STILL_UNDER_DEVELOPMENT').'</h1>';
$message .= '<p>'.JText::sprintf('COM_COMPONENTBUILDER_PLEASE_CHECK_AGAIN_SOON_ANDOR_FOLLOW_THE_PROGRESS_ON_SGITVDMDEVA', '<a href="https://git.vdm.dev/joomla/Component-Builder/issues/984" target="_blank">').'</p>';
// set redirect
$redirect_url = \JRoute::_(
'index.php?option=com_componentbuilder&view=power'
. $this->getRedirectToItemAppend($item['id']), false
);
$this->setRedirect($redirect_url, $message);
return true;
}
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url);
return false;
}
/** /**
* Method override to check if you can add a new record. * Method override to check if you can add a new record.
* *

View File

@ -83,5 +83,109 @@ class ComponentbuilderControllerPowers extends AdminController
$this->setRedirect($redirect_url, $message, 'error'); $this->setRedirect($redirect_url, $message, 'error');
return false; return false;
} }
public function initPowers()
{
// Check for request forgeries
JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
// check if user has the right
$user = JFactory::getUser();
if($user->authorise('power.init', 'com_componentbuilder'))
{
// set success message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_THIS_INIT_FEATURE_IS_STILL_UNDER_DEVELOPMENT').'</h1>';
$message .= '<p>'.JText::sprintf('COM_COMPONENTBUILDER_PLEASE_CHECK_AGAIN_SOON_ANDOR_FOLLOW_THE_PROGRESS_ON_SGITVDMDEVA', '<a href="https://git.vdm.dev/joomla/Component-Builder/issues/984" target="_blank">').'</p>';
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url, $message);
return true;
}
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url);
return false;
}
public function syncPowers()
{
// Check for request forgeries
JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
// get IDS of the selected powers
$pks = $this->input->post->get('cid', [], 'array');
// Sanitize the input
JArrayHelper::toInteger($pks);
// check if there is any selections
if ($pks == [])
{
// set error message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_NO_SELECTION_DETECTED').'</h1>';
$message .= '<p>'.JText::_('COM_COMPONENTBUILDER_PLEASE_FIRST_MAKE_A_SELECTION_FROM_THE_LIST').'</p>';
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url, $message, 'error');
return false;
}
// check if user has the right
$user = JFactory::getUser();
if($user->authorise('power.sync', 'com_componentbuilder'))
{
// set success message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_THIS_SYNC_FEATURE_IS_STILL_UNDER_DEVELOPMENT').'</h1>';
$message .= '<p>'.JText::sprintf('COM_COMPONENTBUILDER_PLEASE_CHECK_AGAIN_SOON_ANDOR_FOLLOW_THE_PROGRESS_ON_SGITVDMDEVA', '<a href="https://git.vdm.dev/joomla/Component-Builder/issues/984" target="_blank">').'</p>';
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url, $message);
return true;
}
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url);
return false;
}
public function resetPowers()
{
// Check for request forgeries
JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
// get IDS of the selected powers
$pks = $this->input->post->get('cid', [], 'array');
// Sanitize the input
JArrayHelper::toInteger($pks);
// check if there is any selections
if ($pks == [])
{
// set error message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_NO_SELECTION_DETECTED').'</h1>';
$message .= '<p>'.JText::_('COM_COMPONENTBUILDER_PLEASE_FIRST_MAKE_A_SELECTION_FROM_THE_LIST').'</p>';
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url, $message, 'error');
return false;
}
// check if user has the right
$user = JFactory::getUser();
if($user->authorise('power.reset', 'com_componentbuilder'))
{
// set success message
$message = '<h1>'.JText::_('COM_COMPONENTBUILDER_THIS_RESET_FEATURE_IS_STILL_UNDER_DEVELOPMENT').'</h1>';
$message .= '<p>'.JText::sprintf('COM_COMPONENTBUILDER_PLEASE_CHECK_AGAIN_SOON_ANDOR_FOLLOW_THE_PROGRESS_ON_SGITVDMDEVA', '<a href="https://git.vdm.dev/joomla/Component-Builder/issues/984" target="_blank">').'</p>';
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url, $message);
return true;
}
// set redirect
$redirect_url = JRoute::_('index.php?option=com_componentbuilder&view=powers', false);
$this->setRedirect($redirect_url);
return false;
}
} }

View File

@ -603,6 +603,31 @@ class Compiler extends Infusion
} }
} }
} }
// do super powers details if found
if (ArrayHelper::check(CFactory::_('Power')->superpowers))
{
foreach (CFactory::_('Power')->superpowers as $path => $powers)
{
$key = StringHelper::safe($path);
if (CFactory::_('Utilities.Files')->exists($key))
{
// update the power files
foreach (CFactory::_('Utilities.Files')->get($key) as $power_file)
{
if (File::exists($power_file['path']))
{
$this->setFileContent(
$power_file['name'], $power_file['path'],
$bom, $key
);
}
}
// free up some memory
CFactory::_('Utilities.Files')->remove($key);
CFactory::_('Content')->remove_($key);
}
}
}
return true; return true;
} }
@ -680,6 +705,9 @@ class Compiler extends Infusion
&$view) &$view)
); );
// inject any super powers found
$answer = CFactory::_('Power.Injector')->power($answer);
// add answer back to file // add answer back to file
CFactory::_('Utilities.File')->write($path, $answer); CFactory::_('Utilities.File')->write($path, $answer);
@ -1384,7 +1412,7 @@ class Compiler extends Infusion
if ($found && !$foundEnd) if ($found && !$foundEnd)
{ {
$replace[] = (int) $lineBites[$lineNumber]; $replace[] = (int) $lineBites[$lineNumber];
// we musk keep last three lines to dynamic find target entry // we must keep last three lines to dynamic find target entry
$fingerPrint[$lineNumber] = trim($lineContent); $fingerPrint[$lineNumber] = trim($lineContent);
// check lines each time if it fits our target // check lines each time if it fits our target
if (count((array) $fingerPrint) === $sizeEnd if (count((array) $fingerPrint) === $sizeEnd
@ -1413,7 +1441,7 @@ class Compiler extends Infusion
{ {
$replace[] = (int) $lineBites[$lineNumber]; $replace[] = (int) $lineBites[$lineNumber];
} }
// we musk keep last three lines to dynamic find target entry // we must keep last three lines to dynamic find target entry
$fingerPrint[$lineNumber] = trim($lineContent); $fingerPrint[$lineNumber] = trim($lineContent);
// check lines each time if it fits our target // check lines each time if it fits our target
if (count((array) $fingerPrint) === $size && !$found) if (count((array) $fingerPrint) === $size && !$found)
@ -1535,7 +1563,7 @@ class Compiler extends Infusion
$code = PHP_EOL . $commentType . implode( $code = PHP_EOL . $commentType . implode(
$_commentType . PHP_EOL . $commentType, $code $_commentType . PHP_EOL . $commentType, $code
) . $_commentType . PHP_EOL; ) . $_commentType . PHP_EOL;
// get place holders // get placeholders
$placeholder = CFactory::_('Placeholder')->keys( $placeholder = CFactory::_('Placeholder')->keys(
(int) $target['comment_type'] . $target['type'], $target['id'] (int) $target['comment_type'] . $target['type'], $target['id']
); );
@ -1554,37 +1582,55 @@ class Compiler extends Infusion
$this->addDataToFile($file, $data, (int) array_sum($bitBucket)); $this->addDataToFile($file, $data, (int) array_sum($bitBucket));
} }
// Thanks to http://stackoverflow.com/a/16813550/1429677 /**
protected function addDataToFile($file, $data, $position, $replace = null) * Inserts or replaces data in a file at a specific position.
* Thanks to http://stackoverflow.com/a/16813550/1429677
*
* @param string $file The path of the file to modify
* @param string $data The data to insert or replace
* @param int $position The position in the file where the data should be inserted or replaced
* @param int|null $replace The number of bytes to replace; if null, data will be inserted
*
* @return void
* @throws RuntimeException if unable to open the file
*/
protected function addDataToFile(string $file, string $data, int $position, ?int $replace = null)
{ {
// start the process // Open the file and a temporary stream
$fpFile = fopen($file, "rw+"); $actual_file = fopen($file, "rw+");
$fpTemp = fopen('php://temp', "rw+"); if ($actual_file === false)
// make a copy of the file
stream_copy_to_stream($fpFile, $fpTemp);
// move to the position where we should add the data
fseek($fpFile, $position);
// Add the data
fwrite($fpFile, (string) $data);
// truncate file at the end of the data that was added
$remove = MathHelper::bc(
'add', $position, mb_strlen((string) $data, '8bit')
);
ftruncate($fpFile, $remove);
// check if this was a replacement of data
if ($replace)
{ {
$position = MathHelper::bc( throw new RuntimeException("Unable to open the file: {$file}");
'add', $position, $replace
);
} }
// move to the position of the data that should remain below the new data
fseek($fpTemp, $position); $temp_file = fopen('php://temp', "rw+");
// copy that remaining data to the file
stream_copy_to_stream($fpTemp, $fpFile); // @Jack // Make a copy of the file in the temporary stream
// done close both files stream_copy_to_stream($actual_file, $temp_file);
fclose($fpFile);
fclose($fpTemp); // Move to the position where the data should be added
fseek($actual_file, $position);
// Add the data
fwrite($actual_file, $data);
// Truncate the file at the end of the added data if replacing
$data_length = mb_strlen($data, '8bit');
$remove = MathHelper::bc('add', $position, $data_length);
ftruncate($actual_file, $remove);
// check if this was a replacement of data
$position = MathHelper::bc('add', $position, $replace ?: 0);
// Move to the position of the remaining data in the temporary stream
fseek($temp_file, $position);
// Copy the remaining data from the temporary stream to the file
stream_copy_to_stream($temp_file, $actual_file);
// Close both file handles
fclose($actual_file);
fclose($temp_file);
// any help to improve this is welcome... // any help to improve this is welcome...
} }

View File

@ -1144,8 +1144,13 @@ class Get
)); ));
} }
// get powers *+*+*+*+*+*+*+*PRO // load powers *+*+*+*+*+*+*+*
CFactory::_('Power')->load($this->linkedPowers); CFactory::_('Power')->load($this->linkedPowers);
// load any other super powers that was found
if (($super_powers = CFactory::_('Power.Extractor')->get_()) !== null)
{
CFactory::_('Power')->load($super_powers);
}
// set the percentage when a language can be added // set the percentage when a language can be added
$this->percentageLanguageAdd = (int) $this->params->get( $this->percentageLanguageAdd = (int) $this->params->get(
'percentagelanguageadd', 50 'percentagelanguageadd', 50

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,9 +23,9 @@ if (file_exists($composer_autoloader))
spl_autoload_register(function ($class) { spl_autoload_register(function ($class) {
// project-specific base directories and namespace prefix // project-specific base directories and namespace prefix
$search = [ $search = [
'libraries/jcb_powers/VDM.Joomla.Gitea' => 'VDM\\Joomla\\Gitea',
'libraries/jcb_powers/VDM.Joomla' => 'VDM\\Joomla', 'libraries/jcb_powers/VDM.Joomla' => 'VDM\\Joomla',
'libraries/jcb_powers/VDM.Minify' => 'VDM\\Minify', 'libraries/jcb_powers/VDM.Minify' => 'VDM\\Minify',
'libraries/jcb_powers/VDM.Gitea' => 'VDM\\Gitea',
'libraries/jcb_powers/VDM.Psr' => 'VDM\\Psr' 'libraries/jcb_powers/VDM.Psr' => 'VDM\\Psr'
]; ];
// Start the search and load if found // Start the search and load if found
@ -5523,571 +5523,6 @@ abstract class ComponentbuilderHelper
} }
/**
* get extensions grouped list xml
**/
public static function getExtensionGroupedListXml()
{
// the extension types
$extensions = array(
'joomla_component' => 'COM_COMPONENTBUILDER_COMPONENT',
'joomla_module' => 'COM_COMPONENTBUILDER_MODULE',
'joomla_plugin' => 'COM_COMPONENTBUILDER_PLUGIN'
);
// get the extension values
foreach ($extensions as $extension => $label)
{
${$extension} = self::getByTypeTheIdsSystemNames($extension);
}
$xml = new DOMDocument();
$xml->formatOutput = true;
$root = $xml->createElement('field');
$root->setAttributeNode(new DOMAttr('name', 'extension'));
$root->setAttributeNode(new DOMAttr('type', 'groupedlist'));
$root->setAttributeNode(new DOMAttr('onchange', 'this.form.submit();'));
$root
->appendChild($xml->createElement('option', '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_EXTENSION') . ' -'))
->setAttributeNode(new DOMAttr('value', ''));
foreach ($extensions as $extension => $label)
{
$extension_node = $xml->createElement('group');
$extension_node->setAttributeNode(new DOMAttr('label', $label));
if (!self::checkArray(${$extension}))
{
$extension_node
->appendChild($xml->createElement('option', '- ' . JText::_('COM_COMPONENTBUILDER_NONE') . ' -'))
->setAttributeNode(new DOMAttr('disabled', 'true'));
}
else
{
foreach (${$extension} as $id => $element)
{
$extension_node
->appendChild($xml->createElement('option', $element))
->setAttributeNode(new DOMAttr('value', $extension . '__' . $id));
}
}
$root->appendChild($extension_node);
}
$xml->appendChild($root);
return $xml->saveXML();
}
/**
* get by type the ids and system names
**/
public static function getByTypeTheIdsSystemNames($type, $limiter = null)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query
->select($db->quoteName(array('id', 'system_name')))
->from($db->quoteName('#__componentbuilder_' . $type))
->where($db->quoteName('published') . ' >= 1')
->order($db->quoteName('modified') . ' desc')
->order($db->quoteName('created') . ' desc');
// check if we have a limter for admin views
if ($type === 'admin_view' && $limiter)
{
// first get all views
$adminviewIds = array();
// if this is a plugin or a module, then no views
if (strpos($limiter, 'joomla_component') !== false)
{
$component = (int) str_replace('joomla_component__', '', $limiter);
// get the views of this component
if ($addViews = self::getVar('component_admin_views', (int) $component, 'joomla_component', 'addadmin_views'))
{
if (self::checkJson($addViews))
{
$addViews = json_decode($addViews, true);
if (self::checkArray($addViews))
{
foreach($addViews as $addView)
{
if (isset($addView['adminview']))
{
$adminviewIds[(int) $addView['adminview']] = (int) $addView['adminview'];
}
}
}
}
}
}
// now check if we still have admin views
if (self::checkArray($adminviewIds))
{
$query->where($db->quoteName('id') . ' IN (' . implode(',', $adminviewIds) . ')');
}
else
{
return false;
}
}
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
return $db->loadAssocList('id', 'system_name');
}
return false;
}
/**
* get any area linked IDs
*/
public static function getAreaLinkedIDs($extension, $type)
{
// What ever...
if ($type === 'joomla_component_admin_views')
{
return self::getComponentAdminViewsIDs($extension);
}
elseif ($type === 'joomla_component_custom_admin_views')
{
return self::getComponentCustomAdminViewsIDs($extension);
}
elseif ($type === 'joomla_component_site_views')
{
return self::getComponentSiteViewsIDs($extension);
}
elseif ($type === 'joomla_component')
{
return self::getComponentFieldsIDs($extension);
}
elseif ($type === 'joomla_module')
{
return self::getModuleFieldsIDs($extension);
}
elseif ($type === 'joomla_plugin')
{
return self::getPluginFieldsIDs($extension);
}
elseif ($type === 'admin_view')
{
return self::getAdminViewFieldsIDs($extension);
}
return false;
}
/**
* get a component admin views IDs
*/
public static function getComponentAdminViewsIDs($id)
{
// get all this components views
$adminviewIds = array();
// get the views of this component
if ($addViews = self::getVar('component_admin_views', (int) $id, 'joomla_component', 'addadmin_views'))
{
if (self::checkJson($addViews))
{
$addViews = json_decode($addViews, true);
if (self::checkArray($addViews))
{
foreach($addViews as $addView)
{
if (isset($addView['adminview']))
{
$adminviewIds[(int) $addView['adminview']] = (int) $addView['adminview'];
}
}
}
}
}
// check that we have fields
if (self::checkArray($adminviewIds))
{
return array_values($adminviewIds);
}
return false;
}
/**
* get a component custom admin views IDs
*/
public static function getComponentCustomAdminViewsIDs($id)
{
// get all this components views
$adminviewIds = array();
// get the views of this component
if ($addViews = self::getVar('component_custom_admin_views', (int) $id, 'joomla_component', 'addcustom_admin_views'))
{
if (self::checkJson($addViews))
{
$addViews = json_decode($addViews, true);
if (self::checkArray($addViews))
{
foreach($addViews as $addView)
{
if (isset($addView['customadminview']))
{
$adminviewIds[(int) $addView['customadminview']] = (int) $addView['customadminview'];
}
}
}
}
}
// check that we have fields
if (self::checkArray($adminviewIds))
{
return array_values($adminviewIds);
}
return false;
}
/**
* get a component site views IDs
*/
public static function getComponentSiteViewsIDs($id)
{
// get all this components views
$adminviewIds = array();
// get the views of this component
if ($addViews = self::getVar('component_site_views', (int) $id, 'joomla_component', 'addsite_views'))
{
if (self::checkJson($addViews))
{
$addViews = json_decode($addViews, true);
if (self::checkArray($addViews))
{
foreach($addViews as $addView)
{
if (isset($addView['siteview']))
{
$adminviewIds[(int) $addView['siteview']] = (int) $addView['siteview'];
}
}
}
}
}
// check that we have fields
if (self::checkArray($adminviewIds))
{
return array_values($adminviewIds);
}
return false;
}
/**
* get a component fields IDs
*/
public static function getComponentFieldsIDs($id)
{
// we start the field array
$fieldIds = array();
// first get all views
$adminviewIds = array();
// get the views of this component
if ($addViews = self::getVar('component_admin_views', (int) $id, 'joomla_component', 'addadmin_views'))
{
if (self::checkJson($addViews))
{
$addViews = json_decode($addViews, true);
if (self::checkArray($addViews))
{
foreach($addViews as $addView)
{
if (isset($addView['adminview']))
{
$adminviewIds[(int) $addView['adminview']] = (int) $addView['adminview'];
}
}
}
}
}
// check that we have views
if (self::checkArray($adminviewIds))
{
foreach ($adminviewIds as $adminView)
{
// get all the fields linked to the admin view
if ($addFields = self::getVar('admin_fields', (int) $adminView, 'admin_view', 'addfields'))
{
if (self::checkJson($addFields))
{
$addFields = json_decode($addFields, true);
if (self::checkArray($addFields))
{
foreach($addFields as $addField)
{
if (isset($addField['field']))
{
$fieldIds[(int) $addField['field']] = (int) $addField['field'];
}
}
}
}
}
}
}
// get config values
if ($addconfig = self::getVar('component_config', (int) $id, 'joomla_component', 'addconfig'))
{
if (self::checkJson($addconfig))
{
$addconfig = json_decode($addconfig, true);
if (self::checkArray($addconfig))
{
foreach($addconfig as $addconf)
{
if (isset($addconf['field']))
{
$fieldIds[(int) $addconf['field']] = (int) $addconf['field'];
}
}
}
}
}
// check that we have fields
if (self::checkArray($fieldIds))
{
return array_values($fieldIds);
}
return false;
}
/**
* get a module fields IDs
*/
public static function getModuleFieldsIDs($id)
{
// we start the field array
$fieldIds = array();
if ($fields = self::getVar('joomla_module', (int) $id, 'id', 'fields'))
{
if (self::checkJson($fields))
{
$fields = json_decode($fields, true);
if (self::checkArray($fields))
{
foreach($fields as $form)
{
if (isset($form['fields']) && self::checkArray($form['fields']))
{
foreach ($form['fields'] as $field)
{
if (isset($field['field']))
{
$fieldIds[(int) $field['field']] = (int) $field['field'];
}
}
}
}
}
}
}
// check that we have fields
if (self::checkArray($fieldIds))
{
return array_values($fieldIds);
}
return false;
}
/**
* get a plugin fields IDs
*/
public static function getPluginFieldsIDs($id)
{
// we start the field array
$fieldIds = array();
if ($fields = self::getVar('joomla_plugin', (int) $id, 'id', 'fields'))
{
if (self::checkJson($fields))
{
$fields = json_decode($fields, true);
if (self::checkArray($fields))
{
foreach($fields as $form)
{
if (isset($form['fields']) && self::checkArray($form['fields']))
{
foreach ($form['fields'] as $field)
{
if (isset($field['field']))
{
$fieldIds[(int) $field['field']] = (int) $field['field'];
}
}
}
}
}
}
}
// check that we have fields
if (self::checkArray($fieldIds))
{
return array_values($fieldIds);
}
return false;
}
/**
* get an admin view fields IDs
*/
public static function getAdminViewFieldsIDs($id)
{
// we start the field array
$fieldIds = array();
// get all the fields linked to the admin view
if ($addFields = self::getVar('admin_fields', (int) $id, 'admin_view', 'addfields'))
{
if (self::checkJson($addFields))
{
$addFields = json_decode($addFields, true);
if (self::checkArray($addFields))
{
foreach($addFields as $addField)
{
if (isset($addField['field']))
{
$fieldIds[(int) $addField['field']] = (int) $addField['field'];
}
}
}
}
}
// check that we have fields
if (self::checkArray($fieldIds))
{
return array_values($fieldIds);
}
return false;
}
/**
* get translation extension ids
**/
public static function getTranslationExtensionsIds($extension, $type)
{
// only allow these columns (extension types)
$columns = array(
'joomla_component' => 'components',
'joomla_module' => 'modules',
'joomla_plugin' => 'plugins'
);
// check if the column name is correct
if (isset($columns[$type]))
{
$column = $columns[$type];
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query
->select($db->quoteName(array('id', $column)))
->from($db->quoteName('#__componentbuilder_language_translation'))
->where($db->quoteName($column) . ' != ' . $db->quote(''));
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
$results = $db->loadAssocList();
$matches = array();
foreach ($results as $k => $v)
{
$value = json_decode($v[$column], true);
if (in_array($extension, $value))
{
$matches[$v['id']] = $v['id'];
}
}
// Checks that we found matches
if (self::checkArray($matches))
{
return array_values($matches);
}
}
}
return false;
}
/**
* get translation ids
**/
public static function getTranslationIds($language, $translated = true)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query
->select($db->quoteName('id'))
->from($db->quoteName('#__componentbuilder_language_translation'));
// Build the where condition
if ($translated === true) // Translated
{
if ($language === 'all')
{
if (($languages = self::getAvailableLanguages()) !== false)
{
$wheres = array();
foreach ($languages as $k => $v)
{
$wheres[] = $db->quoteName('translation') . ' LIKE ' . $db->quote('%' . $k . '%');
}
$query->where($wheres);
}
}
else
{
$query->where($db->quoteName('translation') . ' LIKE ' . $db->quote('%' . $language . '%'));
}
}
else // Not translated
{
if ($language === 'none')
{
$query->where(
array(
$db->quoteName('translation') . ' = ' . $db->quote(''),
$db->quoteName('translation') . ' = ' . $db->quote('[]'),
$db->quoteName('translation') . ' = ' . $db->quote('{}')
), 'OR'
);
}
else
{
$query->where($db->quoteName('translation') . ' NOT LIKE ' . $db->quote('%' . $language . '%'));
}
}
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
return array_unique($db->loadColumn());
}
return false;
}
/**
* get available languages
**/
public static function getAvailableLanguages()
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query
->select($db->quoteName(array('langtag', 'name')))
->from($db->quoteName('#__componentbuilder_language'))
->where($db->quoteName('published') . ' = 1')
->order($db->quoteName('name') . ' desc');
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
return $db->loadAssocList('langtag', 'name');
}
return false;
}
/** /**
* Check if a row already exist * Check if a row already exist
* *

File diff suppressed because one or more lines are too long

View File

@ -1012,8 +1012,14 @@ COM_COMPONENTBUILDER_POWERS_EDIT_VERSION="Powers Edit Version"
COM_COMPONENTBUILDER_POWERS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version powers" COM_COMPONENTBUILDER_POWERS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version powers"
COM_COMPONENTBUILDER_POWERS_SUBMENU="Powers Submenu" COM_COMPONENTBUILDER_POWERS_SUBMENU="Powers Submenu"
COM_COMPONENTBUILDER_POWERS_SUBMENU_DESC="Allows the users in this group to submenu of power" COM_COMPONENTBUILDER_POWERS_SUBMENU_DESC="Allows the users in this group to submenu of power"
COM_COMPONENTBUILDER_POWER_INIT_BUTTON_ACCESS="Power Init Button Access"
COM_COMPONENTBUILDER_POWER_INIT_BUTTON_ACCESS_DESC="Allows the users in this group to access the init button."
COM_COMPONENTBUILDER_POWER_RESET_BUTTON_ACCESS="Power Reset Button Access"
COM_COMPONENTBUILDER_POWER_RESET_BUTTON_ACCESS_DESC="Allows the users in this group to access the reset button."
COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS="Power Run Expansion Button Access" COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS="Power Run Expansion Button Access"
COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS_DESC="Allows the users in this group to access the run expansion button." COM_COMPONENTBUILDER_POWER_RUN_EXPANSION_BUTTON_ACCESS_DESC="Allows the users in this group to access the run expansion button."
COM_COMPONENTBUILDER_POWER_SYNC_BUTTON_ACCESS="Power Sync Button Access"
COM_COMPONENTBUILDER_POWER_SYNC_BUTTON_ACCESS_DESC="Allows the users in this group to access the sync button."
COM_COMPONENTBUILDER_SEARCH_ACCESS="Search Access" COM_COMPONENTBUILDER_SEARCH_ACCESS="Search Access"
COM_COMPONENTBUILDER_SEARCH_ACCESS_DESC="Allows the users in this group to access search." COM_COMPONENTBUILDER_SEARCH_ACCESS_DESC="Allows the users in this group to access search."
COM_COMPONENTBUILDER_SEARCH_COMPILER_BUTTON_ACCESS="Search Compiler Button Access" COM_COMPONENTBUILDER_SEARCH_COMPILER_BUTTON_ACCESS="Search Compiler Button Access"

View File

@ -12,7 +12,7 @@
// No direct access to this file // No direct access to this file
defined('JPATH_BASE') or die('Restricted access'); defined('JPATH_BASE') or die('Restricted access');
// Different support requests/appreciation // Different support requests/appreciation
$support = [ $support = [
JText::_("COM_COMPONENTBUILDER_JOOMLA_COMPONENT_BUILDER_JCB_IS_A_CRUCIAL_TOOL_FOR_PHP_PROGRAMMERS_WHO_USE_JOOMLA_TO_EARN_A_LIVING_BY_MAKING_A_BFINANCIAL_DONATIONB_YOU_CAN_SUPPORT_THE_GROWTH_AND_CONTINUITY_OF_THIS_VITAL_RESOURCE_AND_ENSURE_ITS_RELEVANCE_FOR_YEARS_TO_COME_YOUR_CONTRIBUTION_NO_MATTER_HOW_BIG_OR_SMALL_WILL_BE_DEEPLY_APPRECIATED_BY_THE_PROJECTS_TEAM_AND_THE_WIDER_COMMUNITY"), JText::_("COM_COMPONENTBUILDER_JOOMLA_COMPONENT_BUILDER_JCB_IS_A_CRUCIAL_TOOL_FOR_PHP_PROGRAMMERS_WHO_USE_JOOMLA_TO_EARN_A_LIVING_BY_MAKING_A_BFINANCIAL_DONATIONB_YOU_CAN_SUPPORT_THE_GROWTH_AND_CONTINUITY_OF_THIS_VITAL_RESOURCE_AND_ENSURE_ITS_RELEVANCE_FOR_YEARS_TO_COME_YOUR_CONTRIBUTION_NO_MATTER_HOW_BIG_OR_SMALL_WILL_BE_DEEPLY_APPRECIATED_BY_THE_PROJECTS_TEAM_AND_THE_WIDER_COMMUNITY"),
JText::_("COM_COMPONENTBUILDER_THE_CONTINUED_SUPPORT_OF_INDIVIDUALS_LIKE_YOU_HAS_ALLOWED_JOOMLA_COMPONENT_BUILDER_JCB_TO_THRIVE_FOR_SEVEN_YEARS_SINCE_GOING_PUBLIC_YOUR_CONTRIBUTIONS_HAVE_BEEN_CRUCIAL_IN_ENSURING_THE_GROWTH_AND_RELEVANCE_OF_THIS_VITAL_TOOL_FOR_PHP_PROGRAMMERS_THANK_YOU_FOR_YOUR_SUPPORT_AND_FOR_BEING_A_PART_OF_JCBS_JOURNEY"), JText::_("COM_COMPONENTBUILDER_THE_CONTINUED_SUPPORT_OF_INDIVIDUALS_LIKE_YOU_HAS_ALLOWED_JOOMLA_COMPONENT_BUILDER_JCB_TO_THRIVE_FOR_SEVEN_YEARS_SINCE_GOING_PUBLIC_YOUR_CONTRIBUTIONS_HAVE_BEEN_CRUCIAL_IN_ENSURING_THE_GROWTH_AND_RELEVANCE_OF_THIS_VITAL_TOOL_FOR_PHP_PROGRAMMERS_THANK_YOU_FOR_YOUR_SUPPORT_AND_FOR_BEING_A_PART_OF_JCBS_JOURNEY"),

View File

@ -0,0 +1,43 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 30th April, 2015
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// get the form
$form = $displayData->getForm();
// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model method
// this name combination of tab and layout in the method name is the only work around
// seeing that JCB uses those two values (tab_name & layout_name) as the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];
// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
'approved',
'approved_paths'
);
$hiddenFields = $displayData->get('hidden_fields') ?: array();
?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
<?php if (in_array($field, $hiddenFields)) : ?>
<?php $form->setFieldAttribute($field, 'type', 'hidden'); ?>
<?php endif; ?>
<?php echo $form->renderField($field, null, null, array('class' => 'control-wrapper-' . $field)); ?>
<?php endforeach; ?>
<?php endif; ?>

View File

@ -0,0 +1,42 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 30th April, 2015
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// get the form
$form = $displayData->getForm();
// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model method
// this name combination of tab and layout in the method name is the only work around
// seeing that JCB uses those two values (tab_name & layout_name) as the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];
// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
'note_approved_paths'
);
$hiddenFields = $displayData->get('hidden_fields') ?: array();
?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
<?php if (in_array($field, $hiddenFields)) : ?>
<?php $form->setFieldAttribute($field, 'type', 'hidden'); ?>
<?php endif; ?>
<?php echo $form->renderField($field, null, null, array('class' => 'control-wrapper-' . $field)); ?>
<?php endforeach; ?>
<?php endif; ?>

View File

@ -14,6 +14,8 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Componentbuilder\Utilities\FilterHelper as JCBFilterHelper;
use VDM\Joomla\Componentbuilder\Utilities\FormHelper as JCBFormHelper;
/** /**
* Admin_views List Model * Admin_views List Model
@ -70,7 +72,7 @@ class ComponentbuilderModelAdmin_views extends ListModel
'' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_COMPONENTS_FOUND') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_COMPONENTS_FOUND') . ' -'
); );
// check if we have joomla components // check if we have joomla components
if (($joomla_components = ComponentbuilderHelper::getByTypeTheIdsSystemNames('joomla_component')) !== false) if (($joomla_components = JCBFilterHelper::names('joomla_component')) !== null)
{ {
$options = array( $options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_COMPONENT') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_COMPONENT') . ' -'
@ -79,7 +81,7 @@ class ComponentbuilderModelAdmin_views extends ListModel
$options = $options + $joomla_components; $options = $options + $joomla_components;
} }
$form->setField(ComponentbuilderHelper::getFieldXML($attributes, $options),'filter'); $form->setField(JCBFormHelper::xml($attributes, $options),'filter');
$form->setValue( $form->setValue(
'joomla_component', 'joomla_component',
'filter', 'filter',
@ -88,7 +90,8 @@ class ComponentbuilderModelAdmin_views extends ListModel
array_push($this->filter_fields, 'joomla_component'); array_push($this->filter_fields, 'joomla_component');
return $form; return $form;
} }
/** /**
* Method to auto-populate the model state. * Method to auto-populate the model state.
@ -354,7 +357,7 @@ class ComponentbuilderModelAdmin_views extends ListModel
$filter_joomla_component = $this->state->get("filter.joomla_component"); $filter_joomla_component = $this->state->get("filter.joomla_component");
if ($filter_joomla_component !== null && !empty($filter_joomla_component)) if ($filter_joomla_component !== null && !empty($filter_joomla_component))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_joomla_component, 'joomla_component_admin_views')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_joomla_component, 'joomla_component_admin_views')) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }
@ -589,7 +592,7 @@ class ComponentbuilderModelAdmin_views extends ListModel
$filter_joomla_component = $this->state->get("filter.joomla_component"); $filter_joomla_component = $this->state->get("filter.joomla_component");
if ($filter_joomla_component !== null && !empty($filter_joomla_component)) if ($filter_joomla_component !== null && !empty($filter_joomla_component))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_joomla_component, 'joomla_component_admin_views')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_joomla_component, 'joomla_component_admin_views')) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }

View File

@ -14,7 +14,7 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Gitea\Gitea; use VDM\Joomla\Gitea\Factory as GiteaFactory;
use VDM\Joomla\Componentbuilder\Package\Factory as PackageFactory; use VDM\Joomla\Componentbuilder\Package\Factory as PackageFactory;
use VDM\Joomla\Utilities\FileHelper; use VDM\Joomla\Utilities\FileHelper;
use VDM\Joomla\Utilities\JsonHelper; use VDM\Joomla\Utilities\JsonHelper;
@ -175,11 +175,18 @@ class ComponentbuilderModelAjax extends ListModel
// check if url exist // check if url exist
if ($info = FileHelper::getContent($url, false)) if ($info = FileHelper::getContent($url, false))
{ {
if ((($info_ = PackageFactory::_('Crypt')->decrypt($info, 'local')) !== null && JsonHelper::check($info_)) || $_info = PackageFactory::_('Crypt')->decrypt($info, 'local.legacy');
(($info_ = PackageFactory::_('Crypt')->decrypt($info, 'local.legacy')) !== null && JsonHelper::check($info_)) ||
(($info_ = PackageFactory::_('Crypt')->decrypt($info, 'local.fof')) !== null && JsonHelper::check($info_))) // check if we had success
if (!JsonHelper::check($_info))
{ {
$info = json_decode($info_, true); $_info = PackageFactory::_('Crypt')->decrypt($info, 'local.fof');
}
// check if we have json
if (JsonHelper::check($_info))
{
$info = json_decode($_info, true);
return [ return [
'owner' => PackageFactory::_('Display.Details')->owner($info, true), 'owner' => PackageFactory::_('Display.Details')->owner($info, true),
@ -268,25 +275,16 @@ class ComponentbuilderModelAjax extends ListModel
public function getWiki($name = 'Home') public function getWiki($name = 'Home')
{ {
// get the token if set
$token = JComponentHelper::getParams('com_componentbuilder')->get('gitea_token', false);
// setup a registry
$options = new Registry;
// only add if token is set
if ($token)
{
$options->set('access.token', $token);
}
try try
{ {
// get gitea object // load the API details
$gitea = new Gitea($options); GiteaFactory::_('Gitea.Repository.Wiki')->load_('https://git.vdm.dev', '');
// get the gitea wiki page TODO: we hard coded the page name // get the gitea wiki page im markdown
$page = $gitea->repo->wiki->getHtml('joomla', 'Component-Builder', 'Home'); $wiki = GiteaFactory::_('Gitea.Repository.Wiki')->get('joomla', 'Component-Builder', 'Home');
// now render the page in HTML
$page = GiteaFactory::_('Gitea.Miscellaneous.Markdown')->render($wiki->content, true);
} }
catch (DomainException $e) catch (DomainException $e)
{ {
@ -323,20 +321,18 @@ class ComponentbuilderModelAjax extends ListModel
public function getVersion($version = null) public function getVersion($version = null)
{ {
// get the token if set // get the token if set
$token = JComponentHelper::getParams('com_componentbuilder')->get('gitea_token', false); $token = $this->app_params->get('gitea_token', false);
// only add if token is set // only add if token is set
if ($token) if ($token)
{ {
// setup a registry
$options = new Registry;
$options->set('access.token', $token);
// get the gitea http
try try
{ {
// get gitea object // load the API details
$gitea = new Gitea($options); GiteaFactory::_('Gitea.Repository.Tags')->load_('https://git.vdm.dev', $token);
// get a list of all the repos tags
$tags = $gitea->repo->getListTags('joomla', 'Component-Builder'); // get the repository tags
$tags = GiteaFactory::_('Gitea.Repository.Tags')->list('joomla', 'Component-Builder');
} }
catch (DomainException $e) catch (DomainException $e)
{ {

View File

@ -14,7 +14,6 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Gitea\Gitea;
use Joomla\Registry\Registry; use Joomla\Registry\Registry;
/** /**

View File

@ -14,6 +14,8 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Componentbuilder\Utilities\FormHelper as JCBFormHelper;
use VDM\Joomla\Componentbuilder\Utilities\FilterHelper as JCBFilterHelper;
/** /**
* Custom_admin_views List Model * Custom_admin_views List Model
@ -68,7 +70,7 @@ class ComponentbuilderModelCustom_admin_views extends ListModel
'' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_COMPONENTS_FOUND') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_COMPONENTS_FOUND') . ' -'
); );
// check if we have joomla components // check if we have joomla components
if (($joomla_components = ComponentbuilderHelper::getByTypeTheIdsSystemNames('joomla_component')) !== false) if (($joomla_components = JCBFilterHelper::names('joomla_component')) !== null)
{ {
$options = array( $options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_COMPONENT') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_COMPONENT') . ' -'
@ -77,7 +79,7 @@ class ComponentbuilderModelCustom_admin_views extends ListModel
$options = $options + $joomla_components; $options = $options + $joomla_components;
} }
$form->setField(ComponentbuilderHelper::getFieldXML($attributes, $options),'filter'); $form->setField(JCBFormHelper::xml($attributes, $options),'filter');
$form->setValue( $form->setValue(
'joomla_component', 'joomla_component',
'filter', 'filter',
@ -293,7 +295,7 @@ class ComponentbuilderModelCustom_admin_views extends ListModel
$filter_joomla_component = $this->state->get("filter.joomla_component"); $filter_joomla_component = $this->state->get("filter.joomla_component");
if ($filter_joomla_component !== null && !empty($filter_joomla_component)) if ($filter_joomla_component !== null && !empty($filter_joomla_component))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_joomla_component, 'joomla_component_custom_admin_views')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_joomla_component, 'joomla_component_custom_admin_views')) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }
@ -498,7 +500,7 @@ class ComponentbuilderModelCustom_admin_views extends ListModel
$filter_joomla_component = $this->state->get("filter.joomla_component"); $filter_joomla_component = $this->state->get("filter.joomla_component");
if ($filter_joomla_component !== null && !empty($filter_joomla_component)) if ($filter_joomla_component !== null && !empty($filter_joomla_component))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_joomla_component, 'joomla_component_custom_admin_views')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_joomla_component, 'joomla_component_custom_admin_views')) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }

View File

@ -14,6 +14,8 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Componentbuilder\Utilities\FormHelper as JCBFormHelper;
use VDM\Joomla\Componentbuilder\Utilities\FilterHelper as JCBFilterHelper;
/** /**
* Fields List Model * Fields List Model
@ -63,7 +65,7 @@ class ComponentbuilderModelFields extends ListModel
// Create the "extension" filter // Create the "extension" filter
$form->setField(new SimpleXMLElement( $form->setField(new SimpleXMLElement(
ComponentbuilderHelper::getExtensionGroupedListXml() JCBFilterHelper::extensions()
),'filter'); ),'filter');
$form->setValue( $form->setValue(
'extension', 'extension',
@ -82,7 +84,7 @@ class ComponentbuilderModelFields extends ListModel
'' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_ADMIN_VIEWS_FOUND') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_ADMIN_VIEWS_FOUND') . ' -'
); );
// check if we have admin views (and limit to an extension if it is set) // check if we have admin views (and limit to an extension if it is set)
if (($admin_views = ComponentbuilderHelper::getByTypeTheIdsSystemNames('admin_view', $this->state->get("filter.extension"))) !== false) if (($admin_views = JCBFilterHelper::names('admin_view', $this->state->get("filter.extension"))) !== null)
{ {
$options = array( $options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_ADMIN_VIEW') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_ADMIN_VIEW') . ' -'
@ -91,7 +93,7 @@ class ComponentbuilderModelFields extends ListModel
$options = $options + $admin_views; $options = $options + $admin_views;
} }
$form->setField(ComponentbuilderHelper::getFieldXML($attributes, $options),'filter'); $form->setField(JCBFormHelper::xml($attributes, $options),'filter');
$form->setValue( $form->setValue(
'admin_view', 'admin_view',
'filter', 'filter',
@ -100,7 +102,8 @@ class ComponentbuilderModelFields extends ListModel
array_push($this->filter_fields, 'admin_view'); array_push($this->filter_fields, 'admin_view');
return $form; return $form;
} }
/** /**
* Method to auto-populate the model state. * Method to auto-populate the model state.
@ -379,7 +382,7 @@ class ComponentbuilderModelFields extends ListModel
{ {
// column name, and id // column name, and id
$type_extension = explode('__', $filter_extension); $type_extension = explode('__', $filter_extension);
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($type_extension[1], $type_extension[0])) !== false) if (($ids = JCBFilterHelper::linked((int) $type_extension[1], (string) $type_extension[0])) !== null)
{ {
$field_ids = $ids; $field_ids = $ids;
} }
@ -395,7 +398,7 @@ class ComponentbuilderModelFields extends ListModel
$filter_admin_view = $this->state->get("filter.admin_view"); $filter_admin_view = $this->state->get("filter.admin_view");
if ($get_ids && $filter_admin_view !== null && !empty($filter_admin_view)) if ($get_ids && $filter_admin_view !== null && !empty($filter_admin_view))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_admin_view, 'admin_view')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_admin_view, 'admin_view')) !== null)
{ {
// view will return less fields, so we ignore the component // view will return less fields, so we ignore the component
$field_ids = $ids; $field_ids = $ids;
@ -644,7 +647,7 @@ class ComponentbuilderModelFields extends ListModel
{ {
// column name, and id // column name, and id
$type_extension = explode('__', $filter_extension); $type_extension = explode('__', $filter_extension);
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($type_extension[1], $type_extension[0])) !== false) if (($ids = JCBFilterHelper::linked((int) $type_extension[1], (string) $type_extension[0])) !== null)
{ {
$field_ids = $ids; $field_ids = $ids;
} }
@ -660,7 +663,7 @@ class ComponentbuilderModelFields extends ListModel
$filter_admin_view = $this->state->get("filter.admin_view"); $filter_admin_view = $this->state->get("filter.admin_view");
if ($get_ids && $filter_admin_view !== null && !empty($filter_admin_view)) if ($get_ids && $filter_admin_view !== null && !empty($filter_admin_view))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_admin_view, 'admin_view')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_admin_view, 'admin_view')) !== null)
{ {
// view will return less fields, so we ignore the component // view will return less fields, so we ignore the component
$field_ids = $ids; $field_ids = $ids;

View File

@ -17,16 +17,16 @@ jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list'); JFormHelper::loadFieldClass('list');
/** /**
* Powersfilterpowerversion Form Field class for the Componentbuilder component * Powersfilterapproved Form Field class for the Componentbuilder component
*/ */
class JFormFieldPowersfilterpowerversion extends JFormFieldList class JFormFieldPowersfilterapproved extends JFormFieldList
{ {
/** /**
* The powersfilterpowerversion field type. * The powersfilterapproved field type.
* *
* @var string * @var string
*/ */
public $type = 'powersfilterpowerversion'; public $type = 'powersfilterapproved';
/** /**
* Method to get a list of options for a list input. * Method to get a list of options for a list input.
@ -42,24 +42,28 @@ class JFormFieldPowersfilterpowerversion extends JFormFieldList
$query = $db->getQuery(true); $query = $db->getQuery(true);
// Select the text. // Select the text.
$query->select($db->quoteName('power_version')); $query->select($db->quoteName('approved'));
$query->from($db->quoteName('#__componentbuilder_power')); $query->from($db->quoteName('#__componentbuilder_power'));
$query->order($db->quoteName('power_version') . ' ASC'); $query->order($db->quoteName('approved') . ' ASC');
// Reset the query using our newly populated query object. // Reset the query using our newly populated query object.
$db->setQuery($query); $db->setQuery($query);
$results = $db->loadColumn(); $results = $db->loadColumn();
$_filter = array(); $_filter = array();
$_filter[] = JHtml::_('select.option', '', '- ' . JText::_('COM_COMPONENTBUILDER_FILTER_SELECT_VERSION') . ' -'); $_filter[] = JHtml::_('select.option', '', '- ' . JText::_('COM_COMPONENTBUILDER_FILTER_SELECT_SUPER_POWER') . ' -');
if ($results) if ($results)
{ {
// get powersmodel
$model = ComponentbuilderHelper::getModel('powers');
$results = array_unique($results); $results = array_unique($results);
foreach ($results as $power_version) foreach ($results as $approved)
{ {
// Now add the power_version and its text to the options array // Translate the approved selection
$_filter[] = JHtml::_('select.option', $power_version, $power_version); $text = $model->selectionTranslation($approved,'approved');
// Now add the approved and its text to the options array
$_filter[] = JHtml::_('select.option', $approved, JText::_($text));
} }
} }
return $_filter; return $_filter;

View File

@ -0,0 +1,100 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 30th April, 2015
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// Import the checkboxes field type classes needed
JFormHelper::loadFieldClass('checkboxes');
use VDM\Joomla\Utilities\Component\Helper;
/**
* Superpowerpaths Form Field class for the Componentbuilder component
*/
class JFormFieldSuperpowerpaths extends JFormFieldCheckboxes
{
/**
* The superpowerpaths field type.
*
* @var string
*/
public $type = 'superpowerpaths';
// A DynamicCheckboxes@ Field
/**
* Method to get the data to be passed to the layout for rendering.
*
* @return array
*
* @since 3.5
*/
protected function getLayoutData()
{
$data = parent::getLayoutData();
// True if the field has 'value' set. In other words, it has been stored, don't use the default values.
$hasValue = (isset($this->value) && !empty($this->value));
// If a value has been stored, use it. Otherwise, use the defaults.
$checkedOptions = $hasValue ? $this->value : $this->checkedOptions;
// get the form options
$options = [];
// get the component params
$params = Helper::getParams();
$activate = $params->get('super_powers_repositories', 0);
// set the default
$default = $params->get('super_powers_core', 'joomla/super-powers');
// must have one / in the path
if (strpos($default, '/') !== false)
{
$tmp = new stdClass;
$tmp->text = $tmp->value = trim($default);
$tmp->checked = false;
$options[$tmp->value] = $tmp;
}
if ($activate == 1)
{
$subform = $params->get($this->fieldname);
// add the paths found in global settings
if (is_object($subform))
{
foreach ($subform as $value)
{
if (isset($value->owner) && strlen($value->owner) > 1 &&
isset($value->repo) && strlen($value->repo) > 1)
{
$tmp = new stdClass;
$tmp->text = $tmp->value = trim($value->owner) . '/' . trim($value->repo);
$tmp->checked = false;
$options[$tmp->value] = $tmp;
}
}
}
}
$extraData = array(
'checkedOptions' => is_array($checkedOptions) ? $checkedOptions : explode(',', (string) $checkedOptions),
'hasValue' => $hasValue,
'options' => array_values($options)
);
return array_merge($data, $extraData);
}
}

View File

@ -271,7 +271,7 @@ class ComponentbuilderModelFieldtype extends AdminModel
{ {
// column name, and id // column name, and id
$type_extension = explode('__', $filter_extension); $type_extension = explode('__', $filter_extension);
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($type_extension[1], $type_extension[0])) !== false) if (($ids = JCBFilterHelper::linked((int) $type_extension[1], (string) $type_extension[0])) !== null)
{ {
$field_ids = $ids; $field_ids = $ids;
} }
@ -287,7 +287,7 @@ class ComponentbuilderModelFieldtype extends AdminModel
$filter_admin_view = $this->state->get("filter.admin_view"); $filter_admin_view = $this->state->get("filter.admin_view");
if ($get_ids && $filter_admin_view !== null && !empty($filter_admin_view)) if ($get_ids && $filter_admin_view !== null && !empty($filter_admin_view))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_admin_view, 'admin_view')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_admin_view, 'admin_view')) !== null)
{ {
// view will return less fields, so we ignore the component // view will return less fields, so we ignore the component
$field_ids = $ids; $field_ids = $ids;

View File

@ -86,8 +86,8 @@
<option value="a.published DESC">JSTATUS_DESC</option> <option value="a.published DESC">JSTATUS_DESC</option>
<option value="a.system_name ASC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_ASCENDING</option> <option value="a.system_name ASC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_ASCENDING</option>
<option value="a.system_name DESC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_DESCENDING</option> <option value="a.system_name DESC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_DESCENDING</option>
<option value="a.name_single ASC">COM_COMPONENTBUILDER_FILTER_NAME_SINGLE_RECORD_NAMING_CONVENTIONS_ASCENDING</option> <option value="a.name_single ASC">COM_COMPONENTBUILDER_FILTER_NAME_SINGLE_RECORDNAMING_CONVENTIONS_ASCENDING</option>
<option value="a.name_single DESC">COM_COMPONENTBUILDER_FILTER_NAME_SINGLE_RECORD_NAMING_CONVENTIONS_DESCENDING</option> <option value="a.name_single DESC">COM_COMPONENTBUILDER_FILTER_NAME_SINGLE_RECORDNAMING_CONVENTIONS_DESCENDING</option>
<option value="a.short_description ASC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_ASCENDING</option> <option value="a.short_description ASC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_ASCENDING</option>
<option value="a.short_description DESC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_DESCENDING</option> <option value="a.short_description DESC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_DESCENDING</option>
<option value="a.id ASC">JGRID_HEADING_ID_ASC</option> <option value="a.id ASC">JGRID_HEADING_ID_ASC</option>

View File

@ -66,8 +66,8 @@
<option value="a.published DESC">JSTATUS_DESC</option> <option value="a.published DESC">JSTATUS_DESC</option>
<option value="a.system_name ASC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_ASCENDING</option> <option value="a.system_name ASC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_ASCENDING</option>
<option value="a.system_name DESC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_DESCENDING</option> <option value="a.system_name DESC">COM_COMPONENTBUILDER_FILTER_SYSTEM_NAME_DESCENDING</option>
<option value="a.name_code ASC">COM_COMPONENTBUILDER_FILTER_NAME_IN_CODE_NAMING_CONVENTIONS_ASCENDING</option> <option value="a.name_code ASC">COM_COMPONENTBUILDER_FILTER_NAME_IN_CODENAMING_CONVENTIONS_ASCENDING</option>
<option value="a.name_code DESC">COM_COMPONENTBUILDER_FILTER_NAME_IN_CODE_NAMING_CONVENTIONS_DESCENDING</option> <option value="a.name_code DESC">COM_COMPONENTBUILDER_FILTER_NAME_IN_CODENAMING_CONVENTIONS_DESCENDING</option>
<option value="a.short_description ASC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_ASCENDING</option> <option value="a.short_description ASC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_ASCENDING</option>
<option value="a.short_description DESC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_DESCENDING</option> <option value="a.short_description DESC">COM_COMPONENTBUILDER_FILTER_SHORT_DESCRIPTION_DESCENDING</option>
<option value="a.companyname ASC">COM_COMPONENTBUILDER_FILTER_COMPANY_NAME_ASCENDING</option> <option value="a.companyname ASC">COM_COMPONENTBUILDER_FILTER_COMPANY_NAME_ASCENDING</option>

View File

@ -39,16 +39,9 @@
onchange="this.form.submit();" onchange="this.form.submit();"
/> />
<field <field
type="powersfilterpowerversion" type="powersfilterapproved"
name="power_version" name="approved"
label="COM_COMPONENTBUILDER_POWER_POWER_VERSION_LABEL" label="COM_COMPONENTBUILDER_POWER_APPROVED_LABEL"
multiple="false"
onchange="this.form.submit();"
/>
<field
type="classpowers"
name="extends"
label="COM_COMPONENTBUILDER_POWER_EXTENDS_LABEL"
multiple="false" multiple="false"
onchange="this.form.submit();" onchange="this.form.submit();"
/> />

View File

@ -159,6 +159,38 @@
message="COM_COMPONENTBUILDER_POWER_POWER_VERSION_MESSAGE" message="COM_COMPONENTBUILDER_POWER_POWER_VERSION_MESSAGE"
hint="COM_COMPONENTBUILDER_POWER_POWER_VERSION_HINT" hint="COM_COMPONENTBUILDER_POWER_POWER_VERSION_HINT"
/> />
<!-- Not_required Field. Type: Hidden. (joomla) -->
<field
type="hidden"
name="not_required"
default="一_一"
/>
<!-- Method_selection Field. Type: Subform. (joomla) -->
<field
type="subform"
name="method_selection"
label="COM_COMPONENTBUILDER_POWER_METHOD_SELECTION_LABEL"
layout="joomla.form.field.subform.repeatable-table"
multiple="true"
buttons="add,remove,move"
description="COM_COMPONENTBUILDER_POWER_METHOD_SELECTION_DESCRIPTION"
icon="list"
max="150"
min="0">
<form hidden="true" name="list_method_selection_modal" repeat="true">
<!-- Method Field. Type: Pluginsclassmethods. (custom) -->
<field
type="pluginsclassmethods"
name="method"
label="COM_COMPONENTBUILDER_POWER_METHOD_LABEL"
class="list_class span12 method_selection_list"
multiple="false"
default="0"
onchange="getClassCode(this, 'method');"
button="false"
/>
</form>
</field>
<!-- Load_selection Field. Type: Subform. (joomla) --> <!-- Load_selection Field. Type: Subform. (joomla) -->
<field <field
type="subform" type="subform"
@ -184,20 +216,8 @@
/> />
</form> </form>
</field> </field>
<!-- Load_powers_note Field. Type: Note. A None Database Field. (joomla) --> <!-- Note_linked_to_notice Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="load_powers_note" label="COM_COMPONENTBUILDER_POWER_LOAD_POWERS_NOTE_LABEL" description="COM_COMPONENTBUILDER_POWER_LOAD_POWERS_NOTE_DESCRIPTION" heading="h4" class="alert alert-info load_powers_note" /> <field type="note" name="note_linked_to_notice" label="COM_COMPONENTBUILDER_POWER_NOTE_LINKED_TO_NOTICE_LABEL" description="COM_COMPONENTBUILDER_POWER_NOTE_LINKED_TO_NOTICE_DESCRIPTION" heading="h4" class="note_linked_to_notice" />
<!-- Description Field. Type: Textarea. (joomla) -->
<field
type="textarea"
name="description"
label="COM_COMPONENTBUILDER_POWER_DESCRIPTION_LABEL"
rows="11"
cols="10"
description="COM_COMPONENTBUILDER_POWER_DESCRIPTION_DESCRIPTION"
class="text_area span12"
filter="HTML"
hint="COM_COMPONENTBUILDER_POWER_DESCRIPTION_HINT"
/>
<!-- Licensing_template Field. Type: Textarea. (joomla) --> <!-- Licensing_template Field. Type: Textarea. (joomla) -->
<field <field
type="textarea" type="textarea"
@ -211,6 +231,20 @@
validate="code" validate="code"
showon="add_licensing_template:2" showon="add_licensing_template:2"
/> />
<!-- Description Field. Type: Textarea. (joomla) -->
<field
type="textarea"
name="description"
label="COM_COMPONENTBUILDER_POWER_DESCRIPTION_LABEL"
rows="11"
cols="10"
description="COM_COMPONENTBUILDER_POWER_DESCRIPTION_DESCRIPTION"
class="text_area span12"
filter="HTML"
hint="COM_COMPONENTBUILDER_POWER_DESCRIPTION_HINT"
/>
<!-- Note_approved_paths Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="note_approved_paths" label="COM_COMPONENTBUILDER_POWER_NOTE_APPROVED_PATHS_LABEL" description="COM_COMPONENTBUILDER_POWER_NOTE_APPROVED_PATHS_DESCRIPTION" heading="h4" class="alert alert-info note_approved_paths" showon="approved:1" />
<!-- Composer Field. Type: Subform. (joomla) --> <!-- Composer Field. Type: Subform. (joomla) -->
<field <field
type="subform" type="subform"
@ -268,6 +302,33 @@
</field> </field>
</form> </form>
</field> </field>
<!-- Extends Field. Type: Classpowers. (custom) -->
<field
type="classpowers"
name="extends"
label="COM_COMPONENTBUILDER_POWER_EXTENDS_LABEL"
description="COM_COMPONENTBUILDER_POWER_EXTENDS_DESCRIPTION"
class="list_class span12"
multiple="false"
default="0"
showon="type:class[OR]type:abstract class[OR]type:final class"
button="true"
/>
<!-- Approved Field. Type: Radio. (joomla) -->
<field
type="radio"
name="approved"
label="COM_COMPONENTBUILDER_POWER_APPROVED_LABEL"
description="COM_COMPONENTBUILDER_POWER_APPROVED_DESCRIPTION"
class="btn-group btn-group-yesno"
default="0"
required="true">
<!-- Option Set. -->
<option value="0">
COM_COMPONENTBUILDER_POWER_NOT_APPROVED</option>
<option value="1">
COM_COMPONENTBUILDER_POWER_APPROVED</option>
</field>
<!-- Property_selection Field. Type: Subform. (joomla) --> <!-- Property_selection Field. Type: Subform. (joomla) -->
<field <field
type="subform" type="subform"
@ -308,6 +369,20 @@
<option value="0"> <option value="0">
COM_COMPONENTBUILDER_POWER_NO</option> COM_COMPONENTBUILDER_POWER_NO</option>
</field> </field>
<!-- Extends_custom Field. Type: Text. (joomla) -->
<field
type="text"
name="extends_custom"
label="COM_COMPONENTBUILDER_POWER_EXTENDS_CUSTOM_LABEL"
size="10"
maxlength="50"
description="COM_COMPONENTBUILDER_POWER_EXTENDS_CUSTOM_DESCRIPTION"
class="text_area span12"
filter="STRING"
message="COM_COMPONENTBUILDER_POWER_EXTENDS_CUSTOM_MESSAGE"
autocomplete="on"
showon="extends:-1[AND]type!:trait[AND]type!:interface"
/>
<!-- Implements_custom Field. Type: Text. (joomla) --> <!-- Implements_custom Field. Type: Text. (joomla) -->
<field <field
type="text" type="text"
@ -334,66 +409,6 @@
showon="type!:interface[AND]type!:trait" showon="type!:interface[AND]type!:trait"
button="true" button="true"
/> />
<!-- Extends_custom Field. Type: Text. (joomla) -->
<field
type="text"
name="extends_custom"
label="COM_COMPONENTBUILDER_POWER_EXTENDS_CUSTOM_LABEL"
size="10"
maxlength="50"
description="COM_COMPONENTBUILDER_POWER_EXTENDS_CUSTOM_DESCRIPTION"
class="text_area span12"
filter="STRING"
message="COM_COMPONENTBUILDER_POWER_EXTENDS_CUSTOM_MESSAGE"
autocomplete="on"
showon="extends:-1[AND]type!:trait[AND]type!:interface"
/>
<!-- Extends Field. Type: Classpowers. (custom) -->
<field
type="classpowers"
name="extends"
label="COM_COMPONENTBUILDER_POWER_EXTENDS_LABEL"
description="COM_COMPONENTBUILDER_POWER_EXTENDS_DESCRIPTION"
class="list_class span12"
multiple="false"
default="0"
showon="type:class[OR]type:abstract class[OR]type:final class"
button="true"
/>
<!-- Note_linked_to_notice Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="note_linked_to_notice" label="COM_COMPONENTBUILDER_POWER_NOTE_LINKED_TO_NOTICE_LABEL" description="COM_COMPONENTBUILDER_POWER_NOTE_LINKED_TO_NOTICE_DESCRIPTION" heading="h4" class="note_linked_to_notice" />
<!-- Not_required Field. Type: Hidden. (joomla) -->
<field
type="hidden"
name="not_required"
default="一_一"
/>
<!-- Method_selection Field. Type: Subform. (joomla) -->
<field
type="subform"
name="method_selection"
label="COM_COMPONENTBUILDER_POWER_METHOD_SELECTION_LABEL"
layout="joomla.form.field.subform.repeatable-table"
multiple="true"
buttons="add,remove,move"
description="COM_COMPONENTBUILDER_POWER_METHOD_SELECTION_DESCRIPTION"
icon="list"
max="150"
min="0">
<form hidden="true" name="list_method_selection_modal" repeat="true">
<!-- Method Field. Type: Pluginsclassmethods. (custom) -->
<field
type="pluginsclassmethods"
name="method"
label="COM_COMPONENTBUILDER_POWER_METHOD_LABEL"
class="list_class span12 method_selection_list"
multiple="false"
default="0"
onchange="getClassCode(this, 'method');"
button="false"
/>
</form>
</field>
<!-- Namespace_details Field. Type: Note. A None Database Field. (joomla) --> <!-- Namespace_details Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="namespace_details" label="COM_COMPONENTBUILDER_POWER_NAMESPACE_DETAILS_LABEL" description="COM_COMPONENTBUILDER_POWER_NAMESPACE_DETAILS_DESCRIPTION" heading="h4" class="alert alert-success namespace_details" /> <field type="note" name="namespace_details" label="COM_COMPONENTBUILDER_POWER_NAMESPACE_DETAILS_LABEL" description="COM_COMPONENTBUILDER_POWER_NAMESPACE_DETAILS_DESCRIPTION" heading="h4" class="alert alert-success namespace_details" />
<!-- Head Field. Type: Editor. (joomla) --> <!-- Head Field. Type: Editor. (joomla) -->
@ -413,8 +428,18 @@
required="false" required="false"
validate="code" validate="code"
/> />
<!-- Autoload_composer_note Field. Type: Note. A None Database Field. (joomla) --> <!-- Approved_paths Field. Type: Superpowerpaths. (custom) -->
<field type="note" name="autoload_composer_note" label="COM_COMPONENTBUILDER_POWER_AUTOLOAD_COMPOSER_NOTE_LABEL" description="COM_COMPONENTBUILDER_POWER_AUTOLOAD_COMPOSER_NOTE_DESCRIPTION" heading="h4" class="alert alert-info autoload_composer_note" /> <field
type="superpowerpaths"
name="approved_paths"
label="COM_COMPONENTBUILDER_POWER_APPROVED_PATHS_LABEL"
description="COM_COMPONENTBUILDER_POWER_APPROVED_PATHS_DESCRIPTION"
required="false"
showon="approved:1">
<!-- Option Set. -->
<option value="joomla/super-powers">
COM_COMPONENTBUILDER_POWER_JOOMLASUPERPOWERS</option>
</field>
<!-- Use_selection Field. Type: Subform. (joomla) --> <!-- Use_selection Field. Type: Subform. (joomla) -->
<field <field
type="subform" type="subform"
@ -452,21 +477,8 @@
/> />
</form> </form>
</field> </field>
<!-- Add_licensing_template Field. Type: Radio. (joomla) --> <!-- Autoload_composer_note Field. Type: Note. A None Database Field. (joomla) -->
<field <field type="note" name="autoload_composer_note" label="COM_COMPONENTBUILDER_POWER_AUTOLOAD_COMPOSER_NOTE_LABEL" description="COM_COMPONENTBUILDER_POWER_AUTOLOAD_COMPOSER_NOTE_DESCRIPTION" heading="h4" class="alert alert-info autoload_composer_note" />
type="radio"
name="add_licensing_template"
label="COM_COMPONENTBUILDER_POWER_ADD_LICENSING_TEMPLATE_LABEL"
description="COM_COMPONENTBUILDER_POWER_ADD_LICENSING_TEMPLATE_DESCRIPTION"
class="btn-group btn-group-yesno"
default="1"
required="true">
<!-- Option Set. -->
<option value="1">
COM_COMPONENTBUILDER_POWER_USE_GLOBAL</option>
<option value="2">
COM_COMPONENTBUILDER_POWER_OVERRIDE</option>
</field>
<!-- Main_class_code Field. Type: Editor. (joomla) --> <!-- Main_class_code Field. Type: Editor. (joomla) -->
<field <field
type="editor" type="editor"
@ -483,6 +495,23 @@
filter="raw" filter="raw"
validate="code" validate="code"
/> />
<!-- Add_licensing_template Field. Type: Radio. (joomla) -->
<field
type="radio"
name="add_licensing_template"
label="COM_COMPONENTBUILDER_POWER_ADD_LICENSING_TEMPLATE_LABEL"
description="COM_COMPONENTBUILDER_POWER_ADD_LICENSING_TEMPLATE_DESCRIPTION"
class="btn-group btn-group-yesno"
default="1"
required="true">
<!-- Option Set. -->
<option value="1">
COM_COMPONENTBUILDER_POWER_USE_GLOBAL</option>
<option value="2">
COM_COMPONENTBUILDER_POWER_OVERRIDE</option>
</field>
<!-- Load_powers_note Field. Type: Note. A None Database Field. (joomla) -->
<field type="note" name="load_powers_note" label="COM_COMPONENTBUILDER_POWER_LOAD_POWERS_NOTE_LABEL" description="COM_COMPONENTBUILDER_POWER_LOAD_POWERS_NOTE_DESCRIPTION" heading="h4" class="alert alert-info load_powers_note" />
<!-- Guid Field. Type: Text. (joomla) --> <!-- Guid Field. Type: Text. (joomla) -->
<field <field
type="text" type="text"

View File

@ -1122,7 +1122,7 @@ class ComponentbuilderModelImport_joomla_components extends BaseDatabaseModel
return $data_; return $data_;
} }
$this->app->enqueueMessage(Text::_('COM_COMPONENTBUILDER_HTWOWE_COULD_NOT_OPEN_THE_ENCRYPT_DATAHTWO_THIS_COULD_BE_DUE_TO_THE_FOFENCRYPTION_THAT_IS_NO_LONGER_SUPPORTED_IN_JOOMLABR_PLEASE_EXPORT_YOUR_PACKAGES_WITH_JCB_VTHREEONEONENINE_OR_HIGHER_TO_BE_ABLE_TO_IMPORT_IT_INTO_THIS_VERSION_OF_JCB'), 'error'); $this->app->enqueueMessage(Text::_('COM_COMPONENTBUILDER_HTWOWE_COULD_NOT_OPEN_THE_ENCRYPT_DATAHTWO_THIS_COULD_BE_DUE_TO_THE_FOFENCRYPTION_THAT_IS_NO_LONGER_SUPPORTED_IN_JOOMLABR_PLEASE_EXPORT_YOUR_PACKAGES_WITH_JCB_VTHREEONEONEEIGHT_OR_HIGHER_TO_BE_ABLE_TO_IMPORT_IT_INTO_THIS_VERSION_OF_JCB'), 'error');
} }
else else
{ {

View File

@ -14,6 +14,8 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Componentbuilder\Utilities\FormHelper as JCBFormHelper;
use VDM\Joomla\Componentbuilder\Utilities\FilterHelper as JCBFilterHelper;
/** /**
* Language_translations List Model * Language_translations List Model
@ -55,7 +57,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
// Create the "extension" filter // Create the "extension" filter
$form->setField(new SimpleXMLElement( $form->setField(new SimpleXMLElement(
ComponentbuilderHelper::getExtensionGroupedListXml() JCBFilterHelper::extensions()
),'filter'); ),'filter');
$form->setValue( $form->setValue(
'extension', 'extension',
@ -75,7 +77,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
'' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_LANGUAGES_FOUND') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_LANGUAGES_FOUND') . ' -'
); );
// check if we have languages set // check if we have languages set
if (($languages = ComponentbuilderHelper::getAvailableLanguages()) !== false) if (($languages = JCBFilterHelper::languages()) !== null)
{ {
$options = array( $options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_TRANSLATED_IN') . ' -', '' => '- ' . JText::_('COM_COMPONENTBUILDER_TRANSLATED_IN') . ' -',
@ -85,7 +87,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
$options = array_merge($options, $languages); $options = array_merge($options, $languages);
} }
$form->setField(ComponentbuilderHelper::getFieldXML($attributes, $options),'filter'); $form->setField(JCBFormHelper::xml($attributes, $options),'filter');
$form->setValue( $form->setValue(
'translated', 'translated',
'filter', 'filter',
@ -114,7 +116,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
$options = array_merge($options, $languages); $options = array_merge($options, $languages);
} }
$form->setField(ComponentbuilderHelper::getFieldXML($attributes, $options),'filter'); $form->setField(JCBFormHelper::xml($attributes, $options),'filter');
$form->setValue( $form->setValue(
'not_translated', 'not_translated',
'filter', 'filter',
@ -300,7 +302,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
$filter_translated = $this->state->get("filter.translated"); $filter_translated = $this->state->get("filter.translated");
if ($filter_translated !== null && !empty($filter_translated)) if ($filter_translated !== null && !empty($filter_translated))
{ {
if (($ids = ComponentbuilderHelper::getTranslationIds($filter_translated)) !== false) if (($ids = JCBFilterHelper::translations($filter_translated)) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }
@ -315,7 +317,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
$filter_not_translated = $this->state->get("filter.not_translated"); $filter_not_translated = $this->state->get("filter.not_translated");
if ($filter_not_translated !== null && !empty($filter_not_translated)) if ($filter_not_translated !== null && !empty($filter_not_translated))
{ {
if (($ids = ComponentbuilderHelper::getTranslationIds($filter_not_translated, false)) !== false) if (($ids = JCBFilterHelper::translations($filter_not_translated, false)) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',',$ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',',$ids) . ')');
} }
@ -332,7 +334,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
{ {
// column name, and id // column name, and id
$type_extension = explode('__', $filter_extension); $type_extension = explode('__', $filter_extension);
if (($ids = ComponentbuilderHelper::getTranslationExtensionsIds($type_extension[1], $type_extension[0])) !== false) if (($ids = JCBFilterHelper::translation((int) $type_extension[1], $type_extension[0])) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }
@ -459,7 +461,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
$filter_translated = $this->state->get("filter.translated"); $filter_translated = $this->state->get("filter.translated");
if ($filter_translated !== null && !empty($filter_translated)) if ($filter_translated !== null && !empty($filter_translated))
{ {
if (($ids = ComponentbuilderHelper::getTranslationIds($filter_translated)) !== false) if (($ids = JCBFilterHelper::translations($filter_translated)) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }
@ -474,7 +476,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
$filter_not_translated = $this->state->get("filter.not_translated"); $filter_not_translated = $this->state->get("filter.not_translated");
if ($filter_not_translated !== null && !empty($filter_not_translated)) if ($filter_not_translated !== null && !empty($filter_not_translated))
{ {
if (($ids = ComponentbuilderHelper::getTranslationIds($filter_not_translated, false)) !== false) if (($ids = JCBFilterHelper::translations($filter_not_translated, false)) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',',$ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',',$ids) . ')');
} }
@ -491,7 +493,7 @@ class ComponentbuilderModelLanguage_translations extends ListModel
{ {
// column name, and id // column name, and id
$type_extension = explode('__', $filter_extension); $type_extension = explode('__', $filter_extension);
if (($ids = ComponentbuilderHelper::getTranslationExtensionsIds($type_extension[1], $type_extension[0])) !== false) if (($ids = JCBFilterHelper::translation((int) $type_extension[1], $type_extension[0])) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }

View File

@ -16,6 +16,9 @@ use Joomla\CMS\MVC\Model\AdminModel;
use Joomla\Registry\Registry; use Joomla\Registry\Registry;
use Joomla\String\StringHelper; use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Utilities\String\ClassfunctionHelper;
use VDM\Joomla\Utilities\StringHelper as UtilitiesStringHelper;
use VDM\Joomla\Utilities\GetHelper;
/** /**
* Componentbuilder Power Admin Model * Componentbuilder Power Admin Model
@ -65,6 +68,15 @@ class ComponentbuilderModelPower extends AdminModel
'licensing_template' 'licensing_template'
) )
), ),
'super_power' => array(
'left' => array(
'approved',
'approved_paths'
),
'right' => array(
'note_approved_paths'
)
),
'composer' => array( 'composer' => array(
'fullwidth' => array( 'fullwidth' => array(
'autoload_composer_note', 'autoload_composer_note',
@ -202,6 +214,14 @@ class ComponentbuilderModelPower extends AdminModel
$item->main_class_code = base64_decode($item->main_class_code); $item->main_class_code = base64_decode($item->main_class_code);
} }
if (!empty($item->method_selection))
{
// Convert the method_selection field to an array.
$method_selection = new Registry;
$method_selection->loadString($item->method_selection);
$item->method_selection = $method_selection->toArray();
}
if (!empty($item->load_selection)) if (!empty($item->load_selection))
{ {
// Convert the load_selection field to an array. // Convert the load_selection field to an array.
@ -234,14 +254,6 @@ class ComponentbuilderModelPower extends AdminModel
$item->implements = $implements->toArray(); $item->implements = $implements->toArray();
} }
if (!empty($item->method_selection))
{
// Convert the method_selection field to an array.
$method_selection = new Registry;
$method_selection->loadString($item->method_selection);
$item->method_selection = $method_selection->toArray();
}
if (!empty($item->use_selection)) if (!empty($item->use_selection))
{ {
// Convert the use_selection field to an array. // Convert the use_selection field to an array.
@ -250,6 +262,12 @@ class ComponentbuilderModelPower extends AdminModel
$item->use_selection = $use_selection->toArray(); $item->use_selection = $use_selection->toArray();
} }
if (!empty($item->approved_paths))
{
// JSON Decode approved_paths.
$item->approved_paths = json_decode($item->approved_paths);
}
if (empty($item->id)) if (empty($item->id))
{ {
@ -1003,24 +1021,30 @@ class ComponentbuilderModelPower extends AdminModel
$data['metadata'] = (string) $metadata; $data['metadata'] = (string) $metadata;
} }
// Set the empty approved_paths item to data
if (!isset($data['approved_paths']))
{
$data['approved_paths'] = '';
}
// check if the name has placeholder // check if the name has placeholder
if (strpos($data['name'], '[[[') === false && strpos($data['name'], '###') === false) if (strpos($data['name'], '[[[') === false && strpos($data['name'], '###') === false)
{ {
// make sure the name is safe to be used as a function name // make sure the name is safe to be used as a function name
$data['name'] = ComponentbuilderHelper::safeClassFunctionName($data['name']); $data['name'] = ClassfunctionHelper::safe($data['name']);
} }
// if system name is empty create from name // if system name is empty create from name
if (empty($data['system_name']) || !ComponentbuilderHelper::checkString($data['system_name'])) if (empty($data['system_name']) || !UtilitiesStringHelper::check($data['system_name']))
{ {
$data['system_name'] = $data['name']; $data['system_name'] = $data['name'];
} }
// must set the version if empty // must set the version if empty
if (empty($data['power_version']) && $data['id'] > 0 && ($power_version = ComponentbuilderHelper::getVar('power', $data['id'], 'id', 'power_version')) !== false) if (empty($data['power_version']) && $data['id'] > 0 && ($power_version = GetHelper::var('power', $data['id'], 'id', 'power_version')) !== false)
{ {
$data['power_version'] = $power_version; $data['power_version'] = $power_version;
} }
// we must preserve versions (so that a change to the version number must result in save as copy) // we must preserve versions (so that a change to the version number must result in save as copy)
elseif ($data['id'] > 0 && ($old_version = ComponentbuilderHelper::getVar('power', $data['id'], 'id', 'power_version')) && $data['power_version'] != $old_version) elseif ($data['id'] > 0 && ($old_version = GetHelper::var('power', $data['id'], 'id', 'power_version')) && $data['power_version'] != $old_version)
{ {
// lets check if we already have this version // lets check if we already have this version
if (($existing_id = ComponentbuilderHelper::checkExist('power', ['power_version' => $data['power_version'], 'name' => $data['name'], 'namespace' => $data['namespace']])) !== false) if (($existing_id = ComponentbuilderHelper::checkExist('power', ['power_version' => $data['power_version'], 'name' => $data['name'], 'namespace' => $data['namespace']])) !== false)
@ -1051,6 +1075,19 @@ class ComponentbuilderModelPower extends AdminModel
} }
// Set the method_selection items to data.
if (isset($data['method_selection']) && is_array($data['method_selection']))
{
$method_selection = new JRegistry;
$method_selection->loadArray($data['method_selection']);
$data['method_selection'] = (string) $method_selection;
}
elseif (!isset($data['method_selection']))
{
// Set the empty method_selection to data
$data['method_selection'] = '';
}
// Set the load_selection items to data. // Set the load_selection items to data.
if (isset($data['load_selection']) && is_array($data['load_selection'])) if (isset($data['load_selection']) && is_array($data['load_selection']))
{ {
@ -1103,19 +1140,6 @@ class ComponentbuilderModelPower extends AdminModel
$data['implements'] = ''; $data['implements'] = '';
} }
// Set the method_selection items to data.
if (isset($data['method_selection']) && is_array($data['method_selection']))
{
$method_selection = new JRegistry;
$method_selection->loadArray($data['method_selection']);
$data['method_selection'] = (string) $method_selection;
}
elseif (!isset($data['method_selection']))
{
// Set the empty method_selection to data
$data['method_selection'] = '';
}
// Set the use_selection items to data. // Set the use_selection items to data.
if (isset($data['use_selection']) && is_array($data['use_selection'])) if (isset($data['use_selection']) && is_array($data['use_selection']))
{ {
@ -1129,6 +1153,12 @@ class ComponentbuilderModelPower extends AdminModel
$data['use_selection'] = ''; $data['use_selection'] = '';
} }
// Set the approved_paths string to JSON string.
if (isset($data['approved_paths']))
{
$data['approved_paths'] = (string) json_encode($data['approved_paths']);
}
// Set the licensing_template string to base64 string. // Set the licensing_template string to base64 string.
if (isset($data['licensing_template'])) if (isset($data['licensing_template']))
{ {

View File

@ -14,6 +14,9 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Utilities\Component\Helper as JCBHelper;
use VDM\Joomla\Componentbuilder\Utilities\FilterHelper as JCBFilterHelper;
use VDM\Joomla\Componentbuilder\Utilities\FormHelper as JCBFormHelper;
/** /**
* Powers List Model * Powers List Model
@ -32,16 +35,123 @@ class ComponentbuilderModelPowers extends ListModel
'a.created_by','created_by', 'a.created_by','created_by',
'a.modified_by','modified_by', 'a.modified_by','modified_by',
'a.type','type', 'a.type','type',
'a.power_version','power_version', 'a.approved','approved',
'h.name','extends',
'a.system_name','system_name', 'a.system_name','system_name',
'a.namespace','namespace' 'a.namespace','namespace',
'a.power_version','power_version'
); );
} }
parent::__construct($config); parent::__construct($config);
} }
/**
* Get the filter form - Override the parent method
*
* @param array $data data
* @param boolean $loadData load current data
*
* @return \JForm|boolean The \JForm object or false on error
*
* @since JCB 2.12.5
*/
public function getFilterForm($data = array(), $loadData = true)
{
// load form from the parent class
$form = parent::getFilterForm($data, $loadData);
// Create the "admin_view" filter
$attributes = array(
'name' => 'namegroup',
'type' => 'list',
'onchange' => 'this.form.submit();',
);
$options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_NAMESPACE_FOUND') . ' -'
);
// check if we have namespace (and limit to an extension if it is set)
if (($namespaces = JCBFilterHelper::namespaces()) !== null)
{
$options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_A_NAMESPACE') . ' -'
);
// make sure we do not lose the key values in normal merge
$options = $options + $namespaces;
}
$form->setField(JCBFormHelper::xml($attributes, $options),'filter');
$form->setValue(
'namegroup',
'filter',
$this->state->get("filter.namegroup")
);
array_push($this->filter_fields, 'namegroup');
// get the component params
$params = JCBHelper::getParams();
$activate = $params->get('super_powers_repositories', 0);
if ($activate == 1)
{
$subform = $params->get('approved_paths', null);
// create approved paths filter
$attributes = array(
'name' => 'approved_paths',
'type' => 'list',
'onchange' => 'this.form.submit();',
);
$options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_PATHS_FOUND') . ' -'
);
// add the paths found in global settings
if (is_object($subform))
{
$core = $params->get('super_powers_core', 'joomla/super-powers');
$options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_APPROVED_PATH') . ' -',
$core => $core
);
foreach ($subform as $value)
{
if (isset($value->owner) && strlen($value->owner) > 1 &&
isset($value->repo) && strlen($value->repo) > 1)
{
$value = trim($value->owner) . '/' . trim($value->repo);
$options[$value] = $value;
}
}
}
$form->setField(JCBFormHelper::xml($attributes, $options), 'filter');
$form->setValue(
'approved_paths',
'filter',
$this->state->get("filter.approved_paths")
);
array_push($this->filter_fields, 'approved_paths');
}
return $form;
}
/**
* Check if a power can be used in linking
*
* @param string $type the type of power
*
* @return bool
* @since JCB 3.1.23
*/
protected function isSuperPower(string $type): bool
{
return in_array($type, ['class', 'abstract class', 'final class', 'trait']);
}
/** /**
* Method to auto-populate the model state. * Method to auto-populate the model state.
* *
@ -95,18 +205,11 @@ class ComponentbuilderModelPowers extends ListModel
$this->setState('filter.type', $type); $this->setState('filter.type', $type);
} }
$power_version = $this->getUserStateFromRequest($this->context . '.filter.power_version', 'filter_power_version'); $approved = $this->getUserStateFromRequest($this->context . '.filter.approved', 'filter_approved');
if ($formSubmited) if ($formSubmited)
{ {
$power_version = $app->input->post->get('power_version'); $approved = $app->input->post->get('approved');
$this->setState('filter.power_version', $power_version); $this->setState('filter.approved', $approved);
}
$extends = $this->getUserStateFromRequest($this->context . '.filter.extends', 'filter_extends');
if ($formSubmited)
{
$extends = $app->input->post->get('extends');
$this->setState('filter.extends', $extends);
} }
$system_name = $this->getUserStateFromRequest($this->context . '.filter.system_name', 'filter_system_name'); $system_name = $this->getUserStateFromRequest($this->context . '.filter.system_name', 'filter_system_name');
@ -123,6 +226,13 @@ class ComponentbuilderModelPowers extends ListModel
$this->setState('filter.namespace', $namespace); $this->setState('filter.namespace', $namespace);
} }
$power_version = $this->getUserStateFromRequest($this->context . '.filter.power_version', 'filter_power_version');
if ($formSubmited)
{
$power_version = $app->input->post->get('power_version');
$this->setState('filter.power_version', $power_version);
}
// List state information. // List state information.
parent::populateState($ordering, $direction); parent::populateState($ordering, $direction);
} }
@ -158,6 +268,11 @@ class ComponentbuilderModelPowers extends ListModel
continue; continue;
} }
// create the GUID placeholder key
if ($this->isSuperPower($item->type))
{
$item->super_power_key = 'Super_'.'_'.'_' . str_replace('-', '_', $item->guid) . '_'.'_'.'_Power';
}
// remove dots // remove dots
$item->namespace = str_replace('.','\\', $item->namespace); $item->namespace = str_replace('.','\\', $item->namespace);
} }
@ -170,6 +285,8 @@ class ComponentbuilderModelPowers extends ListModel
{ {
// convert type // convert type
$item->type = $this->selectionTranslation($item->type, 'type'); $item->type = $this->selectionTranslation($item->type, 'type');
// convert approved
$item->approved = $this->selectionTranslation($item->approved, 'approved');
} }
} }
@ -201,6 +318,19 @@ class ComponentbuilderModelPowers extends ListModel
return $typeArray[$value]; return $typeArray[$value];
} }
} }
// Array of approved language strings
if ($name === 'approved')
{
$approvedArray = array(
0 => 'COM_COMPONENTBUILDER_POWER_NOT_APPROVED',
1 => 'COM_COMPONENTBUILDER_POWER_APPROVED'
);
// Now check if value is found in this array
if (isset($approvedArray[$value]) && ComponentbuilderHelper::checkString($approvedArray[$value]))
{
return $approvedArray[$value];
}
}
return $value; return $value;
} }
@ -223,9 +353,43 @@ class ComponentbuilderModelPowers extends ListModel
// From the componentbuilder_item table // From the componentbuilder_item table
$query->from($db->quoteName('#__componentbuilder_power', 'a')); $query->from($db->quoteName('#__componentbuilder_power', 'a'));
// do not use these filters in the export method
if (!isset($_export) || !$_export)
{
// Filtering "namegroup"
$filter_namegroup = $this->state->get("filter.namegroup");
if ($filter_namegroup !== null && !empty($filter_namegroup))
{
if (($ids = JCBFilterHelper::namegroup($filter_namegroup)) !== null)
{
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
}
else
{
// there is none
$query->where($db->quoteName('a.id') . ' = ' . 0);
}
}
// Filtering "approved paths"
$filter_approved_paths = $this->state->get("filter.approved_paths");
if ($filter_approved_paths !== null && !empty($filter_approved_paths))
{
if (($ids = JCBFilterHelper::paths($filter_approved_paths)) !== null)
{
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
}
else
{
// there is none
$query->where($db->quoteName('a.id') . ' = ' . 0);
}
}
}
// From the componentbuilder_power table. // From the componentbuilder_power table.
$query->select($db->quoteName(['h.name','h.id'],['extends_name','extends_id'])); $query->select($db->quoteName(['g.name','g.id'],['extends_name','extends_id']));
$query->join('LEFT', $db->quoteName('#__componentbuilder_power', 'h') . ' ON (' . $db->quoteName('a.extends') . ' = ' . $db->quoteName('h.guid') . ')'); $query->join('LEFT', $db->quoteName('#__componentbuilder_power', 'g') . ' ON (' . $db->quoteName('a.extends') . ' = ' . $db->quoteName('g.guid') . ')');
// Filter by published state // Filter by published state
$published = $this->getState('filter.published'); $published = $this->getState('filter.published');
@ -271,7 +435,7 @@ class ComponentbuilderModelPowers extends ListModel
else else
{ {
$search = $db->quote('%' . $db->escape($search) . '%'); $search = $db->quote('%' . $db->escape($search) . '%');
$query->where('(a.system_name LIKE '.$search.' OR a.type LIKE '.$search.' OR a.description LIKE '.$search.' OR a.extends_custom LIKE '.$search.' OR a.extends LIKE '.$search.' OR a.guid LIKE '.$search.' OR a.name LIKE '.$search.')'); $query->where('(a.system_name LIKE '.$search.' OR a.type LIKE '.$search.' OR a.description LIKE '.$search.' OR a.extends LIKE '.$search.' OR a.extends_custom LIKE '.$search.' OR a.approved_paths LIKE '.$search.' OR a.guid LIKE '.$search.' OR a.name LIKE '.$search.')');
} }
} }
@ -315,39 +479,22 @@ class ComponentbuilderModelPowers extends ListModel
// Filter by the Type Array. // Filter by the Type Array.
$query->where('a.type IN (' . implode(',', $_type) . ')'); $query->where('a.type IN (' . implode(',', $_type) . ')');
} }
// Filter by Power_version. // Filter by Approved.
$_power_version = $this->getState('filter.power_version'); $_approved = $this->getState('filter.approved');
if (is_numeric($_power_version)) if (is_numeric($_approved))
{ {
if (is_float($_power_version)) if (is_float($_approved))
{ {
$query->where('a.power_version = ' . (float) $_power_version); $query->where('a.approved = ' . (float) $_approved);
} }
else else
{ {
$query->where('a.power_version = ' . (int) $_power_version); $query->where('a.approved = ' . (int) $_approved);
} }
} }
elseif (ComponentbuilderHelper::checkString($_power_version)) elseif (ComponentbuilderHelper::checkString($_approved))
{ {
$query->where('a.power_version = ' . $db->quote($db->escape($_power_version))); $query->where('a.approved = ' . $db->quote($db->escape($_approved)));
}
// Filter by Extends.
$_extends = $this->getState('filter.extends');
if (is_numeric($_extends))
{
if (is_float($_extends))
{
$query->where('a.extends = ' . (float) $_extends);
}
else
{
$query->where('a.extends = ' . (int) $_extends);
}
}
elseif (ComponentbuilderHelper::checkString($_extends))
{
$query->where('a.extends = ' . $db->quote($db->escape($_extends)));
} }
// Add the list ordering clause. // Add the list ordering clause.
@ -400,10 +547,10 @@ class ComponentbuilderModelPowers extends ListModel
{ {
$id .= ':' . $_type; $id .= ':' . $_type;
} }
$id .= ':' . $this->getState('filter.power_version'); $id .= ':' . $this->getState('filter.approved');
$id .= ':' . $this->getState('filter.extends');
$id .= ':' . $this->getState('filter.system_name'); $id .= ':' . $this->getState('filter.system_name');
$id .= ':' . $this->getState('filter.namespace'); $id .= ':' . $this->getState('filter.namespace');
$id .= ':' . $this->getState('filter.power_version');
return parent::getStoreId($id); return parent::getStoreId($id);
} }

View File

@ -14,6 +14,8 @@ defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\MVC\Model\ListModel; use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Utilities\ArrayHelper; use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Componentbuilder\Utilities\FormHelper as JCBFormHelper;
use VDM\Joomla\Componentbuilder\Utilities\FilterHelper as JCBFilterHelper;
/** /**
* Site_views List Model * Site_views List Model
@ -69,7 +71,7 @@ class ComponentbuilderModelSite_views extends ListModel
'' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_COMPONENTS_FOUND') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_NO_COMPONENTS_FOUND') . ' -'
); );
// check if we have joomla components // check if we have joomla components
if (($joomla_components = ComponentbuilderHelper::getByTypeTheIdsSystemNames('joomla_component')) !== false) if (($joomla_components = JCBFilterHelper::names('joomla_component')) !== null)
{ {
$options = array( $options = array(
'' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_COMPONENT') . ' -' '' => '- ' . JText::_('COM_COMPONENTBUILDER_SELECT_COMPONENT') . ' -'
@ -78,7 +80,7 @@ class ComponentbuilderModelSite_views extends ListModel
$options = $options + $joomla_components; $options = $options + $joomla_components;
} }
$form->setField(ComponentbuilderHelper::getFieldXML($attributes, $options),'filter'); $form->setField(JCBFormHelper::xml($attributes, $options),'filter');
$form->setValue( $form->setValue(
'joomla_component', 'joomla_component',
'filter', 'filter',
@ -301,7 +303,7 @@ class ComponentbuilderModelSite_views extends ListModel
$filter_joomla_component = $this->state->get("filter.joomla_component"); $filter_joomla_component = $this->state->get("filter.joomla_component");
if ($filter_joomla_component !== null && !empty($filter_joomla_component)) if ($filter_joomla_component !== null && !empty($filter_joomla_component))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_joomla_component, 'joomla_component_site_views')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_joomla_component, 'joomla_component_site_views')) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }
@ -506,7 +508,7 @@ class ComponentbuilderModelSite_views extends ListModel
$filter_joomla_component = $this->state->get("filter.joomla_component"); $filter_joomla_component = $this->state->get("filter.joomla_component");
if ($filter_joomla_component !== null && !empty($filter_joomla_component)) if ($filter_joomla_component !== null && !empty($filter_joomla_component))
{ {
if (($ids = ComponentbuilderHelper::getAreaLinkedIDs($filter_joomla_component, 'joomla_component_site_views')) !== false) if (($ids = JCBFilterHelper::linked((int) $filter_joomla_component, 'joomla_component_site_views')) !== null)
{ {
$query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')'); $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $ids) . ')');
} }

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,2 @@
ALTER TABLE `#__componentbuilder_power` ADD `approved` TINYINT(1) NOT NULL DEFAULT 0 AFTER `add_licensing_template`;
ALTER TABLE `#__componentbuilder_power` ADD `approved_paths` TEXT NOT NULL AFTER `approved`;

View File

@ -11,6 +11,7 @@
// No direct access to this file // No direct access to this file
defined('_JEXEC') or die('Restricted access'); defined('_JEXEC') or die('Restricted access');
use VDM\Joomla\Utilities\StringHelper;
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html'); JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.formvalidator'); JHtml::_('behavior.formvalidator');
@ -125,7 +126,7 @@ jQuery('<div id="compiling"></div>')
<?php else : ?> <?php else : ?>
<div id="j-main-container"> <div id="j-main-container">
<?php endif; ?> <?php endif; ?>
<?php if (ComponentbuilderHelper::checkString($this->SuccessMessage)): ?> <?php if (StringHelper::check($this->SuccessMessage)): ?>
<div class="alert alert-success"> <div class="alert alert-success">
<button type="button" class="close" data-dismiss="alert">×</button> <button type="button" class="close" data-dismiss="alert">×</button>
<?php echo $this->SuccessMessage; ?> <?php echo $this->SuccessMessage; ?>

View File

@ -356,6 +356,45 @@ class ComponentbuilderViewCompiler extends HtmlView
$form->setField($xml, null, true, 'advanced'); $form->setField($xml, null, true, 'advanced');
} }
// powers repository attributes
$attributes = [
'type' => 'radio',
'name' => 'powers_repository',
'label' => 'COM_COMPONENTBUILDER_ACTIVATE_SUPER_POWERS',
'class' => 'btn-group btn-group-yesno',
'description' => 'COM_COMPONENTBUILDER_THIS_ADDS_POWERS_TO_A_LOCAL_REPOSITORY_FOLDER_ALL_BAPPROVEDB_POWERS_LINKED_TO_THIS_COMPONENT_WILL_BE_MOVED_TO_YOUR_BLOCALB_POWERS_REPOSITORY_FOLDER_INTO_THEIR_SELECTIVE_TARGET_PATHS_THIS_LOCAL_FOLDER_PATH_MUST_BE_SET_IN_THE_GLOBAL_OPTIONS_OF_JCB_UNDER_THE_BSUPER_POWERB_TAB',
'default' => '2',
'showon' => 'show_advanced_options:1'];
// start the repository options
$options = [
'2' => 'COM_COMPONENTBUILDER_GLOBAL',
'1' => 'COM_COMPONENTBUILDER_YES',
'0' => 'COM_COMPONENTBUILDER_NO'];
// add to form
$xml = ComponentbuilderHelper::getFieldXML($attributes, $options);
if ($xml instanceof SimpleXMLElement)
{
$form->setField($xml, null, true, 'advanced');
}
// powers local path to repositories attributes
$attributes = [
'type' => 'text',
'name' => 'local_powers_repository_path',
'label' => 'COM_COMPONENTBUILDER_LOCAL_POWERS_REPOSITORY_PATH',
'class' => 'btn-group btn-group-yesno',
'description' => 'COM_COMPONENTBUILDER_HERE_YOU_CAN_SET_THE_PATH_TO_THE_SUPER_POWERS_LOCAL_REPOSITORY_FOLDER_WHERE_BLAYERCOREB_AND_ALL_TARGETED_BLAYEROWNB_SUB_PATHS_WILL_BE_PLACED_WITH_THEIR_SELECTIVE_BSWITCHAPPROVEDB_POWERS',
'default' => $this->params->get('local_powers_repository_path', ''),
'showon' => 'show_advanced_options:1[AND]powers_repository:1'];
// add to form
$xml = ComponentbuilderHelper::getFieldXML($attributes);
if ($xml instanceof SimpleXMLElement)
{
$form->setField($xml, null, true, 'advanced');
}
// Indentation attributes // Indentation attributes
$attributes = [ $attributes = [
'type' => 'radio', 'type' => 'radio',

View File

@ -64,6 +64,17 @@ $componentParams = $this->params; // will be removed just use $this->params inst
</div> </div>
<?php echo JHtml::_('bootstrap.endTab'); ?> <?php echo JHtml::_('bootstrap.endTab'); ?>
<?php echo JHtml::_('bootstrap.addTab', 'powerTab', 'super_power', JText::_('COM_COMPONENTBUILDER_POWER_SUPER_POWER', true)); ?>
<div class="row-fluid form-horizontal-desktop">
<div class="span6">
<?php echo JLayoutHelper::render('power.super_power_left', $this); ?>
</div>
<div class="span6">
<?php echo JLayoutHelper::render('power.super_power_right', $this); ?>
</div>
</div>
<?php echo JHtml::_('bootstrap.endTab'); ?>
<?php echo JHtml::_('bootstrap.addTab', 'powerTab', 'composer', JText::_('COM_COMPONENTBUILDER_POWER_COMPOSER', true)); ?> <?php echo JHtml::_('bootstrap.addTab', 'powerTab', 'composer', JText::_('COM_COMPONENTBUILDER_POWER_COMPOSER', true)); ?>
<div class="row-fluid form-horizontal-desktop"> <div class="row-fluid form-horizontal-desktop">
</div> </div>

View File

@ -146,6 +146,16 @@ class ComponentbuilderViewPower extends HtmlView
{ {
JToolBarHelper::custom('power.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); JToolBarHelper::custom('power.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false);
} }
if ($this->canDo->get('power.sync'))
{
// add Sync button.
JToolBarHelper::custom('power.syncPowers', 'loop custom-button-syncpowers', '', 'COM_COMPONENTBUILDER_SYNC', false);
}
if ($this->canDo->get('power.reset'))
{
// add Reset button.
JToolBarHelper::custom('power.resetPowers', 'joomla custom-button-resetpowers', '', 'COM_COMPONENTBUILDER_RESET', false);
}
JToolBarHelper::cancel('power.cancel', 'JTOOLBAR_CLOSE'); JToolBarHelper::cancel('power.cancel', 'JTOOLBAR_CLOSE');
} }
} }

View File

@ -67,7 +67,7 @@ $edit = "index.php?option=com_componentbuilder&view=powers&task=power.edit";
<?php else: ?> <?php else: ?>
<?php echo $this->escape($item->system_name); ?> <?php echo $this->escape($item->system_name); ?>
<?php endif; ?><br /><small>GUID: <?php endif; ?><br /><small>GUID:
<?php echo $this->escape($item->guid); ?></small> <?php echo $this->escape($item->guid); ?><?php if(isset($item->super_power_key)): ?><br />SPK: <?php echo $item->super_power_key; ?><?php endif; ?></small>
</div> </div>
</td> </td>
<td class="hidden-phone"> <td class="hidden-phone">
@ -81,7 +81,8 @@ $edit = "index.php?option=com_componentbuilder&view=powers&task=power.edit";
<?php else: ?> <?php else: ?>
<?php echo $this->escape($item->extends_name); ?> <?php echo $this->escape($item->extends_name); ?>
<?php endif; ?><?php elseif ($item->extends === '-1') : ?><br /><?php echo JText::_('COM_COMPONENTBUILDER_EXTENDS'); ?>: <?php endif; ?><?php elseif ($item->extends === '-1') : ?><br /><?php echo JText::_('COM_COMPONENTBUILDER_EXTENDS'); ?>:
<?php echo $this->escape($item->extends_custom); ?><?php endif; ?> <?php echo $this->escape($item->extends_custom); ?><?php endif; ?><br /><?php echo JText::_('COM_COMPONENTBUILDER_SUPER_POWER'); ?>:
<?php echo JText::_($item->approved); ?>
</div> </div>
</td> </td>
<td class="hidden-phone"> <td class="hidden-phone">

View File

@ -141,6 +141,21 @@ class ComponentbuilderViewPowers extends HtmlView
// add Run Expansion button. // add Run Expansion button.
JToolBarHelper::custom('powers.runExpansion', 'expand-2 custom-button-runexpansion', '', 'COM_COMPONENTBUILDER_RUN_EXPANSION', false); JToolBarHelper::custom('powers.runExpansion', 'expand-2 custom-button-runexpansion', '', 'COM_COMPONENTBUILDER_RUN_EXPANSION', false);
} }
if ($this->user->authorise('power.init', 'com_componentbuilder'))
{
// add Init button.
JToolBarHelper::custom('powers.initPowers', 'health custom-button-initpowers', '', 'COM_COMPONENTBUILDER_INIT', false);
}
if ($this->user->authorise('power.sync', 'com_componentbuilder'))
{
// add Sync button.
JToolBarHelper::custom('powers.syncPowers', 'loop custom-button-syncpowers', '', 'COM_COMPONENTBUILDER_SYNC', false);
}
if ($this->user->authorise('power.reset', 'com_componentbuilder'))
{
// add Reset button.
JToolBarHelper::custom('powers.resetPowers', 'joomla custom-button-resetpowers', '', 'COM_COMPONENTBUILDER_RESET', false);
}
// set help url for this view if found // set help url for this view if found
$this->help_url = ComponentbuilderHelper::getHelpUrl('powers'); $this->help_url = ComponentbuilderHelper::getHelpUrl('powers');
@ -195,43 +210,23 @@ class ComponentbuilderViewPowers extends HtmlView
); );
} }
// Only load Power Version batch if create, edit, and batch is allowed // Only load Approved batch if create, edit, and batch is allowed
if ($this->canBatch && $this->canCreate && $this->canEdit) if ($this->canBatch && $this->canCreate && $this->canEdit)
{ {
// Set Power Version Selection // Set Approved Selection
$this->power_versionOptions = JFormHelper::loadFieldType('powersfilterpowerversion')->options; $this->approvedOptions = JFormHelper::loadFieldType('powersfilterapproved')->options;
// We do some sanitation for Power Version filter // We do some sanitation for Approved filter
if (ComponentbuilderHelper::checkArray($this->power_versionOptions) && if (ComponentbuilderHelper::checkArray($this->approvedOptions) &&
isset($this->power_versionOptions[0]->value) && isset($this->approvedOptions[0]->value) &&
!ComponentbuilderHelper::checkString($this->power_versionOptions[0]->value)) !ComponentbuilderHelper::checkString($this->approvedOptions[0]->value))
{ {
unset($this->power_versionOptions[0]); unset($this->approvedOptions[0]);
} }
// Power Version Batch Selection // Approved Batch Selection
JHtmlBatch_::addListSelection( JHtmlBatch_::addListSelection(
'- Keep Original '.JText::_('COM_COMPONENTBUILDER_POWER_POWER_VERSION_LABEL').' -', '- Keep Original '.JText::_('COM_COMPONENTBUILDER_POWER_APPROVED_LABEL').' -',
'batch[power_version]', 'batch[approved]',
JHtml::_('select.options', $this->power_versionOptions, 'value', 'text') JHtml::_('select.options', $this->approvedOptions, 'value', 'text')
);
}
// Only load Extends Name batch if create, edit, and batch is allowed
if ($this->canBatch && $this->canCreate && $this->canEdit)
{
// Set Extends Name Selection
$this->extendsNameOptions = JFormHelper::loadFieldType('Classpowers')->options;
// We do some sanitation for Extends Name filter
if (ComponentbuilderHelper::checkArray($this->extendsNameOptions) &&
isset($this->extendsNameOptions[0]->value) &&
!ComponentbuilderHelper::checkString($this->extendsNameOptions[0]->value))
{
unset($this->extendsNameOptions[0]);
}
// Extends Name Batch Selection
JHtmlBatch_::addListSelection(
'- Keep Original '.JText::_('COM_COMPONENTBUILDER_POWER_EXTENDS_LABEL').' -',
'batch[extends]',
JHtml::_('select.options', $this->extendsNameOptions, 'value', 'text')
); );
} }
} }

View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="4" method="upgrade"> <extension type="component" version="4" method="upgrade">
<name>COM_COMPONENTBUILDER</name> <name>COM_COMPONENTBUILDER</name>
<creationDate>27th February, 2023</creationDate> <creationDate>2nd May, 2023</creationDate>
<author>Llewellyn van der Merwe</author> <author>Llewellyn van der Merwe</author>
<authorEmail>joomla@vdm.io</authorEmail> <authorEmail>joomla@vdm.io</authorEmail>
<authorUrl>https://dev.vdm.io</authorUrl> <authorUrl>https://dev.vdm.io</authorUrl>
<copyright>Copyright (C) 2015 Vast Development Method. All rights reserved.</copyright> <copyright>Copyright (C) 2015 Vast Development Method. All rights reserved.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license> <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<version>3.1.19</version> <version>3.1.24</version>
<description><![CDATA[ <description><![CDATA[
<h1>Component Builder (v.3.1.19)</h1> <h1>Component Builder (v.3.1.24)</h1>
<div style="clear: both;"></div> <div style="clear: both;"></div>
<p>The Component Builder for [Joomla](https://extensions.joomla.org/extension/component-builder/) is highly advanced tool that is truly able to build extremely complex components in a fraction of the time. <p>The Component Builder for [Joomla](https://extensions.joomla.org/extension/component-builder/) is highly advanced tool that is truly able to build extremely complex components in a fraction of the time.

View File

@ -1127,4 +1127,40 @@
<maintainerurl>https://dev.vdm.io</maintainerurl> <maintainerurl>https://dev.vdm.io</maintainerurl>
<targetplatform name="joomla" version="3.*"/> <targetplatform name="joomla" version="3.*"/>
</update> </update>
<update>
<name>Component Builder</name>
<description>Builds Complex Joomla Components</description>
<element>pkg_component_builder</element>
<type>package</type>
<client>site</client>
<version>3.1.21</version>
<infourl title="Component Builder!">https://dev.vdm.io</infourl>
<downloads>
<downloadurl type="full" format="zip">https://git.vdm.dev/api/v1/repos/joomla-beta/pkg-component-builder/archive/v3.1.22.zip</downloadurl>
</downloads>
<tags>
<tag>beta</tag>
</tags>
<maintainer>Llewellyn van der Merwe</maintainer>
<maintainerurl>https://dev.vdm.io</maintainerurl>
<targetplatform name="joomla" version="3.*"/>
</update>
<update>
<name>Component Builder</name>
<description>Builds Complex Joomla Components</description>
<element>pkg_component_builder</element>
<type>package</type>
<client>site</client>
<version>3.1.24</version>
<infourl title="Component Builder!">https://dev.vdm.io</infourl>
<downloads>
<downloadurl type="full" format="zip">https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v3.1.24.zip</downloadurl>
</downloads>
<tags>
<tag>stable</tag>
</tags>
<maintainer>Llewellyn van der Merwe</maintainer>
<maintainerurl>https://dev.vdm.io</maintainerurl>
<targetplatform name="joomla" version="3.*"/>
</update>
</updates> </updates>

View File

@ -1,164 +0,0 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 3rd September, 2020
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Gitea;
use Joomla\CMS\Http\Http as BaseHttp;
use Joomla\CMS\Http\HttpFactory;
use Joomla\CMS\Http\Response;
use Joomla\Registry\Registry;
use Joomla\Uri\Uri;
use VDM\Joomla\Utilities\JsonHelper;
abstract class AbstractGiteaObject
{
/**
* Options for the Gitea object.
*
* @var Registry
* @since 1.0
*/
protected $options;
/**
* The HTTP client object to use in sending HTTP requests.
*
* @var BaseHttp
* @since 1.0
*/
protected $client;
/**
* The package the object resides in
*
* @var string
* @since 1.0
*/
protected $package = '';
/**
* Constructor.
*
* @param Registry $options Gitea options object.
* @param BaseHttp $client The HTTP client object.
*
* @since 1.0
*/
public function __construct(Registry $options = null, BaseHttp $client = null)
{
$this->options = $options ?: new Registry;
$this->client = $client ?: (new HttpFactory)->getHttp($this->options);
$this->package = static::class;
$this->package = substr($this->package, strrpos($this->package, '\\') + 1);
}
/**
* Method to build and return a full request URL for the request. This method will
* add appropriate pagination details if necessary and also prepend the API url
* to have a complete URL for the request.
*
* @param string $path URL to inflect
* @param integer $page Page to request
* @param integer $limit Number of results to return per page
*
* @return Uri
*
* @since 1.0
*/
protected function fetchUrl($path, $page = 0, $limit = 0)
{
// Get a new Uri object focusing the api url and given path.
$uri = new Uri($this->options->get('api.url') . $path);
if ($this->options->get('access.token', false))
{
// Use oAuth authentication
$headers = $this->client->getOption('headers', []);
if (!isset($headers['Authorization']))
{
$headers['Authorization'] = 'token ' . $this->options->get('access.token');
$this->client->setOption('headers', $headers);
}
}
else
{
// Use basic authentication
if ($this->options->get('api.username', false))
{
$uri->setUser($this->options->get('api.username'));
}
if ($this->options->get('api.password', false))
{
$uri->setPass($this->options->get('api.password'));
}
}
// If we have a defined page number add it to the JUri object.
if ($page > 0)
{
$uri->setVar('page', (int) $page);
}
// If we have a defined items per page add it to the JUri object.
if ($limit > 0)
{
$uri->setVar('limit', (int) $limit);
}
return $uri;
}
/**
* Process the response and decode it.
*
* @param Response $response The response.
* @param integer $expectedCode The expected "good" code.
*
* @return mixed
*
* @since 1.0
* @throws RuntimeException
*/
protected function processResponse(Response $response, $expectedCode = 200)
{
// Validate the response code.
if ($response->code != $expectedCode)
{
// Decode the error response and throw an exception.
$error = json_decode((string) $response->body);
$message = isset($error->message) ? $error->message : 'Invalid response received from Gitea.';
throw new \DomainException($message, $response->code);
}
if (JsonHelper::check($response->body))
{
$body = json_decode((string) $response->body);
if (isset($body->content_base64))
{
$body->content = base64_decode((string) $body->content_base64);
}
}
else
{
$body = $response->body;
}
return $body;
}
}

View File

@ -1,70 +0,0 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 3rd September, 2020
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Gitea;
use Joomla\CMS\Http\Http as BaseHttp;
use Joomla\Registry\Registry;
use VDM\Gitea\AbstractGiteaObject;
abstract class AbstractPackage extends AbstractGiteaObject
{
/**
* Constructor.
*
* @param Registry $options Gitea options object.
* @param Http $client The HTTP client object.
*
* @since 1.0
*/
public function __construct(Registry $options = null, BaseHttp $client = null)
{
parent::__construct($options, $client);
$this->package = static::class;
$this->package = substr($this->package, strrpos($this->package, '\\') + 1);
}
/**
* Magic method to lazily create API objects
*
* @param string $name Name of property to retrieve
*
* @since 1.0
* @throws \InvalidArgumentException
*
* @return AbstractPackage Gitea API package object.
*/
public function __get($name)
{
$class = '\\VDM\\Gitea\\Package\\' . $this->package . '\\' . ucfirst($name);
if (class_exists($class) == false)
{
throw new \InvalidArgumentException(
sprintf(
'Argument %1$s produced an invalid class name: %2$s in package %3$s',
$name, $class, $this->package
)
);
}
if (isset($this->$name) == false)
{
$this->$name = new $class($this->options, $this->client);
}
return $this->$name;
}
}

View File

@ -1,123 +0,0 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 3rd September, 2020
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Gitea;
use Joomla\CMS\Http\Http as BaseHttp;
use Joomla\CMS\Http\HttpFactory;
use Joomla\Registry\Registry;
class Gitea
{
/**
* Options for the Gitea object.
*
* @var array
* @since 1.0
*/
protected $options;
/**
* The HTTP client object to use in sending HTTP requests.
*
* @var BaseHttp
* @since 1.0
*/
protected $client;
/**
* Constructor.
*
* @param Registry $options Gitea options object.
* @param Http $client The HTTP client object.
*
* @since 1.0
*/
public function __construct(Registry $options = null, BaseHttp $client = null)
{
$this->options = $options ?: new Registry;
// Setup the default user agent if not already set.
if (!$this->getOption('userAgent'))
{
$this->setOption('userAgent', 'JGitea/1.0');
}
// Setup the default API url if not already set.
if (!$this->getOption('api.url'))
{
$this->setOption('api.url', 'https://git.vdm.dev/api/v1');
}
$this->client = $client ?: (new HttpFactory)->getHttp($this->options);
}
/**
* Magic method to lazily create API objects
*
* @param string $name Name of property to retrieve
*
* @return AbstractGiteaObject Gitea API object (issues, pulls, etc).
*
* @since 1.0
* @throws \InvalidArgumentException If $name is not a valid sub class.
*/
public function __get($name)
{
$class = '\\VDM\\Gitea\\Package\\' . ucfirst($name);
if (class_exists($class))
{
if (isset($this->$name) == false)
{
$this->$name = new $class($this->options, $this->client);
}
return $this->$name;
}
throw new \InvalidArgumentException(sprintf('Argument %s produced an invalid class name: %s', $name, $class));
}
/**
* Get an option from the Gitea instance.
*
* @param string $key The name of the option to get.
*
* @return mixed The option value.
*
* @since 1.0
*/
public function getOption($key)
{
return isset($this->options[$key]) ? $this->options[$key] : null;
}
/**
* Set an option for the Gitea instance.
*
* @param string $key The name of the option to set.
* @param mixed $value The option value to set.
*
* @return Gitea This object for method chaining.
*
* @since 1.0
*/
public function setOption($key, $value)
{
$this->options[$key] = $value;
return $this;
}
}

View File

@ -1,266 +0,0 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 30th April, 2015
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Gitea\Package;
use Joomla\CMS\Http\Http;
use Joomla\Registry\Registry;
use VDM\Gitea\AbstractPackage;
class Repo extends AbstractPackage
{
/**
* List your repositories.
*
* List repositories for the authenticated user.
*
* @return object
*
* @since 1.0
*/
public function getListOwn()
{
// Build the request path.
$uri = $this->fetchUrl('/user/repos');
// Send the request.
return $this->processResponse($this->client->get($uri));
}
/**
* List user repositories.
*
* List public repositories for the specified user.
*
* @param string $user The user name.
*
* @return object
*
* @since 1.0
*/
public function getListUser($user)
{
// Build the request path.
$uri = $this->fetchUrl('/users/' . $user . '/repos');
// Send the request.
return $this->processResponse($this->client->get($uri));
}
/**
* List organization repositories.
*
* List repositories for the specified org.
*
* @param string $org The name of the organization.
*
* @return object
*
* @since 1.0
*/
public function getListOrg($org)
{
// Build the request path.
$uri = $this->fetchUrl('/orgs/' . $org . '/repos');
// Send the request.
return $this->processResponse($this->client->get($uri));
}
/**
* Create.
*
* Create a new repository for the authenticated user or an organization. OAuth users must supply repo scope.
*
* @param string $name The repository name.
* @param string $org The organization name (if needed).
* @param string $description The repository description.
* @param string $readme Readme of the repository to create.
* @param boolean $private Set true to create a private repository, false to create a public one.
* @param string $defaultBranch DefaultBranch of the repository (used when initializes and in template).
* @param string $license License to use.
* @param boolean $autoInit Whether the repository should auto init.
* @param boolean $template Whether the repository is template.
* @param string $gitignores Gitignores to use.
* options: [ Joomla, JetBrains ] and much more...
* @param string $issueLabels Label-Set to use.
* @param string $trustModel TrustModel of the repository.
* options: [ default, collaborator, committer, collaboratorcommitter ]
*
* @return object
*
* @since 1.0
*/
public function create($name, $org = '', $description = '', $readme = 'Default', $private = false, $defaultBranch = 'master',
$license = 'GPL-2.0-or-later', $autoInit = true, $template = false, $trustModel = 'default', $gitignores = '', $issueLabels = ''
)
{
$path = ($org)
// Create a repository for an organization
? '/orgs/' . $org . '/repos'
// Create a repository for a user
: '/user/repos';
$data = [
'name' => $name,
'description' => $description,
'readme' => $readme,
'private' => $private,
'auto_init' => $autoInit,
'default_branch' => $defaultBranch,
'issue_labels' => $issueLabels,
'license' => $license,
'template' => $template,
'gitignores' => $gitignores,
'trust_model' => $trustModel
];
// Send the request.
return $this->processResponse(
$this->client->post($this->fetchUrl($path), json_encode($data)),
201
);
}
/**
* Get.
*
* @param string $owner Repository owner.
* @param string $repo Repository name.
*
* @return object
*
* @since 1.0
*/
public function get($owner, $repo)
{
// Build the request path.
$path = '/repos/' . $owner . '/' . $repo;
// Send the request.
return $this->processResponse(
$this->client->get($this->fetchUrl($path))
);
}
/**
* List contributors.
*
* @param string $owner Repository owner.
* @param string $repo Repository name.
*
* @return object
*
* @since 1.0
*/
public function getListContributors($owner, $repo)
{
// Build the request path.
$uri = $this->fetchUrl('/repos/' . $owner . '/' . $repo . '/contributors');
// Send the request.
return $this->processResponse($this->client->get($uri));
}
/**
* List languages.
*
* List languages for the specified repository. The value on the right of a language is the number of bytes of code
* written in that language.
*
* @param string $owner Repository owner.
* @param string $repo Repository name.
*
* @return object
*
* @since 1.0
*/
public function getListLanguages($owner, $repo)
{
// Build the request path.
$path = '/repos/' . $owner . '/' . $repo . '/languages';
// Send the request.
return $this->processResponse(
$this->client->get($this->fetchUrl($path))
);
}
/**
* List Teams
*
* @param string $owner Repository owner.
* @param string $repo Repository name.
*
* @return object
*
* @since 1.0
*/
public function getListTeams($owner, $repo)
{
// Build the request path.
$path = '/repos/' . $owner . '/' . $repo . '/teams';
// Send the request.
return $this->processResponse(
$this->client->get($this->fetchUrl($path))
);
}
/**
* List Tags.
*
* @param string $owner Repository owner.
* @param string $repo Repository name.
* @param integer $page Page to request
* @param integer $limit Number of results to return per page
*
* @return object
*
* @since 1.0
*/
public function getListTags($owner, $repo, $page = 0, $limit = 0)
{
// Build the request path.
$path = '/repos/' . $owner . '/' . $repo . '/tags';
// Send the request.
return $this->processResponse(
$this->client->get($this->fetchUrl($path, $page, $limit))
);
}
/**
* Delete a Repository.
*
* Deleting a repository requires admin access. If OAuth is used, the delete_repo scope is required.
*
* @param string $owner Repository owner.
* @param string $repo Repository name.
*
* @return object
*
* @since 1.0
*/
public function delete($owner, $repo)
{
// Build the request path.
$path = '/repos/' . $owner . '/' . $repo;
// Send the request.
return $this->processResponse(
$this->client->delete($this->fetchUrl($path))
);
}
}

View File

@ -1,49 +0,0 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 3rd September, 2020
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Gitea\Package\Repo;
use Joomla\CMS\Http\Http;
use Joomla\Registry\Registry;
use VDM\Gitea\AbstractPackage;
/**
* Start looking here:
* https://git.vdm.dev/api/swagger#/repository/repoGetContents
*/
class File extends AbstractPackage
{
/**
* Gets the metadata and contents (if a file) of an entry in a repository, or a list of entries if a dir
*
* @param string $owner Repository owner.
* @param string $repo Repository name.
* @param string $filepath Repository file path.
*
* @return object
*
* @since 1.0
*/
public function get($owner, $repo, $filepath)
{
// Build the request path.
$path = '/repos/' . $owner . '/' . $repo . '/contents/' . $filepath;
// Send the request.
return $this->processResponse(
$this->client->get($this->fetchUrl($path))
);
}
}

View File

@ -1,93 +0,0 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 3rd September, 2020
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Gitea\Package\Repo;
use Joomla\CMS\Http\Http;
use Joomla\Registry\Registry;
use VDM\Gitea\AbstractPackage;
/**
* Start looking here:
* https://git.vdm.dev/api/swagger#/repository/repoCreateWikiPage
*/
class Wiki extends AbstractPackage
{
/**
* Get a repository wiki page
*
* @param string $owner The repository owner
* @param string $repo The repository name
* @param string $pageName The page name
*
* @return object
*
* @since 1.0
*/
public function get(string $owner, string $repo, string $pageName)
{
// Build the request path.
$path = '/repos/' . $owner . '/' . $repo . '/wiki/page/' . $pageName;
// Send the request.
return $this->processResponse(
$this->client->get($this->fetchUrl($path))
);
}
/**
* Get a repository wiki html page
*
* @param string $owner The repository owner
* @param string $repo The repository name
* @param string $pageName The page name
*
* @return object
*
* @since 1.0
*/
public function getHtml(string $owner, string $repo, string $pageName)
{
// get the gitea wiki page
$page = $this->get($owner, $repo, $pageName);
if (empty($page->content))
{
throw new \Exception('Wiki page could not be found.');
}
// Build the request path.
$path = '/markdown';
// Get headers
$headers = $this->client->getOption('headers', []);
$headers['accept'] = 'text/html';
$headers['Content-Type'] = 'application/json';
// build the post body
$data = [
'Context' => 'string',
'Mode' => 'string',
'Text' => $page->content,
'Wiki' => true
];
// Post the request.
return $this->processResponse(
$this->client->post($this->fetchUrl($path), json_encode($data), $headers)
);
}
}

View File

@ -0,0 +1,83 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Abstraction;
use VDM\Joomla\Gitea\Utilities\Http;
use VDM\Joomla\Gitea\Utilities\Uri;
use VDM\Joomla\Gitea\Utilities\Response;
/**
* The Gitea Api
*
* @since 3.2.0
*/
abstract class Api
{
/**
* The Http class
*
* @var Http
* @since 3.2.0
*/
protected Http $http;
/**
* The Uri class
*
* @var Uri
* @since 3.2.0
*/
protected Uri $uri;
/**
* The Response class
*
* @var Response
* @since 3.2.0
*/
protected Response $response;
/**
* Constructor.
*
* @param Http $http The http class.
* @param Uri $uri The uri class.
* @param Response $response The response class.
*
* @since 3.2.0
**/
public function __construct(Http $http, Uri $uri, Response $response)
{
$this->http = $http;
$this->uri = $uri;
$this->response = $response;
}
/**
* Load/Reload API.
*
* @param string $url The url.
* @param token $token The token.
*
* @return void
* @since 3.2.0
**/
public function load_(string $url, string $token)
{
$this->uri->setUrl($url);
$this->http->setToken($token);
}
}

View File

@ -0,0 +1,72 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Admin;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Admin Cron
*
* @since 3.2.0
*/
class Cron extends Api
{
/**
* List cron tasks.
*
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(int $page = 1, int $limit = 10): ?array
{
// Build the request path.
$path = "/admin/cron";
// Set the query parameters.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Run cron task.
*
* @param string $task The cron task to run.
*
* @return string
* @since 3.2.0
**/
public function run(string $task): string
{
// Build the request path.
$path = "/admin/cron/{$task}";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,51 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Admin;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Admin Organizations
*
* @since 3.2.0
*/
class Organizations extends Api
{
/**
* List all organizations.
*
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(int $page = 1, int $limit = 10): ?array
{
// Build the request path.
$path = "/admin/orgs";
// Set the query parameters.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
}

View File

@ -0,0 +1,101 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Admin;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Admin Unadopted
*
* @since 3.2.0
*/
class Unadopted extends Api
{
/**
* List unadopted repositories.
*
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
* @param string $pattern Pattern of repositories to search for.
*
* @return array|null
* @since 3.2.0
**/
public function list(int $page = 1, int $limit = 10, string $pattern = ''): ?array
{
// Build the request path.
$path = "/admin/unadopted";
// Set the query parameters.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
if (!empty($pattern))
{
$uri->setVar('pattern', $pattern);
}
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Adopt unadopted files as a repository.
*
* @param string $owner The owner name.
* @param string $repo The repository name.
*
* @return string
* @since 3.2.0
**/
public function adopt(string $owner, string $repo): string
{
// Build the request path.
$path = "/admin/unadopted/{$owner}/{$repo}";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), ''
), 204, 'success'
);
}
/**
* Delete unadopted files.
*
* @param string $owner The owner name.
* @param string $repo The repository name.
*
* @return string
* @since 3.2.0
**/
public function delete(string $owner, string $repo): string
{
// Build the request path.
$path = "/admin/unadopted/{$owner}/{$repo}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,207 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Admin;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Admin Users
*
* @since 3.2.0
*/
class Users extends Api
{
/**
* List all users.
*
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(int $page = 1, int $limit = 10): ?array
{
// Build the request path.
$path = "/admin/users";
// build the URL
$url = $this->uri->get($path);
$url->setVar('page', $page);
$url->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($url)
);
}
/**
* Create a user with extended options.
*
* @param string $loginName The user's login name.
* @param string $email The user's email address.
* @param string $password The user's password.
* @param string|null $username The username.
* @param string|null $fullName The user's full name (optional).
* @param bool|null $mustChangePassword User must change password on next login (optional).
* @param bool|null $restricted Restrict the user (optional).
* @param bool|null $sendNotify Send a notification email to the user (optional).
* @param int|null $sourceId Source ID (optional).
* @param string|null $visibility The user's visibility (optional).
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $loginName,
string $email,
string $password,
string $username,
?string $fullName = null,
?bool $mustChangePassword = null,
?bool $restricted = null,
?bool $sendNotify = null,
?int $sourceId = null,
?string $visibility = null
): ?object
{
// Build the request path.
$path = "/admin/users";
// Set the user data.
$data = new \stdClass();
$data->login_name = $loginName;
$data->email = $email;
$data->password = $password;
$data->username = $username;
$data->full_name = $fullName;
$data->must_change_password = $mustChangePassword;
$data->restricted = $restricted;
$data->send_notify = $sendNotify;
$data->source_id = $sourceId;
$data->visibility = $visibility;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
), 201
);
}
/**
* Delete a user.
*
* @param string $username The user's display name.
*
* @return string
* @since 3.2.0
**/
public function delete(string $username): string
{
// Build the request path.
$path = "/admin/users/{$username}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Edit an existing user.
*
* @param string $username The user's display name.
* @param string $loginName The user's login name.
* @param int $sourceId The user's source ID.
* @param bool $active Optional. Is the user active? Default: false.
* @param bool $admin Optional. Is the user an admin? Default: false.
* @param bool $allowCreateOrganization Optional. Can the user create an organization? Default: false.
* @param bool $allowGitHook Optional. Can the user create Git hooks? Default: false.
* @param bool $allowImportLocal Optional. Can the user import local repositories? Default: false.
* @param string $description Optional. The user's description. Default: ''.
* @param string $email Optional. The user's email address. Default: ''.
* @param string $fullName Optional. The user's full name. Default: ''.
* @param string $location Optional. The user's location. Default: ''.
* @param int $maxRepoCreation Optional. Maximum repositories the user can create. Default: 0.
* @param bool $mustChangePassword Optional. Must the user change their password? Default: false.
* @param string $password Optional. The user's password. Default: ''.
* @param bool $prohibitLogin Optional. Is the user's login prohibited? Default: false.
* @param bool $restricted Optional. Is the user restricted? Default: false.
* @param string $visibility Optional. The user's visibility setting. Default: ''.
* @param string $website Optional. The user's website. Default: ''.
*
* @return object|null
* @since 3.2.0
**/
public function edit(
string $username,
string $loginName,
int $sourceId,
bool $active = false,
bool $admin = false,
bool $allowCreateOrganization = false,
bool $allowGitHook = false,
bool $allowImportLocal = false,
string $description = '',
string $email = '',
string $fullName = '',
string $location = '',
int $maxRepoCreation = 0,
bool $mustChangePassword = false,
string $password = '',
bool $prohibitLogin = false,
bool $restricted = false,
string $visibility = '',
string $website = ''
): ?object
{
// Build the request path.
$path = "/admin/users/{$username}";
// Set the data.
$data = [
'login_name' => $loginName,
'source_id' => $sourceId,
'active' => $active,
'admin' => $admin,
'allow_create_organization' => $allowCreateOrganization,
'allow_git_hook' => $allowGitHook,
'allow_import_local' => $allowImportLocal,
'description' => $description,
'email' => $email,
'full_name' => $fullName,
'location' => $location,
'max_repo_creation' => $maxRepoCreation,
'must_change_password' => $mustChangePassword,
'password' => $password,
'prohibit_login' => $prohibitLogin,
'restricted' => $restricted,
'visibility' => $visibility,
'website' => $website
];
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path), json_encode($data)
)
);
}
}

View File

@ -0,0 +1,86 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Admin\Users;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Admin Users Keys
*
* @since 3.2.0
*/
class Keys extends Api
{
/**
* Add a public key on behalf of a user.
*
* @param string $userName The user's display name.
* @param string $publicKey The public key to add.
* @param string $keyTitle Title of the key to add.
* @param bool $readOnly Whether the key has only read access or read/write (optional).
* @param string|null $description Description of the key (optional).
*
* @return object|null
* @since 3.2.0
**/
public function add(
string $userName,
string $publicKey,
string $keyTitle,
bool $readOnly = false,
?string $description = null
): ?object
{
// Build the request path.
$path = "/admin/users/{$userName}/keys";
// Set the key data.
$data = new \stdClass();
$data->key = $publicKey;
$data->title = $keyTitle;
$data->read_only = $readOnly;
$data->description = $description;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
), 201
);
}
/**
* Delete a user's public key.
*
* @param string $username The user's display name.
* @param int $id The public key ID.
*
* @return string
* @since 3.2.0
**/
public function delete(string $username, int $id): string
{
// Build the request path.
$path = "/admin/users/{$username}/keys/{$id}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,70 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Admin\Users;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Admin Users Organization
*
* @since 3.2.0
*/
class Organization extends Api
{
/**
* Create an organization on behalf of a user.
*
* @param string $username The user's display name.
* @param string $fullName The organization full name.
* @param string|null $description The organization description (optional).
* @param string|null $location The organization location (optional).
* @param bool $repoAdminChangeTeamAccess Whether repo admin can change team access (optional).
* @param string $visibility The organization visibility (optional).
* @param string|null $website The organization website (optional).
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $username,
string $fullName,
?string $description = null,
?string $location = null,
bool $repoAdminChangeTeamAccess = false,
string $visibility = 'public',
?string $website = null
): ?object
{
// Build the request path.
$path = "/admin/users/{$username}/orgs";
// Set the organization data.
$data = new \stdClass();
$data->full_name = $fullName;
$data->description = $description;
$data->location = $location;
$data->repo_admin_change_team_access = $repoAdminChangeTeamAccess;
$data->visibility = $visibility;
$data->website = $website;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
), 201
);
}
}

View File

@ -0,0 +1,85 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Admin\Users;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Admin Users Repository
*
* @since 3.2.0
*/
class Repository extends Api
{
/**
* Create a repository on behalf of a user.
*
* @param string $username The user's display name.
* @param string $repoName The repository name.
* @param string|null $description The repository description (optional).
* @param bool $auto_init Whether the repository should be auto-initialized? (optional).
* @param string|null $default_branch Default branch of the repository (optional).
* @param string|null $gitignores Gitignores to use (optional).
* @param string|null $issue_labels Label-Set to use (optional).
* @param string|null $license License to use (optional).
* @param bool $private Whether the repository is private (optional).
* @param string|null $readme Readme of the repository to create (optional).
* @param bool $template Whether the repository is template (optional).
* @param string|null $trust_model TrustModel of the repository (optional).
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $username,
string $repoName,
?string $description = null,
bool $auto_init = false,
?string $default_branch = null,
?string $gitignores = null,
?string $issue_labels = null,
?string $license = null,
bool $private = false,
?string $readme = null,
bool $template = false,
?string $trust_model = null
): ?object
{
// Build the request path.
$path = "/admin/users/{$username}/repos";
// Set the repository data.
$data = new \stdClass();
$data->name = $repoName;
$data->description = $description;
$data->auto_init = $auto_init;
$data->default_branch = $default_branch;
$data->gitignores = $gitignores;
$data->issue_labels = $issue_labels;
$data->license = $license;
$data->private = $private;
$data->readme = $readme;
$data->template = $template;
$data->trust_model = $trust_model;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
), 201
);
}
}

View File

@ -0,0 +1,97 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea;
use Joomla\DI\Container;
use VDM\Joomla\Gitea\Service\Utilities;
use VDM\Joomla\Gitea\Service\Jcb;
use VDM\Joomla\Gitea\Service\Settings;
use VDM\Joomla\Gitea\Service\Organization;
use VDM\Joomla\Gitea\Service\User;
use VDM\Joomla\Gitea\Service\Repository;
use VDM\Joomla\Gitea\Service\Package;
use VDM\Joomla\Gitea\Service\Issue;
use VDM\Joomla\Gitea\Service\Notifications;
use VDM\Joomla\Gitea\Service\Miscellaneous;
use VDM\Joomla\Gitea\Service\Admin;
use VDM\Joomla\Componentbuilder\Interfaces\FactoryInterface;
/**
* Gitea Factory
*
* @since 3.2.0
*/
abstract class Factory implements FactoryInterface
{
/**
* Global Package Container
*
* @var Container
* @since 3.2.0
**/
protected static $container = null;
/**
* Get any class from the package container
*
* @param string $key The container class key
*
* @return Mixed
* @since 3.2.0
*/
public static function _($key)
{
return self::getContainer()->get($key);
}
/**
* Get the global package container
*
* @return Container
* @since 3.2.0
*/
public static function getContainer(): Container
{
if (!self::$container)
{
self::$container = self::createContainer();
}
return self::$container;
}
/**
* Create a container object
*
* @return Container
* @since 3.2.0
*/
protected static function createContainer(): Container
{
return (new Container())
->registerServiceProvider(new Utilities())
->registerServiceProvider(new Jcb())
->registerServiceProvider(new Settings())
->registerServiceProvider(new Organization())
->registerServiceProvider(new User())
->registerServiceProvider(new Repository())
->registerServiceProvider(new Package())
->registerServiceProvider(new Issue())
->registerServiceProvider(new Notifications())
->registerServiceProvider(new Miscellaneous())
->registerServiceProvider(new Admin());
}
}

View File

@ -0,0 +1,406 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue
*
* @since 3.2.0
*/
class Issue extends Api
{
/**
* List a repository's issues.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $state The state of the issues to get, defaults to 'open'.
* @param int $page The page to get, defaults to null.
* @param int $limit The number of issues per page, defaults to null.
* @param string|null $labels Comma-separated list of labels, defaults to null.
* @param string|null $q The search string, defaults to null.
* @param string|null $type The type to filter by (issues/pulls), defaults to null.
* @param string|null $milestones Comma-separated list of milestone names or IDs, defaults to null.
* @param string|null $since Only show items updated after the given time, defaults to null.
* @param string|null $before Only show items updated before the given time, defaults to null.
* @param string|null $createdBy Only show items created by the given user, defaults to null.
* @param string|null $assignedBy Only show items assigned to the given user, defaults to null.
* @param string|null $mentionedBy Only show items where the given user is mentioned, defaults to null.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $owner,
string $repo,
string $state = 'open',
int $page = 1,
int $limit = 10,
?string $labels = null,
?string $q = null,
?string $type = null,
?string $milestones = null,
?string $since = null,
?string $before = null,
?string $createdBy = null,
?string $assignedBy = null,
?string $mentionedBy = null
): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues";
// Build the URI.
$uri = $this->uri->get($path);
// Set the query parameters
$uri->setVar('state', $state);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
$uri->setVar('labels', $labels);
$uri->setVar('q', $q);
$uri->setVar('type', $type);
$uri->setVar('milestones', $milestones);
$uri->setVar('since', $since);
$uri->setVar('before', $before);
$uri->setVar('created_by', $createdBy);
$uri->setVar('assigned_by', $assignedBy);
$uri->setVar('mentioned_by', $mentionedBy);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Get an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $owner, string $repo, int $index): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Create an issue. If using deadline only the date will be taken into account, and time of day ignored.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $issueTitle The issue title.
* @param array|null $assignees The array of assignees, defaults to null.
* @param string|null $issueBody The issue body, defaults to null.
* @param bool|null $closed If the issue is closed, defaults to null.
* @param string|null $dueDate The deadline for the issue, format: "YYYY-MM-DD", defaults to null.
* @param array|null $labelIds The array of label IDs to attach to the issue, defaults to null.
* @param int|null $milestoneId The milestone ID, defaults to null.
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $owner,
string $repo,
string $issueTitle,
?array $assignees = null,
?string $issueBody = null,
?bool $closed = null,
?string $dueDate = null,
?array $labelIds = null,
?int $milestoneId = null
): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues";
// Build the request data.
$data = new \stdClass();
$data->title = $issueTitle;
$data->body = $issueBody;
$data->assignees = $assignees;
$data->closed = $closed;
$data->due_date = $dueDate;
$data->labels = $labelIds;
$data->milestone = $milestoneId;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
)
);
}
/**
* Search for issues across the repositories that the user has access to.
*
* @param string $q Search query.
* @param int $page Page number (default 1).
* @param int $limit Page size (default 10, max 50).
* @param string|null $state Issue state (default open).
* @param string|null $labels Label filter, comma-separated.
* @param string|null $milestones Milestone filter, comma-separated.
* @param int|null $priorityRepoId Repository to prioritize in the results.
* @param string|null $type Filter by type (issues/pulls).
* @param string|null $since Only show notifications updated after the given time (RFC 3339 format).
* @param string|null $before Only show notifications updated before the given time (RFC 3339 format).
* @param bool|null $assigned Filter assigned to you (default false).
* @param bool|null $created Filter created by you (default false).
* @param bool|null $mentioned Filter mentioning you (default false).
* @param bool|null $reviewRequested Filter pulls requesting your review (default false).
* @param string|null $owner Filter by owner.
* @param string|null $team Filter by team (requires organization owner parameter).
*
* @return array|null
* @since 3.2.0
**/
public function search(
string $q,
int $page = 1,
int $limit = 10,
?string $state = 'open',
?string $labels = null,
?string $milestones = null,
?int $priorityRepoId = null,
?string $type = null,
?string $since = null,
?string $before = null,
?bool $assigned = null,
?bool $created = null,
?bool $mentioned = null,
?bool $reviewRequested = null,
?string $owner = null,
?string $team = null
): ?array
{
// Build the request path.
$path = "/repos/issues/search";
// Set the URL parameters.
$uri = $this->uri->get($path);
$uri->setVar('q', $q);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
$uri->setVar('state', $state);
if ($labels !== null)
{
$uri->setVar('labels', $labels);
}
if ($milestones !== null)
{
$uri->setVar('milestones', $milestones);
}
if ($priorityRepoId !== null)
{
$uri->setVar('priority_repo_id', $priorityRepoId);
}
if ($type !== null)
{
$uri->setVar('type', $type);
}
if ($since !== null)
{
$uri->setVar('since', $since);
}
if ($before !== null)
{
$uri->setVar('before', $before);
}
if ($assigned !== null)
{
$uri->setVar('assigned', $assigned);
}
if ($created !== null)
{
$uri->setVar('created', $created);
}
if ($mentioned !== null)
{
$uri->setVar('mentioned', $mentioned);
}
if ($reviewRequested !== null)
{
$uri->setVar('review_requested', $reviewRequested);
}
if ($owner !== null)
{
$uri->setVar('owner', $owner);
}
if ($team !== null)
{
$uri->setVar('team', $team);
}
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Edit an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string|null $assignee The assignee, defaults to null.
* @param array|null $assignees The assignees, defaults to null.
* @param string|null $body The issue body, defaults to null.
* @param string|null $dueDate The due date, defaults to null.
* @param int|null $milestone The milestone, defaults to null.
* @param string|null $ref The reference, defaults to null.
* @param string|null $state The issue state, defaults to null.
* @param string|null $title The issue title, defaults to null.
* @param bool|null $unsetDueDate The flag to unset due date, defaults to null.
*
* @return object|null
* @since 3.2.0
**/
public function edit(
string $owner,
string $repo,
int $index,
?string $assignee = null,
?array $assignees = null,
?string $body = null,
?string $dueDate = null,
?int $milestone = null,
?string $ref = null,
?string $state = null,
?string $title = null,
?bool $unsetDueDate = null
): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}";
// Prepare the issue data.
$editIssueData = new \stdClass();
if ($assignee !== null || $assignees !== null)
{
$editIssueData->assignee = new \stdClass();
if ($assignee !== null)
{
$editIssueData->assignee->name = $assignee;
}
if ($assignees !== null)
{
$editIssueData->assignee->names = $assignees;
}
}
if ($body !== null)
{
$editIssueData->body = $body;
}
if ($dueDate !== null || $unsetDueDate !== null)
{
$editIssueData->dueDate = new \stdClass();
if ($dueDate !== null)
{
$editIssueData->dueDate->date = $dueDate;
}
if ($unsetDueDate !== null)
{
$editIssueData->dueDate->unset = $unsetDueDate;
}
}
if ($milestone !== null)
{
$editIssueData->milestone = $milestone;
}
if ($ref !== null)
{
$editIssueData->ref = $ref;
}
if ($state !== null)
{
$editIssueData->state = $state;
}
if ($title !== null)
{
$editIssueData->title = $title;
}
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path), json_encode($editIssueData)
)
);
}
/**
* Delete an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return string
* @since 3.2.0
**/
public function delete(string $owner, string $repo, int $index): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,176 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Comments
*
* @since 3.2.0
*/
class Comments extends Api
{
/**
* List all comments on an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param int $page The page number to get, defaults to 1.
* @param int $limit The number of comments per page, defaults to 10.
* @param string|null $since The date-time since when to get comments, defaults to null.
* @param string|null $before The date-time before when to get comments, defaults to null.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $owner,
string $repo,
int $index,
int $page = 1,
int $limit = 10,
?string $since = null,
?string $before = null
): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/comments";
// Build the URI.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Set the 'since' and 'before' parameters if not null.
if ($since !== null)
{
$uri->setVar('since', $since);
}
if ($before !== null)
{
$uri->setVar('before', $before);
}
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Get a comment.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $commentId The comment ID.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $owner, string $repo, int $commentId): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/comments/{$commentId}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Delete a comment.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $commentId The comment ID.
*
* @return string
* @since 3.2.0
**/
public function delete(string $owner, string $repo, int $commentId): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/comments/{$commentId}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Edit a comment.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $commentId The comment ID.
* @param string $commentBody The new comment body.
*
* @return object|null
* @since 3.2.0
**/
public function edit(string $owner, string $repo, int $commentId, string $commentBody): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/comments/{$commentId}";
// Build the request data.
$data = new \stdClass();
$data->body = $commentBody;
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path), json_encode($data)
)
);
}
/**
* Add a comment to an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $issueIndex The issue index.
* @param string $commentBody The comment body.
*
* @return object|null
* @since 3.2.0
**/
public function add(string $owner, string $repo, int $issueIndex, string $commentBody): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$issueIndex}/comments";
// Build the request data.
$data = new \stdClass();
$data->body = $commentBody;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
), 201
);
}
}

View File

@ -0,0 +1,54 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Deadline
*
* @since 3.2.0
*/
class Deadline extends Api
{
/**
* Set an issue deadline.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string|null $dueDate The deadline date string in the format YYYY-MM-DD or null to delete the deadline.
*
* @return object
* @since 3.2.0
**/
public function set(string $owner, string $repo, int $index, ?string $dueDate): object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/deadline";
// Build the request data.
$data = new \stdClass();
$data->due_date = $dueDate;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
)
);
}
}

View File

@ -0,0 +1,181 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Labels
*
* @since 3.2.0
*/
class Labels extends Api
{
/**
* Get all of a repository's labels.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $page The page number of results to return (1-based).
* @param int $limit The page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(string $owner, string $repo, int $page = 1, int $limit = 10): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/labels";
// Get the URI object with the request path.
$uri = $this->uri->get($path);
// Add the page and limit query parameters if provided.
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Get an issue's labels.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return array|null
* @since 3.2.0
**/
public function get(string $owner, string $repo, int $index): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/labels";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Replace an issue's labels.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param array $labels An array of labels to replace the current issue labels.
*
* @return object
* @since 3.2.0
**/
public function replace(string $owner, string $repo, int $index, array $labels): object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/labels";
// Build the request data.
$data = new \stdClass();
$data->labels = $labels;
// Send the put request.
return $this->response->get(
$this->http->put(
$this->uri->get($path), json_encode($data)
)
);
}
/**
* Add a label to an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param array $labels An array of label IDs to add.
*
* @return array|null
* @since 3.2.0
**/
public function add(string $owner, string $repo, int $index, array $labels): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/labels";
// Build the request data.
$data = new \stdClass();
$data->labels = $labels;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
)
);
}
/**
* Remove a label from an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param int $labelId The ID of the label to remove.
*
* @return string
* @since 3.2.0
**/
public function remove(string $owner, string $repo, int $index, int $labelId): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/labels/{$labelId}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Remove all labels from an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return string
* @since 3.2.0
**/
public function clear(string $owner, string $repo, int $index): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/labels";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,230 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Milestones
*
* @since 3.2.0
*/
class Milestones extends Api
{
/**
* Create a milestone.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $title The title of the milestone.
* @param string|null $description Optional. The description of the milestone.
* @param string|null $dueOn Optional. The due date of the milestone.
* @param string|null $state Optional. The state of the milestone. Default is 'open'.
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $owner,
string $repo,
string $title,
?string $description = null,
?string $dueOn = null,
?string $state = 'open'
): ?object
{
// Set the lines data
$data = new \stdClass();
// Set all the required data.
$data->title = $title;
// Set all the optional data that has been provided.
if ($description !== null)
{
$data->description = $description;
}
if ($dueOn !== null)
{
$data->due_on = $dueOn;
}
if ($state !== null)
{
$data->state = $state;
}
// Build the request path.
$path = "/repos/{$owner}/{$repo}/milestones";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
json_encode($data)
), 201
);
}
/**
* Get all of a repository's opened milestones.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string|null $state Optional. Milestone state. Recognized values are open, closed, and all. Defaults to "open".
* @param string|null $name Optional. Filter by milestone name.
* @param int|null $page Optional. Page number of results to return (1-based).
* @param int|null $limit Optional. Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $owner,
string $repo,
?string $state = 'open',
?string $name = null,
?int $page = null,
?int $limit = null
): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/milestones";
// Build the URI.
$uri = $this->uri->get($path);
$uri->setVar('state', $state);
if ($name !== null)
{
$uri->setVar('name', $name);
}
if ($page !== null)
{
$uri->setVar('page', $page);
}
if ($limit !== null)
{
$uri->setVar('limit', $limit);
}
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Get a milestone.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $milestoneId The ID of the milestone.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $owner, string $repo, string $milestoneId): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/milestones/{$milestoneId}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Delete a milestone.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $milestoneId The ID of the milestone to delete.
*
* @return string
* @since 3.2.0
**/
public function delete(string $owner, string $repo, string $milestoneId): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/milestones/{$milestoneId}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Update a milestone.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $milestoneId The ID of the milestone to update.
* @param string $title Optional. The new title of the milestone.
* @param string $description Optional. The new description of the milestone.
* @param string $dueOn Optional. The new due date of the milestone.
* @param string $state Optional. The new state of the milestone.
*
* @return object|null
* @since 3.2.0
**/
public function update(
string $owner,
string $repo,
string $milestoneId,
string $title = null,
string $description = null,
string $dueOn = null,
string $state = null
): ?object
{
// Set the lines data
$data = new \stdClass();
// Set all the optional data that has been provided.
if ($title !== null)
{
$data->title = $title;
}
if ($description !== null)
{
$data->description = $description;
}
if ($dueOn !== null)
{
$data->due_on = $dueOn;
}
if ($state !== null)
{
$data->state = $state;
}
// Build the request path.
$path = "/repos/{$owner}/{$repo}/milestones/{$milestoneId}";
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path),
json_encode($data)
)
);
}
}

View File

@ -0,0 +1,110 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Reactions
*
* @since 3.2.0
*/
class Reactions extends Api
{
/**
* Get a list reactions of an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param int $page The page to get, defaults to 1.
* @param int $limit The number of reactions per page, defaults to 10.
*
* @return array|null
* @since 3.2.0
**/
public function list(string $owner, string $repo, int $index, int $page = 1, int $limit = 10): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/reactions";
// Build the URI.
$uri = $this->uri->get($path);
// Set the URI variables.
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Add a reaction to an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string $content The name of the reaction to add.
*
* @return object|null
* @since 3.2.0
**/
public function add(string $owner, string $repo, int $index, string $content): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/reactions";
// Build the request data.
$data = new \stdClass();
$data->content = $content;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
)
);
}
/**
* Remove a reaction from an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string $content The name of the reaction to remove.
*
* @return string
* @since 3.2.0
**/
public function remove(string $owner, string $repo, int $index, string $content): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/reactions";
// Build the URI.
$uri = $this->uri->get($path);
$uri->setVar('content', $content);
// Send the delete request.
return $this->response->get(
$this->http->delete($uri), 200, 'success'
);
}
}

View File

@ -0,0 +1,103 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue\Reactions;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Reactions Comment
*
* @since 3.2.0
*/
class Comment extends Api
{
/**
* Get a list of reactions from a comment of an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $commentId The comment ID.
*
* @return array|null
* @since 3.2.0
**/
public function list(string $owner, string $repo, int $commentId): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/comments/{$commentId}/reactions";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Add a reaction to a comment of an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $commentId The comment ID.
* @param string $content The reaction to add, e.g. "+1".
*
* @return object|null
* @since 3.2.0
**/
public function add(string $owner, string $repo, int $commentId, string $content): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/comments/{$commentId}/reactions";
// Build the request data.
$data = new \stdClass();
$data->content = $content;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
)
);
}
/**
* Remove a reaction from a comment of an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $commentId The comment ID.
* @param string $content The reaction to remove, e.g. "+1".
*
* @return string
* @since 3.2.0
**/
public function remove(string $owner, string $repo, int $commentId, string $content): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/comments/{$commentId}/reactions";
// Build the URI.
$uri = $this->uri->get($path);
$uri->setVar('content', $content);
// Send the delete request.
return $this->response->get(
$this->http->delete($uri), 200, 'success'
);
}
}

View File

@ -0,0 +1 @@
<html><body bgcolor="#FFFFFF"></body></html>

View File

@ -0,0 +1,67 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue\Repository;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Repository Comments
*
* @since 3.2.0
*/
class Comments extends Api
{
/**
* List all comments in a repository.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $page The page to get, defaults to 1.
* @param int $limit The number of comments per page, defaults to 10.
* @param string|null $since The date-time string to filter updated comments since, defaults to null.
* @param string|null $before The date-time string to filter updated comments before, defaults to null.
*
* @return array|null
* @since 3.2.0
**/
public function list(string $owner, string $repo, int $page = 1, int $limit = 10, ?string $since = null, ?string $before = null): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/comments";
// Build the URI.
$uri = $this->uri->get($path);
// Set the URI variables.
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
if ($since !== null)
{
$uri->setVar('since', $since);
}
if ($before !== null)
{
$uri->setVar('before', $before);
}
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
}

View File

@ -0,0 +1 @@
<html><body bgcolor="#FFFFFF"></body></html>

View File

@ -0,0 +1,95 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Stopwatch
*
* @since 3.2.0
*/
class Stopwatch extends Api
{
/**
* Start stopwatch on an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return string
* @since 3.2.0
**/
public function start(string $owner, string $repo, int $index): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/stopwatch/start";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), ''
), 201, 'success'
);
}
/**
* Stop an issue's existing stopwatch.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return string
* @since 3.2.0
**/
public function stop(string $owner, string $repo, int $index): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/stopwatch/stop";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), ''
), 201, 'success'
);
}
/**
* Delete an issue's existing stopwatch.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return string
* @since 3.2.0
**/
public function delete(string $owner, string $repo, int $index): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/stopwatch/delete";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,137 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Subscriptions
*
* @since 3.2.0
*/
class Subscriptions extends Api
{
/**
* Get users who subscribed on an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param int|null $page Optional. Page number of results to return (1-based).
* @param int|null $limit Optional. Page size of results.
*
* @return object|null
* @since 3.2.0
**/
public function get(
string $owner,
string $repo,
int $index,
?int $page = null,
?int $limit = null
): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/subscriptions";
// Set the query parameters.
$uri = $this->uri->get($path);
if ($page !== null)
{
$uri->setVar('page', $page);
}
if ($limit !== null)
{
$uri->setVar('limit', $limit);
}
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Check if user is subscribed to an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return object|null
* @since 3.2.0
**/
public function check(string $owner, string $repo, int $index): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/subscriptions/check";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Subscribe user to issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string $user The username to subscribe.
*
* @return string
* @since 3.2.0
**/
public function subscribe(string $owner, string $repo, int $index, string $user): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/subscriptions/{$user}";
// Send the put request.
return $this->response->get_(
$this->http->put(
$this->uri->get($path), ''
), [200 => 'already subscribed', 201 => 'success']
);
}
/**
* Unsubscribe user from issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string $user The username to unsubscribe.
*
* @return string
* @since 3.2.0
**/
public function unsubscribe(string $owner, string $repo, int $index, string $user): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/subscriptions/{$user}";
// Send the delete request.
return $this->response->get_(
$this->http->delete(
$this->uri->get($path)
), [200 => 'already unsubscribed', 201 => 'success']
);
}
}

View File

@ -0,0 +1,78 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Timeline
*
* @since 3.2.0
*/
class Timeline extends Api
{
/**
* List all comments and events on an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string|null $since Optional. If provided, only comments updated since the specified time are returned.
* @param int|null $page Optional. Page number of results to return (1-based).
* @param int|null $limit Optional. Page size of results.
* @param string|null $before Optional. If provided, only comments updated before the provided time are returned.
*
* @return array|null
* @since 3.2.0
**/
public function get(
string $owner,
string $repo,
int $index,
?string $since = null,
?int $page = null,
?int $limit = null,
?string $before = null
): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/timeline";
// Set the query parameters.
$uri = $this->uri->get($path);
if ($since !== null)
{
$uri->setVar('since', $since);
}
if ($page !== null)
{
$uri->setVar('page', $page);
}
if ($limit !== null)
{
$uri->setVar('limit', $limit);
}
if ($before !== null)
{
$uri->setVar('before', $before);
}
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
}

View File

@ -0,0 +1,179 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Issue;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Issue Times
*
* @since 3.2.0
*/
class Times extends Api
{
/**
* List an issue's tracked times.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param string $user Optional. Filter by user.
* @param string $since Optional. Show times updated after the given time.
* @param string $before Optional. Show times updated before the given time.
* @param int $page Optional. Page number of results to return (1-based).
* @param int $limit Optional. Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $owner,
string $repo,
int $index,
string $user = null,
string $since = null,
string $before = null,
int $page = null,
int $limit = null
): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/times";
// Prepare the query parameters.
$uri = $this->uri->get($path);
if ($user !== null)
{
$uri->setVar('user', $user);
}
if ($since !== null)
{
$uri->setVar('since', $since);
}
if ($before !== null)
{
$uri->setVar('before', $before);
}
if ($page !== null)
{
$uri->setVar('page', $page);
}
if ($limit !== null)
{
$uri->setVar('limit', $limit);
}
// Send the get request with the query parameters.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Add tracked time to an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param int $time The tracked time in seconds.
* @param string $created Optional. The date and time of the tracked time in RFC 3339 format.
* @param string $userName Optional. User who spent the time.
*
* @return object|null
* @since 3.2.0
**/
public function add(
string $owner,
string $repo,
int $index,
int $time,
string $created = null,
string $userName = null
): ?object
{
// Set the lines data
$data = new \stdClass();
// Set all the needed data.
$data->time = $time;
if ($created !== null)
{
$data->created = $created;
}
if ($userName !== null)
{
$data->user_name = $userName;
}
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/times";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
json_encode($data)
)
);
}
/**
* Reset a tracked time of an issue.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
*
* @return string
* @since 3.2.0
**/
public function reset(string $owner, string $repo, int $index): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/times";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Delete specific tracked time.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param int $index The issue index.
* @param int $id The ID of the tracked time to delete.
*
* @return string
* @since 3.2.0
**/
public function delete(string $owner, string $repo, int $index, int $id): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/issues/{$index}/times/{$id}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1 @@
<html><body bgcolor="#FFFFFF"></body></html>

View File

@ -0,0 +1,162 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Labels
*
* @since 3.2.0
*/
class Labels extends Api
{
/**
* Create a label.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $labelName The name of the label.
* @param string $labelColor The color of the label, in hexadecimal format with the leading '#'.
* @param string $labelDescription Optional. The description of the label.
*
* @return object|null
* @since 3.2.0
**/
public function create(string $owner, string $repo, string $labelName, string $labelColor, string $labelDescription = ''): ?object
{
// Set the lines data
$data = new \stdClass();
// Set all the needed data.
$data->name = $labelName;
$data->color = $labelColor;
if (!empty($labelDescription))
{
$data->description = $labelDescription;
}
// Build the request path.
$path = "/repos/{$owner}/{$repo}/labels";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
json_encode($data)
), 201
);
}
/**
* Get a single label.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $id The ID of the label to retrieve.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $owner, string $repo, string $id): ?object
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/labels/{$id}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Delete a label.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $id The ID of the label to delete.
*
* @return string
* @since 3.2.0
**/
public function delete(string $owner, string $repo, string $id): string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/labels/{$id}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Update a label.
*
* @param string $owner The owner name.
* @param string $repo The repo name.
* @param string $id The ID of the label to update.
* @param string $labelName Optional. The new name of the label.
* @param string $labelColor Optional. The new color of the label, in hexadecimal format without the leading '#'.
* @param string $labelDescription Optional. The new description of the label.
*
* @return object|null
* @since 3.2.0
**/
public function update(
string $owner,
string $repo,
string $id,
string $labelName = '',
string $labelColor = '',
string $labelDescription = ''
): ?object
{
// Set the lines data
$data = new \stdClass();
// Set all the optional data that has been provided.
if (!empty($labelName))
{
$data->name = $labelName;
}
if (!empty($labelColor))
{
$data->color = $labelColor;
}
if (!empty($labelDescription))
{
$data->description = $labelDescription;
}
// Build the request path.
$path = "/repos/{$owner}/{$repo}/labels/{$id}";
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path),
json_encode($data)
)
);
}
}

View File

@ -0,0 +1,69 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Miscellaneous;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Miscellaneous Activitypub
*
* @since 3.2.0
*/
class Activitypub extends Api
{
/**
* Returns the Person actor for a user.
*
* @param string $username The user's username.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $username): ?object
{
// Build the request path.
$path = "/activitypub/user/{$username}";
// Send the GET request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Send to the user's inbox.
*
* @param string $username The user's username.
* @param object $postData The post data.
*
* @return string
* @since 3.2.0
**/
public function send(string $username, object $postData): string
{
// Build the request path.
$path = "/activitypub/user/{$username}/inbox";
// Send the POST request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($postData)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Miscellaneous;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Miscellaneous Gpg
*
* @since 3.2.0
*/
class Gpg extends Api
{
/**
* Get default signing-key.gpg.
*
* @return string|null
* @since 3.2.0
**/
public function get(): ?string
{
// Build the request path.
$path = "/signing-key.gpg";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
}

View File

@ -0,0 +1,87 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Miscellaneous;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Miscellaneous Markdown
*
* @since 3.2.0
*/
class Markdown extends Api
{
/**
* Render a markdown document as HTML.
*
* @param string $markdownText The markdown text to render.
* @param bool $isWikiPage Is it a wiki page?
* @param string $context Context to render.
* @param string $mode Mode to render.
*
* @return string|null
* @since 3.2.0
**/
public function render(
string $markdownText,
bool $isWikiPage = false,
string $context = 'string',
string $mode = 'string'
): ?string
{
// Build the request path.
$path = "/markdown";
// Set the markdown data.
$data = new \stdClass();
$data->Text = $markdownText;
$data->Wiki = $isWikiPage;
$data->Context = $context;
$data->Mode = $mode;
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
json_encode($data),
['accept' => 'text/html']
)
);
}
/**
* Render raw markdown as HTML.
*
* @param string $rawMarkdown The raw markdown text to render.
*
* @return string|null
* @since 3.2.0
**/
public function raw(string $rawMarkdown): ?string
{
// Build the request path.
$path = "/markdown/raw";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
$rawMarkdown,
['Content-Type' => 'text/plain', 'accept' => 'text/html']
)
);
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Miscellaneous;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Miscellaneous NodeInfo
*
* @since 3.2.0
*/
class NodeInfo extends Api
{
/**
* Returns the nodeinfo of the Gitea application.
*
* @return object|null
* @since 3.2.0
**/
public function get(): ?object
{
// Build the request path.
$path = "/nodeinfo";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Miscellaneous;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Miscellaneous Version
*
* @since 3.2.0
*/
class Version extends Api
{
/**
* Returns the version of the Gitea application.
*
* @return object|null
* @since 3.2.0
**/
public function get(): ?object
{
// Build the request path.
$path = "/version";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
}

View File

@ -0,0 +1 @@
<html><body bgcolor="#FFFFFF"></body></html>

View File

@ -0,0 +1,149 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Notifications
*
* @since 3.2.0
*/
class Notifications extends Api
{
/**
* List user's notification threads.
*
* @param bool|null $all Show notifications marked as read (optional).
* @param array|null $statusTypes Show notifications with the provided status types (optional).
* @param array|null $subjectType Filter notifications by subject type (optional).
* @param string|null $since Show notifications updated after the given time (optional).
* @param string|null $before Show notifications updated before the given time (optional).
* @param int $page Page number of results to return (optional).
* @param int $limit Page size of results (optional).
*
* @return array|null
* @since 3.2.0
**/
public function list(
?bool $all = null,
?array $statusTypes = null,
?array $subjectType = null,
?string $since = null,
?string $before = null,
int $page = 1,
int $limit = 10
): ?array
{
// Build the request path.
$path = "/notifications";
// Configure the URI with query parameters.
$uri = $this->uri->get($path);
if ($all !== null)
{
$uri->setVar('all', $all);
}
if ($statusTypes !== null)
{
$uri->setVar('status-types', implode(',', $statusTypes));
}
if ($subjectType !== null)
{
$uri->setVar('subject-type', implode(',', $subjectType));
}
if ($since !== null)
{
$uri->setVar('since', $since);
}
if ($before !== null)
{
$uri->setVar('before', $before);
}
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Mark notification threads as read, pinned, or unread.
*
* @param string|null $lastReadAt Describes the last point that notifications were checked (optional).
* @param bool|null $all If true, mark all notifications on this repo (optional).
* @param array|null $statusTypes Mark notifications with the provided status types (optional).
* @param string|null $toStatus Status to mark notifications as (optional).
*
* @return array|null
* @since 3.2.0
**/
public function update(
?string $lastReadAt = null,
?bool $all = null,
?array $statusTypes = null,
?string $toStatus = null
): ?array
{
// Build the request path.
$path = "/notifications";
// Configure the URI with query parameters.
$uri = $this->uri->get($path);
if ($lastReadAt !== null)
{
$uri->setVar('last_read_at', $lastReadAt);
}
if ($all !== null)
{
$uri->setVar('all', $all);
}
if ($statusTypes !== null)
{
$uri->setVar('status-types', implode(',', $statusTypes));
}
if ($toStatus !== null)
{
$uri->setVar('to-status', $toStatus);
}
// Send the put request.
return $this->response->get(
$this->http->put($uri, ''), 205
);
}
/**
* Check if unread notifications exist.
*
* @return object|null
* @since 3.2.0
**/
public function check(): ?object
{
// Build the request path.
$path = "/notifications/new";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
}

View File

@ -0,0 +1,144 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Notifications;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Notifications Repository
*
* @since 3.2.0
*/
class Repository extends Api
{
/**
* List user's notification threads on a specific repo.
*
* @param string $owner The owner name.
* @param string $repo The repository name.
* @param bool $all Show notifications marked as read.
* @param array $statusTypes Show notifications with the provided status types.
* @param array $subjectTypes Filter notifications by subject type.
* @param string $since Show notifications updated after the given time.
* @param string $before Show notifications updated before the given time.
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function get(
string $owner,
string $repo,
bool $all = false,
array $statusTypes = [],
array $subjectTypes = [],
string $since = '',
string $before = '',
int $page = 1,
int $limit = 10
): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/notifications";
// Configure the URI with query parameters.
$uri = $this->uri->get($path);
if ($all)
{
$uri->setVar('all', $all);
}
if (!empty($statusTypes))
{
$uri->setVar('status-types', implode(',', $statusTypes));
}
if (!empty($subjectTypes))
{
$uri->setVar('subject-type', implode(',', $subjectTypes));
}
if (!empty($since))
{
$uri->setVar('since', $since);
}
if (!empty($before))
{
$uri->setVar('before', $before);
}
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Mark notification threads as read, pinned, or unread on a specific repo.
*
* @param string $owner The owner name.
* @param string $repo The repository name.
* @param bool|null $all Mark all notifications on this repo (optional).
* @param array|null $statusTypes Mark notifications with the provided status types (optional).
* @param string|null $toStatus Status to mark notifications as (optional).
* @param string|null $lastReadAt Last point that notifications were checked (optional).
*
* @return array|null
* @since 3.2.0
**/
public function update(
string $owner,
string $repo,
?bool $all = null,
?array $statusTypes = null,
?string $toStatus = null,
?string $lastReadAt = null
): ?array
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/notifications";
// Configure the URI with query parameters.
$uri = $this->uri->get($path);
if ($all !== null)
{
$uri->setVar('all', $all);
}
if ($statusTypes !== null)
{
$uri->setVar('status-types', implode(',', $statusTypes));
}
if ($toStatus !== null)
{
$uri->setVar('to-status', $toStatus);
}
if ($lastReadAt !== null)
{
$uri->setVar('last_read_at', $lastReadAt);
}
// Send the put request.
return $this->response->get(
$this->http->put($uri, ''), 205
);
}
}

View File

@ -0,0 +1,96 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Notifications;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Notifications Thread
*
* @since 3.2.0
*/
class Thread extends Api
{
/**
* Get notification thread by ID.
*
* @param int $id The notification thread ID.
*
* @return object|null
* @since 3.2.0
**/
public function get(int $id): ?object
{
// Build the request path.
$path = "/notifications/threads/{$id}";
// Get the URI with the path.
$uri = $this->uri->get($path);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Mark notification threads as read, pinned, or unread by ID.
*
* @param int $id The notification thread ID.
* @param string|null $lastReadAt Last point that notifications were checked (optional).
* @param bool|null $all Mark all notifications on this repo (optional).
* @param array|null $statusTypes Mark notifications with the provided status types (optional).
* @param string|null $toStatus Status to mark notifications as (optional).
*
* @return object|null
* @since 3.2.0
**/
public function mark(
int $id,
?string $lastReadAt = null,
?bool $all = null,
?array $statusTypes = null,
?string $toStatus = null
): ?object
{
// Build the request path.
$path = "/notifications/threads/{$id}";
// Configure the URI with query parameters.
$uri = $this->uri->get($path);
if ($lastReadAt !== null)
{
$uri->setVar('last_read_at', $lastReadAt);
}
if ($all !== null)
{
$uri->setVar('all', $all);
}
if ($statusTypes !== null)
{
$uri->setVar('status-types', implode(',', $statusTypes));
}
if ($toStatus !== null)
{
$uri->setVar('to-status', $toStatus);
}
// Send the put request.
return $this->response->get(
$this->http->put($uri, ''), 205
);
}
}

View File

@ -0,0 +1 @@
<html><body bgcolor="#FFFFFF"></body></html>

View File

@ -0,0 +1,209 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization
*
* @since 3.2.0
*/
class Organization extends Api
{
/**
* Create an organization.
*
* @param string $login Required. The organization's username.
* @param string $fullName Required. The full name of the organization.
* @param string $email Required. The email of the organization.
* @param string $description Optional. The description of the organization.
* @param bool $repoAdmin Optional. Whether the user has repository admin access.
* @param bool $teamAdmin Optional. Whether the user has team admin access.
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $login,
string $fullName,
string $email,
string $description = '',
bool $repoAdmin = false,
bool $teamAdmin = false
): ?object
{
// Set the lines data
$data = new \stdClass();
$data->username = $login;
$data->full_name = $fullName;
$data->email = $email;
$data->description = $description;
$data->repo_admin_change_team_access = $repoAdmin;
$data->team_admin_change_team_access = $teamAdmin;
// Build the request path.
$path = '/orgs';
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
json_encode($data)
), 201
);
}
/**
* Get an organization.
*
* @param string $org The organization name.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $org): ?object
{
// Build the request path.
$path = "/orgs/{$org}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Get a list of organizations.
*
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
int $page = 1,
int $limit = 10
): ?array
{
// Build the request path.
$path = '/orgs';
// Get the URI and set query parameters.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Delete an organization.
*
* @param string $org The organization name.
*
* @return string
* @since 3.2.0
**/
public function delete(string $org): string
{
// Build the request path.
$path = "/orgs/{$org}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Edit an organization.
*
* @param string $org The organization name.
* @param string $fullName Optional. The full name of the organization.
* @param string $location Optional. The location of the organization.
* @param string $description Optional. The description of the organization.
* @param bool $repoAdmin Optional. Whether the user has repository admin access.
* @param string $visibility Optional. The visibility of the organization (public, limited, or private).
* @param string $website Optional. The website of the organization.
*
* @return object|null
* @since 3.2.0
**/
public function edit(
string $org,
?string $fullName = null,
?string $email = null,
?string $location = null,
?string $description = null,
?bool $repoAdmin = null,
?string $visibility = null,
?string $website = null
): ?object
{
// Set the lines data
$data = new \stdClass();
if ($fullName !== null)
{
$data->full_name = $fullName;
}
if ($location !== null)
{
$data->location = $location;
}
if ($description !== null)
{
$data->description = $description;
}
if ($repoAdmin !== null)
{
$data->repo_admin_change_team_access = $repoAdmin;
}
if ($visibility !== null)
{
$data->visibility = $visibility;
}
if ($website !== null)
{
$data->website = $website;
}
// Build the request path.
$path = "/orgs/{$org}";
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path),
json_encode($data)
)
);
}
}

View File

@ -0,0 +1,200 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Repository Organization Hooks
*
* @since 3.2.0
*/
class Hooks extends Api
{
/**
* List an organization's webhooks.
*
* @param string $orgName The organization name.
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $orgName,
int $page = 1,
int $limit = 10
): ?array
{
// Build the request path.
$path = "/orgs/{$orgName}/hooks";
// Get the URI and set query parameters.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Create a hook for an organization.
*
* @param string $org The organization name.
* @param string $type The type of hook (e.g. "gitea", "slack", "discord", etc.).
* @param string $url The URL of the hook.
* @param string $secret Optional. The secret for the hook.
* @param bool $events Optional. The events that trigger the hook.
* @param bool $active Optional. Whether the hook is active.
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $org,
string $type,
string $url,
string $secret = '',
bool $events = true,
bool $active = true
): ?object
{
// Set the lines data
$data = new \stdClass();
$data->type = $type;
$data->config = new \stdClass();
$data->config->url = $url;
$data->config->secret = $secret;
$data->events = [];
$data->active = $active;
// Build the request path.
$path = "/orgs/{$org}/hooks";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
json_encode($data)
), 201
);
}
/**
* Get a hook for an organization.
*
* @param string $org The organization name.
* @param int $id The ID of the hook.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $org, int $id): ?object
{
// Build the request path.
$path = "/orgs/{$org}/hooks/{$id}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Delete a hook for an organization.
*
* @param string $org The organization name.
* @param int $id The hook ID.
*
* @return string
* @since 3.2.0
**/
public function delete(string $org, int $id): string
{
// Build the request path.
$path = "/orgs/{$org}/hooks/{$id}";
// Send the DELETE request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Update a hook for an organization.
*
* @param string $orgName The organization name.
* @param int $hookId The ID of the hook.
* @param bool|null $active Optional. Whether the hook is active.
* @param string|null $branchFilter Optional. Branch filter for the hook.
* @param array|null $config Optional. Configuration for the hook.
* @param array|null $events Optional. Events for the hook.
*
* @return object|null
* @since 3.2.0
**/
public function update(
string $orgName,
int $hookId,
?bool $active = null,
?string $branchFilter = null,
?array $config = null,
?array $events = null
): ?object
{
// Set the lines data
$data = new \stdClass();
if ($active !== null)
{
$data->active = $active;
}
if ($branchFilter !== null)
{
$data->branch_filter = $branchFilter;
}
if ($config !== null)
{
$data->config = (object) $config;
}
if ($events !== null)
{
$data->events = $events;
}
// Build the request path.
$path = "/orgs/{$orgName}/hooks/{$hookId}";
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path),
json_encode($data)
)
);
}
}

View File

@ -0,0 +1,183 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization Labels
*
* @since 3.2.0
*/
class Labels extends Api
{
/**
* List an organization's labels.
*
* @param string $orgName The organization name.
* @param int $pageNum Page number of results to return (1-based).
* @param int $pageSize Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $orgName,
int $pageNum = 1,
int $pageSize = 10
): ?array
{
// Build the request path.
$path = "/orgs/{$orgName}/labels";
// Build the URL
$url = $this->uri->get($path);
$url->setVar('page', $pageNum);
$url->setVar('limit', $pageSize);
// Send the get request.
return $this->response->get(
$this->http->get($url)
);
}
/**
* Create a label for an organization.
*
* @param string $org The organization name.
* @param string $name The name of the label.
* @param string $color The color of the label.
* @param string $description Optional. The description of the label.
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $org,
string $name,
string $color,
string $description = ''
): ?object
{
// Set the lines data
$data = new \stdClass();
$data->name = $name;
$data->color = $color;
$data->description = $description;
// Build the request path.
$path = "/orgs/{$org}/labels";
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path),
json_encode($data)
), 201
);
}
/**
* Get a single label for an organization.
*
* @param string $org The organization name.
* @param int $id The ID of the label.
*
* @return object|null
* @since 3.2.0
**/
public function get(string $org, int $id): ?object
{
// Build the request path.
$path = "/orgs/{$org}/labels/{$id}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Delete a label for an organization.
*
* @param string $org The organization name.
* @param int $id The ID of the label.
*
* @return string
* @since 3.2.0
**/
public function delete(string $org, int $id): string
{
// Build the request path.
$path = "/orgs/{$org}/labels/{$id}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Update a label for an organization.
*
* @param string $org The organization name.
* @param int $id The ID of the label.
* @param string $name Optional. The name of the label.
* @param string $color Optional. The color of the label.
* @param string $description Optional. The description of the label.
*
* @return object|null
* @since 3.2.0
**/
public function update(
string $org,
int $id,
string $name = '',
string $color = '',
string $description = ''
): ?object
{
// Set the lines data
$data = new \stdClass();
if ($name) {
$data->name = $name;
}
if ($color) {
$data->color = $color;
}
if ($description) {
$data->description = $description;
}
// Build the request path.
$path = "/orgs/{$org}/labels/{$id}";
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path),
json_encode($data)
)
);
}
}

View File

@ -0,0 +1,100 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization Members
*
* @since 3.2.0
*/
class Members extends Api
{
/**
* Get a list of members of an organization.
*
* @param string $orgName The organization name.
* @param int $page The page number.
* @param int $limit The number of members per page.
*
* @return array|null The organization members.
* @since 3.2.0
*/
public function list(
string $orgName,
int $page = 1,
int $limit = 10
): ?array
{
// Build the request path.
$path = "/orgs/{$orgName}/members";
// Get the URI and set query parameters.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Check if a user is a member of an organization.
*
* @param string $org The organization name.
* @param string $username The username.
*
* @return string Whether the user is a member of the organization.
* @since 3.2.0
*/
public function check(string $org, string $username): string
{
// Build the request path.
$path = "/orgs/{$org}/members/{$username}";
// Send the request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Remove a member from an organization.
*
* @param string $org The organization name.
* @param string $username The username of the user to remove.
*
* @return string Whether the user was successfully removed from the organization.
* @since 3.2.0
*/
public function remove(string $org, string $username): string
{
// Build the request path.
$path = "/orgs/{$org}/members/{$username}";
// Send the request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,119 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization Public Members
*
* @since 3.2.0
*/
class PublicMembers extends Api
{
/**
* List an organization's public members.
*
* @param string $orgName The organization name.
* @param int $page Page number of results to return (1-based).
* @param int $limit Page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(string $orgName, int $page = 1, int $limit = 10): ?array
{
// Build the request path.
$path = "/orgs/{$orgName}/public_members";
// Configure the request URI.
$uri = $this->uri->get($path);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Check if a user is a public member of an organization.
*
* @param string $org The organization name.
* @param string $username The user's username.
*
* @return string|null
* @since 3.2.0
**/
public function check(string $org, string $username): ?string
{
// Build the request path.
$path = "/orgs/{$org}/public_members/{$username}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
), 204
);
}
/**
* Publicize a user's membership.
*
* @param string $org The organization name.
* @param string $username The user's username.
*
* @return string|null
* @since 3.2.0
**/
public function publicize(string $org, string $username): ?string
{
// Build the request path.
$path = "/orgs/{$org}/public_members/{$username}";
// Send the put request.
return $this->response->get(
$this->http->put(
$this->uri->get($path), ''
), 204
);
}
/**
* Conceal a user's membership.
*
* @param string $org The organization name.
* @param string $username The user's username.
*
* @return string
* @since 3.2.0
**/
public function conceal(string $org, string $username): string
{
// Build the request path.
$path = "/orgs/{$org}/public_members/{$username}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,145 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization Repository
*
* @since 3.2.0
*/
class Repository extends Api
{
/**
* List an organization's repos.
*
* @param string $org The organization name.
* @param int $pageNumber The page number.
* @param int $pageSize The page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $org,
int $pageNumber = 1,
int $pageSize = 10
): ?array
{
// Build the request path.
$path = "/orgs/{$org}/repos";
// Configure the request URI.
$uri = $this->uri->get($path);
$uri->setVar('page', $pageNumber);
$uri->setVar('limit', $pageSize);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Create a repository in an organization.
*
* @param string $org The organization name.
* @param string $repoName The name of the repository.
* @param string|null $description The description of the repository (optional).
* @param bool|null $autoInit Whether the repository should be auto-initialized (optional).
* @param string|null $defaultBranch Default branch of the repository (optional).
* @param string|null $gitignores Gitignores to use (optional).
* @param string|null $issueLabels Label-set to use (optional).
* @param string|null $license License to use (optional).
* @param bool|null $private Whether the repository is private (optional).
* @param string|null $readme Readme of the repository to create (optional).
* @param bool|null $template Whether the repository is a template (optional).
* @param string|null $trustModel Trust model of the repository (optional).
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $org,
string $repoName,
?string $description = null,
?bool $autoInit = null,
?string $defaultBranch = null,
?string $gitignores = null,
?string $issueLabels = null,
?string $license = null,
?bool $private = null,
?string $readme = null,
?bool $template = null,
?string $trustModel = null
): ?object
{
// Build the request path.
$path = "/orgs/{$org}/repos";
// Set the repository data.
$data = new \stdClass();
$data->name = $repoName;
if ($description !== null)
{
$data->description = $description;
}
if ($autoInit !== null)
{
$data->auto_init = $autoInit;
}
if ($defaultBranch !== null)
{
$data->default_branch = $defaultBranch;
}
if ($gitignores !== null)
{
$data->gitignores = $gitignores;
}
if ($issueLabels !== null)
{
$data->issue_labels = $issueLabels;
}
if ($license !== null)
{
$data->license = $license;
}
if ($private !== null)
{
$data->private = $private;
}
if ($readme !== null)
{
$data->readme = $readme;
}
if ($template !== null)
{
$data->template = $template;
}
if ($trustModel !== null)
{
$data->trust_model = $trustModel;
}
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
)
);
}
}

View File

@ -0,0 +1,274 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization Teams
*
* @since 3.2.0
*/
class Teams extends Api
{
/**
* List an organization's teams.
*
* @param string $organization The organization name.
* @param int $pageNumber The page number of results to return (1-based).
* @param int $pageSize The page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
string $organization,
int $pageNumber = 1,
int $pageSize = 10
): ?array
{
// Build the request path.
$path = "/orgs/{$organization}/teams";
// Get the URI object.
$uri = $this->uri->get($path);
// Add the query parameters for page number and page size.
$uri->setVar('page', $pageNumber);
$uri->setVar('limit', $pageSize);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Get a team.
*
* @param int $id The team ID.
*
* @return object|null
* @since 3.2.0
**/
public function get(int $id): ?object
{
// Build the request path.
$path = "/teams/{$id}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Create a team.
*
* @param string $organization The organization name.
* @param string $name The name of the team.
* @param string $description The description of the team.
* @param array $repoNames An array of repository names for the team (optional).
* @param string $permission The team's permission level (optional).
* @param array $units Units for the team (optional).
* @param array $unitsMap Units map for the team (optional).
* @param bool $canCreateOrgRepo Can create organization repository flag (optional).
* @param bool $includesAllRepositories Includes all repositories flag (optional).
*
* @return object|null
* @since 3.2.0
**/
public function create(
string $organization,
string $name,
string $description,
array $repoNames = [],
string $permission = 'read',
array $units = [],
array $unitsMap = [],
bool $canCreateOrgRepo = null,
bool $includesAllRepositories = null
): ?object
{
// Build the request path.
$path = "/orgs/{$organization}/teams";
// Set the team data.
$data = new \stdClass();
$data->name = $name;
$data->description = $description;
$data->permission = $permission;
if (!empty($repoNames))
{
$data->repo_names = $repoNames;
}
if (!empty($units))
{
$data->units = $units;
}
if (!empty($unitsMap))
{
$data->units_map = (object)$unitsMap;
}
if ($canCreateOrgRepo !== null)
{
$data->can_create_org_repo = $canCreateOrgRepo;
}
if ($includesAllRepositories !== null)
{
$data->includes_all_repositories = $includesAllRepositories;
}
// Send the post request.
return $this->response->get(
$this->http->post(
$this->uri->get($path), json_encode($data)
), 201
);
}
/**
* Search for teams within an organization.
*
* @param string $organization The organization name.
* @param string $keywords The search keywords.
* @param bool $includeDesc Include search within team description (defaults to true).
* @param int $page The page number.
* @param int $limit The number of results per page.
*
* @return object|null
* @since 3.2.0
**/
public function search(
string $organization,
string $keywords,
bool $includeDesc = true,
int $page = 1,
int $limit = 10
): ?object
{
// Build the request path.
$path = "/orgs/{$organization}/teams/search";
// Configure the request URI.
$uri = $this->uri->get($path);
$uri->setVar('q', $keywords);
$uri->setVar('include_desc', $includeDesc);
$uri->setVar('page', $page);
$uri->setVar('limit', $limit);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* Delete a team.
*
* @param int $id The team ID.
*
* @return string
* @since 3.2.0
**/
public function delete(int $id): string
{
// Build the request path.
$path = "/teams/{$id}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
/**
* Edit a team.
*
* @param int $teamId The team ID.
* @param string|null $teamName The team name (optional).
* @param string|null $teamDescription The team description (optional).
* @param string|null $teamPermission The team's permission level (optional).
* @param bool|null $canCreateOrgRepo Can team create organization repositories (optional).
* @param bool|null $includesAllRepositories Include all repositories (optional).
* @param array|null $units List of units (optional).
* @param array|null $unitsMap Units map (optional).
*
* @return object|null
* @since 3.2.0
**/
public function edit(
int $teamId,
?string $teamName = null,
?string $teamDescription = null,
?string $teamPermission = null,
?bool $canCreateOrgRepo = null,
?bool $includesAllRepositories = null,
?array $units = null,
?array $unitsMap = null
): ?object
{
// Build the request path.
$path = "/teams/{$teamId}";
// Set the team data.
$data = new \stdClass();
if ($teamName !== null)
{
$data->name = $teamName;
}
if ($teamDescription !== null)
{
$data->description = $teamDescription;
}
if ($teamPermission !== null)
{
$data->permission = $teamPermission;
}
if ($canCreateOrgRepo !== null)
{
$data->can_create_org_repo = $canCreateOrgRepo;
}
if ($includesAllRepositories !== null)
{
$data->includes_all_repositories = $includesAllRepositories;
}
if ($units !== null)
{
$data->units = $units;
}
if ($unitsMap !== null)
{
$data->units_map = $unitsMap;
}
// Send the patch request.
return $this->response->get(
$this->http->patch(
$this->uri->get($path), json_encode($data)
)
);
}
}

View File

@ -0,0 +1,124 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization\Teams;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization Teams Members
*
* @since 3.2.0
*/
class Members extends Api
{
/**
* List a team's members.
*
* @param int $teamId The team ID.
* @param int $pageNumber The page number of results to return (1-based).
* @param int $pageSize The page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
int $teamId,
int $pageNumber = 1,
int $pageSize = 10
): ?array
{
// Build the request path.
$path = "/teams/{$teamId}/members";
// Get the URI object.
$uri = $this->uri->get($path);
// Add the query parameters for page number and page size.
$uri->setVar('page', $pageNumber);
$uri->setVar('limit', $pageSize);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* List a particular member of the team.
*
* @param int $id The team ID.
* @param string $username The user's username.
*
* @return object|null
* @since 3.2.0
**/
public function get(int $id, string $username): ?object
{
// Build the request path.
$path = "/teams/{$id}/members/{$username}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Add a team member.
*
* @param int $id The team ID.
* @param string $username The user's username.
*
* @return string
* @since 3.2.0
**/
public function add(int $id, string $username): string
{
// Build the request path.
$path = "/teams/{$id}/members/{$username}";
// Send the put request.
return $this->response->get(
$this->http->put(
$this->uri->get($path), ''
), 204, 'success'
);
}
/**
* Remove a team member.
*
* @param int $id The team ID.
* @param string $username The user's username.
*
* @return string
* @since 3.2.0
**/
public function remove(int $id, string $username): string
{
// Build the request path.
$path = "/teams/{$id}/members/{$username}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1,135 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Gitea\Organization\Teams;
use VDM\Joomla\Gitea\Abstraction\Api;
/**
* The Gitea Organization Teams Repository
*
* @since 3.2.0
*/
class Repository extends Api
{
/**
* List a team's repos.
*
* @param int $teamId The team ID.
* @param int $pageNumber The page number of results to return (1-based).
* @param int $pageSize The page size of results.
*
* @return array|null
* @since 3.2.0
**/
public function list(
int $teamId,
int $pageNumber = 1,
int $pageSize = 10
): ?array
{
// Build the request path.
$path = "/teams/{$teamId}/repos";
// Get the URI object.
$uri = $this->uri->get($path);
// Add the query parameters for page number and page size.
$uri->setVar('page', $pageNumber);
$uri->setVar('limit', $pageSize);
// Send the get request.
return $this->response->get(
$this->http->get($uri)
);
}
/**
* List a particular repo of the team.
*
* @param int $teamId The team ID.
* @param string $organization The organization name.
* @param string $repository The repository name.
*
* @return object|null
* @since 3.2.0
**/
public function get(
int $teamId,
string $organization,
string $repository
): ?object
{
// Build the request path.
$path = "/teams/{$teamId}/repos/{$organization}/{$repository}";
// Send the get request.
return $this->response->get(
$this->http->get(
$this->uri->get($path)
)
);
}
/**
* Add a repository to a team.
*
* @param int $id The team ID.
* @param string $org The organization name.
* @param string $repo The repository name.
*
* @return string
* @since 3.2.0
**/
public function add(
int $id,
string $org,
string $repo
): string
{
// Build the request path.
$path = "/teams/{$id}/repos/{$org}/{$repo}";
// Send the put request.
return $this->response->get(
$this->http->put(
$this->uri->get($path), ''
),204, 'success'
);
}
/**
* Remove a repository from a team.
*
* @param int $id The team ID.
* @param string $org The organization name.
* @param string $repo The repository name.
*
* @return string
* @since 3.2.0
**/
public function remove(int $id, string $org, string $repo): string
{
// Build the request path.
$path = "/teams/{$id}/repos/{$org}/{$repo}";
// Send the delete request.
return $this->response->get(
$this->http->delete(
$this->uri->get($path)
), 204, 'success'
);
}
}

View File

@ -0,0 +1 @@
<html><body bgcolor="#FFFFFF"></body></html>

Some files were not shown because too many files have changed in this diff Show More