update sync order module
This commit is contained in:
		
							parent
							
								
									867e553946
								
							
						
					
					
						commit
						7ef2bef4db
					
				|  | @ -11,10 +11,10 @@ class Repository implements RepositoryInterface | ||||||
| { | { | ||||||
|     function __construct() |     function __construct() | ||||||
|     { |     { | ||||||
|         $this->authorization(); |         $this->_authorization(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private function authorization() |     private function _authorization() | ||||||
|     { |     { | ||||||
|         $headers = apache_request_headers(); |         $headers = apache_request_headers(); | ||||||
|         $apiKey = \IpSupply\SyncOrder\Helper::API_KEY; |         $apiKey = \IpSupply\SyncOrder\Helper::API_KEY; | ||||||
|  | @ -32,55 +32,51 @@ class Repository implements RepositoryInterface | ||||||
|         die(json_encode(['message' => 'unauthorized'])); |         die(json_encode(['message' => 'unauthorized'])); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private function _responseOk(array $data) |     static function getForm() | ||||||
|     { |     { | ||||||
|         header('HTTP/1.1 200 Ok'); |         $data = [ | ||||||
|         header('Accept: application/json'); |             'url' => '', | ||||||
|         header('Content-Type: application/json'); |         ]; | ||||||
|         die(json_encode($data)); | 
 | ||||||
|  |         $config = \IpSupply\SyncOrder\Config\Getter::get('config'); | ||||||
|  |         if ($config) { | ||||||
|  |             $data = json_decode($config, true); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     private function _responseFail(array $data) |         return [ | ||||||
|     { |             [ | ||||||
|         header('HTTP/1.1 400 Bad request'); |                 'label' => 'API', | ||||||
|         header('Accept: application/json'); |                 'name' => 'url', | ||||||
|         header('Content-Type: application/json'); |                 'value' => $data['url'] ?? '' | ||||||
|         die(json_encode($data)); |             ] | ||||||
|  |         ]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private function _responseMethodFail() |  | ||||||
|     { |  | ||||||
|         header('HTTP/1.1 400 bad request'); |  | ||||||
|         header('Accept: application/json'); |  | ||||||
|         header('Content-Type: application/json'); |  | ||||||
|         die(json_encode([ |  | ||||||
|             'status' => false, |  | ||||||
|             'message' => 'Param ?method=... not exist!' |  | ||||||
|         ])); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     public function getData() |     public function getData() | ||||||
|     { |     { | ||||||
|         return $this->_responseOk([ |         return \IpSupply\SyncOrder\Helper::responseOk([ | ||||||
|             'status' => true, |             'status' => true, | ||||||
|             'data' => [] |             'data' => [] | ||||||
|         ]); |         ]); | ||||||
|         // return $this->_responseMethodFail();
 |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public function postData() |     public function postData() | ||||||
|     { |     { | ||||||
|         parse_str( |         parse_str( | ||||||
|             string: file_get_contents('php://input'), |             string: file_get_contents('php://input'), | ||||||
|             result: $payload |             result: $payload, | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|         return $this->_responseOk([ |         unset($payload['form_key']); | ||||||
|             'status' => true, |  | ||||||
|             'data' => [], // TODO
 |  | ||||||
|             'payload' => $payload |  | ||||||
|         ]); |  | ||||||
| 
 | 
 | ||||||
|         // return $this->_responseMethodFail();
 |         \IpSupply\SyncOrder\Config\Setter::set( | ||||||
|  |             path: 'config', | ||||||
|  |             value: json_encode($payload), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         return \IpSupply\SyncOrder\Helper::responseOk([ | ||||||
|  |             'status' => true, | ||||||
|  |         ]); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,8 @@ | ||||||
| 
 | 
 | ||||||
| namespace IpSupply\SyncOrder\Api; | namespace IpSupply\SyncOrder\Api; | ||||||
| 
 | 
 | ||||||
|  | use Magento\Framework\Exception\LocalizedException; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * @api |  * @api | ||||||
|  */ |  */ | ||||||
|  | @ -15,8 +17,7 @@ interface RepositoryInterface | ||||||
|     public function getData(); |     public function getData(); | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * methot: POST |      * method: POST | ||||||
|      * |  | ||||||
|      * @return string |      * @return string | ||||||
|      */ |      */ | ||||||
|     public function postData(); |     public function postData(); | ||||||
|  |  | ||||||
|  | @ -26,4 +26,8 @@ class Config extends Template | ||||||
|     { |     { | ||||||
|         return \IpSupply\SyncOrder\Helper::API_KEY; |         return \IpSupply\SyncOrder\Helper::API_KEY; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     public function getForm() { | ||||||
|  |         return \IpSupply\SyncOrder\Api\Repository::getForm(); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\SyncOrder\Config; | ||||||
|  | 
 | ||||||
|  | use IpSupply\SyncOrder\Helper; | ||||||
|  | use Magento\Framework\App\Config\ScopeConfigInterface; | ||||||
|  | 
 | ||||||
|  | class Getter | ||||||
|  | { | ||||||
|  |     protected $scopeConfig; | ||||||
|  | 
 | ||||||
|  |     static function get($path, $prefix = true) | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |         $configGetter = $objectManager->create(self::class); | ||||||
|  |         $path = $prefix | ||||||
|  |             ? Helper::PREFIX . '/' . $path | ||||||
|  |             : $path; | ||||||
|  |         return $configGetter->getConfigValue($path); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function __construct(ScopeConfigInterface $scopeConfig) | ||||||
|  |     { | ||||||
|  |         $this->scopeConfig = $scopeConfig; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getConfigValue($fullPath) | ||||||
|  |     { | ||||||
|  |         return $this->scopeConfig->getValue($fullPath); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\SyncOrder\Config; | ||||||
|  | 
 | ||||||
|  | use IpSupply\SyncOrder\Helper; | ||||||
|  | use Magento\Framework\App\Config\Storage\WriterInterface; | ||||||
|  | 
 | ||||||
|  | class Setter | ||||||
|  | { | ||||||
|  |     protected $configWriter; | ||||||
|  | 
 | ||||||
|  |     static function set($path, $value, $prefix = true) | ||||||
|  |     { | ||||||
|  |         $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |         $configSetter = $objectManager->create(self::class); | ||||||
|  |         $path = $prefix | ||||||
|  |             ? Helper::PREFIX . '/' . $path | ||||||
|  |             : $path; | ||||||
|  |         $configSetter->setConfigValue($path, $value); | ||||||
|  | 
 | ||||||
|  |         // Clean cache old
 | ||||||
|  |         $cacheManager = $objectManager->get(\Magento\Framework\App\Cache\Manager::class); | ||||||
|  |         $cacheManager->flush(['config']); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function __construct(WriterInterface $configWriter) | ||||||
|  |     { | ||||||
|  |         $this->configWriter = $configWriter; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function setConfigValue($fullPath, $value) | ||||||
|  |     { | ||||||
|  |         $this->configWriter->save($fullPath, $value); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -4,4 +4,32 @@ namespace IpSupply\SyncOrder; | ||||||
| 
 | 
 | ||||||
| final class Helper { | final class Helper { | ||||||
|     public const API_KEY = 'IpSupply@123'; |     public const API_KEY = 'IpSupply@123'; | ||||||
|  |     public const PREFIX = 'IpSupply_SyncOrder'; | ||||||
|  | 
 | ||||||
|  |     static function responseOk(array $data) | ||||||
|  |     { | ||||||
|  |         header('HTTP/1.1 200 Ok'); | ||||||
|  |         header('Accept: application/json'); | ||||||
|  |         header('Content-Type: application/json'); | ||||||
|  |         die(json_encode($data)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     static function responseFail(array $data) | ||||||
|  |     { | ||||||
|  |         header('HTTP/1.1 400 Bad request'); | ||||||
|  |         header('Accept: application/json'); | ||||||
|  |         header('Content-Type: application/json'); | ||||||
|  |         die(json_encode($data)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     static function responseMethodFail() | ||||||
|  |     { | ||||||
|  |         header('HTTP/1.1 400 bad request'); | ||||||
|  |         header('Accept: application/json'); | ||||||
|  |         header('Content-Type: application/json'); | ||||||
|  |         die(json_encode([ | ||||||
|  |             'status' => false, | ||||||
|  |             'message' => 'Param ?method=... not exist!' | ||||||
|  |         ])); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\SyncOrder\Observer; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\Event\ObserverInterface; | ||||||
|  | 
 | ||||||
|  | class CheckOrderStatus implements ObserverInterface | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected $orderRepository; | ||||||
|  |     protected $dir; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         \Magento\Sales\Api\OrderRepositoryInterface $orderRepository, | ||||||
|  |         \Magento\Framework\Filesystem\DirectoryList $dir, | ||||||
|  |     ) { | ||||||
|  |         $this->orderRepository = $orderRepository; | ||||||
|  |         $this->dir = $dir; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function execute(\Magento\Framework\Event\Observer $observer) | ||||||
|  |     { | ||||||
|  |         $order = $observer->getEvent()->getOrder(); | ||||||
|  |         $customerId = $order->getCustomerId(); | ||||||
|  |         $OrderStatus = $order->getStatus(); | ||||||
|  |         $file = $this->dir->getPath('log') . '/' . 'CheckOrderStatus.log'; | ||||||
|  |         if (!file_exists($file)) { | ||||||
|  |             $fh = fopen($file, 'w') or die("Can't create file"); | ||||||
|  |             fclose($fh); | ||||||
|  |         } | ||||||
|  |         $current = file_get_contents($file); | ||||||
|  |         $current .= $customerId . ':' . $OrderStatus . " \n"; | ||||||
|  |         file_put_contents($file, $current); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,36 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\SyncOrder\Serialize\Serializer; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\Serialize\Serializer\Json as SerializerJson; | ||||||
|  | 
 | ||||||
|  | class Json extends SerializerJson | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      * @since 101.0.0 | ||||||
|  |      */ | ||||||
|  |     public function unserialize($string) | ||||||
|  |     { | ||||||
|  |         if ($string === null) { | ||||||
|  |             throw new \InvalidArgumentException( | ||||||
|  |                 'Unable to unserialize value. Error: Parameter must be a string type, null given.' | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $result = json_decode($string, true); | ||||||
|  | 
 | ||||||
|  |         if (json_last_error() !== JSON_ERROR_NONE) { | ||||||
|  |             parse_str($string, $result); | ||||||
|  |             if (is_array($result)) { | ||||||
|  |                 return $result; | ||||||
|  |             } else { | ||||||
|  |                 throw new \InvalidArgumentException( | ||||||
|  |                     $string . " - Unable to unserialize value. Error: " . json_last_error_msg() | ||||||
|  |                 ); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $result; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,33 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\SyncOrder\Setup; | ||||||
|  | 
 | ||||||
|  | use Magento\Catalog\Model\Product; | ||||||
|  | use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface; | ||||||
|  | use Magento\Framework\Setup\ModuleContextInterface; | ||||||
|  | use Magento\Framework\Setup\ModuleDataSetupInterface; | ||||||
|  | use Magento\Framework\Setup\UpgradeDataInterface; | ||||||
|  | 
 | ||||||
|  | class UpgradeData implements UpgradeDataInterface | ||||||
|  | { | ||||||
|  |     protected $_eavSetupFactory; | ||||||
|  |     protected $_attributeRepositoryInterface; | ||||||
|  |     protected $_attributeSetupFactory; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         \Magento\Eav\Setup\EavSetupFactory $eavSetupFactory, | ||||||
|  |         \Magento\Eav\Api\AttributeRepositoryInterface $attributeRepositoryInterface, | ||||||
|  |         \Magento\Catalog\Setup\CategorySetupFactory $attributeSetupFactory | ||||||
|  |     ) { | ||||||
|  |         $this->_eavSetupFactory = $eavSetupFactory; | ||||||
|  |         $this->_attributeRepositoryInterface = $attributeRepositoryInterface; | ||||||
|  |         $this->_attributeSetupFactory = $attributeSetupFactory; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) | ||||||
|  |     { | ||||||
|  |         \IpSupply\SyncOrder\Config\Setter::set(path: 'config', value: json_encode([ | ||||||
|  |             'url' => 'https://google.com' // TODO: config api
 | ||||||
|  |         ])); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> | ||||||
|  |     <!-- Repository --> | ||||||
|  |     <preference | ||||||
|  |         for="IpSupply\SyncOrder\Api\RepositoryInterface" | ||||||
|  |         type="IpSupply\SyncOrder\Api\Repository" | ||||||
|  |     /> | ||||||
|  | 
 | ||||||
|  |     <preference | ||||||
|  |         for="Magento\Framework\Serialize\Serializer\Json" | ||||||
|  |         type="IpSupply\SyncOrder\Serialize\Serializer\Json" | ||||||
|  |     /> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> | ||||||
|  |     <event name="sales_order_save_after"> | ||||||
|  |         <observer name="syncorder_sales_order_save_after" instance="IpSupply\SyncOrder\Observer\CheckOrderStatus" /> | ||||||
|  |     </event> | ||||||
|  | </config> | ||||||
|  | @ -1,12 +1,12 @@ | ||||||
| <?xml version="1.0"?> | <?xml version="1.0"?> | ||||||
| <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd"> | <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd"> | ||||||
|     <route url="ipsupply/syncorder/sync" method="GET"> |     <route url="V1/syncorder/config" method="GET"> | ||||||
|         <service class="IpSupply\SyncOrder\Api\RepositoryInterface" method="getData"/> |         <service class="IpSupply\SyncOrder\Api\RepositoryInterface" method="getData"/> | ||||||
|         <resources> |         <resources> | ||||||
|             <resource ref="anonymous"/> |             <resource ref="anonymous"/> | ||||||
|         </resources> |         </resources> | ||||||
|     </route> |     </route> | ||||||
|     <route url="ipsupply/syncorder/sync" method="POST"> |     <route url="V1/syncorder/config" method="POST"> | ||||||
|         <service class="IpSupply\SyncOrder\Api\RepositoryInterface" method="postData"/> |         <service class="IpSupply\SyncOrder\Api\RepositoryInterface" method="postData"/> | ||||||
|         <resources> |         <resources> | ||||||
|             <resource ref="anonymous"/> |             <resource ref="anonymous"/> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page | ||||||
|  |     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  |     xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" | ||||||
|  | > | ||||||
|  |     <head> | ||||||
|  |         <css src="IpSupply_SyncOrder::css/config.css" /> | ||||||
|  |     </head> | ||||||
|  | </page> | ||||||
|  | @ -1,14 +1,16 @@ | ||||||
| <?xml version="1.0"?> | <?xml version="1.0"?> | ||||||
| <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | <page | ||||||
|  |     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  |     xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" | ||||||
|  | > | ||||||
|     <head> |     <head> | ||||||
|         <css src="IpSupply_SyncOrder::css/config.css" /> |         <css src="IpSupply_SyncOrder::css/config.css" /> | ||||||
|     </head> |     </head> | ||||||
|     <body> |     <referenceBlock name="content"> | ||||||
|         <referenceContainer name="content"> |         <block | ||||||
|             <block class="IpSupply\SyncOrder\Block\Adminhtml\Config" template="IpSupply_SyncOrder::syncorder_config.phtml"/> |             class="IpSupply\SyncOrder\Block\Adminhtml\Config" | ||||||
|             <!-- |             template="IpSupply_SyncOrder::syncorder_config.phtml" | ||||||
|                 Template: IpSupply_SyncOrder::syncorder_config.phtml to ../templates/syncorder_config.phtml |         /> | ||||||
|             --> |         <!-- Template: IpSupply_SyncOrder::syncorder_config.phtml to ../templates/syncorder_config.phtml --> | ||||||
|         </referenceContainer> |     </referenceBlock> | ||||||
|     </body> |  | ||||||
| </page> | </page> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,76 @@ | ||||||
|  | <div class="ipsupply"> | ||||||
|  |     <form id="form"> | ||||||
|  |         <?php foreach ($block->getForm() as $field) : ?> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="<?= $field['name'] ?>"><?= $field['label'] ?></label> | ||||||
|  |                 <input type="text" id="<?= $field['name'] ?>" name="<?= $field['name'] ?>" value="<?= $field['value'] ?>" /> | ||||||
|  |             </div> | ||||||
|  |         <?php endforeach ?> | ||||||
|  | 
 | ||||||
|  |         <div class="form-group"> | ||||||
|  |             <button class="submit" type="submit">Save</button> | ||||||
|  |         </div> | ||||||
|  |     </form> | ||||||
|  | </div> | ||||||
|  | <script> | ||||||
|  |     const AJAX_URL = location.origin + "/rest/V1/syncorder/config"; // TODO: need /sync to /config | ||||||
|  | 
 | ||||||
|  |     require([ | ||||||
|  |         "jquery", | ||||||
|  |         "mage/translate", | ||||||
|  |         "uiComponent", | ||||||
|  |         "ko", | ||||||
|  |         "Magento_Ui/js/modal/alert", | ||||||
|  |         "Magento_Ui/js/modal/confirm", | ||||||
|  |         "Magento_Ui/js/modal/modal", | ||||||
|  |     ], function($, $t, Component, ko, alertModal, confirmModal, modal) { | ||||||
|  |         "use strict"; | ||||||
|  |         $.ajaxSetup({ | ||||||
|  |             contentType: "application/json;", | ||||||
|  |             headers: { | ||||||
|  |                 API_KEY: "<?= $block->getApiKey() ?>", | ||||||
|  |             }, | ||||||
|  |             success: function(data) { | ||||||
|  |                 // do something before xhr | ||||||
|  |             }, | ||||||
|  |             fail: function(error) { | ||||||
|  |                 console.error(error); | ||||||
|  |                 alertModal({ | ||||||
|  |                     content: error.message, | ||||||
|  |                 }); | ||||||
|  |             }, | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         // Event | ||||||
|  |         $("#form").on("submit", function(e) { | ||||||
|  |             e.preventDefault(); | ||||||
|  |             e.stopPropagation(); | ||||||
|  |             $(this) | ||||||
|  |                 .find('[type=submit]') | ||||||
|  |                 .attr('disabled', 'disabled'); | ||||||
|  | 
 | ||||||
|  |             $.post(AJAX_URL, $(this).serialize()) | ||||||
|  |                 .then(res => { | ||||||
|  |                     if (res.status) { | ||||||
|  |                         alertModal({ | ||||||
|  |                             content: 'Successfully: Data saved!' | ||||||
|  |                         }) | ||||||
|  |                     } else { | ||||||
|  |                         alertModal({ | ||||||
|  |                             content: 'Failed: Data not saved!' | ||||||
|  |                         }) | ||||||
|  |                     } | ||||||
|  |                 }) | ||||||
|  |                 .catch(() => { | ||||||
|  |                     alertModal({ | ||||||
|  |                         content: 'Fail saved!' | ||||||
|  |                     }) | ||||||
|  |                 }) | ||||||
|  |                 .then(() => { | ||||||
|  |                     $(this) | ||||||
|  |                         .find('[type=submit]') | ||||||
|  |                         .removeAttr('disabled'); | ||||||
|  |                 }) | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | </script> | ||||||
|  | @ -0,0 +1,47 @@ | ||||||
|  | .ipsupply { | ||||||
|  |   box-sizing: border-box; | ||||||
|  |   font-size: 16px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ipsupply button { | ||||||
|  |   background: #eb5202; | ||||||
|  |   color: #fff; | ||||||
|  |   border: none; | ||||||
|  |   outline: 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ipsupply form { | ||||||
|  |   box-sizing: border-box; | ||||||
|  |   padding: 20px; | ||||||
|  |   border: 1.5px solid #aca; | ||||||
|  |   max-width: 600px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ipsupply form .form-group { | ||||||
|  |   margin-bottom: 10px; | ||||||
|  |   display: flex; | ||||||
|  |   justify-content: space-between; | ||||||
|  |   align-items: center; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ipsupply form .form-group label { | ||||||
|  |   font-weight: bold; | ||||||
|  |   text-transform: uppercase; | ||||||
|  |   margin-right: 5px; | ||||||
|  |   min-width: 70px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ipsupply form .form-group label::after { | ||||||
|  |   content: ":"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ipsupply form .form-group input { | ||||||
|  |   outline: 0; | ||||||
|  |   border: 1px solid #aca; | ||||||
|  |   padding: 3px 5px; | ||||||
|  |   width: 100%; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ipsupply form .form-group [type=submit] { | ||||||
|  |   width: 100%; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue