From 805d35704846b2101698f12ddbf6dc6c5d95ab11 Mon Sep 17 00:00:00 2001 From: Nazri Hamzah Date: Fri, 27 Apr 2018 18:03:16 +0800 Subject: [PATCH] add model,controller,migration,api --- .idea/exchange.iml | 1 + .idea/php.xml | 1 + .idea/workspace.xml | 375 +++-- app/Exceptions/Handler.php | 8 + app/Http/Controllers/RateController.php | 40 + .../SettingBeneficiaryController.php | 40 + .../Controllers/SettingCreditController.php | 40 + .../Controllers/SettingSupplierController.php | 40 + app/Rate.php | 2 +- app/SettingBeneficiary.php | 10 + app/SettingCIEFBeneficiary.php | 10 - app/SettingCredit.php | 10 + app/SettingSupplier.php | 2 +- app/TimeLimit.php | 10 - composer.json | 3 +- composer.lock | 72 +- config/app.php | 3 +- database/factories/RateFactory.php | 9 + .../factories/SettingBeneficiaryFactory.php | 9 + database/factories/SettingCreditFactory.php | 9 + database/factories/SettingSupplierFactory.php | 9 + ... 2018_04_25_085705_create_rates_table.php} | 0 ...5_090015_create_setting_credits_table.php} | 6 +- ...090031_create_setting_suppliers_table.php} | 0 ...57_create_setting_beneficiaries_table.php} | 8 +- routes/api.php | 132 ++ vendor/composer/autoload_classmap.php | 14 +- vendor/composer/autoload_files.php | 1 + vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_static.php | 20 +- vendor/composer/installed.json | 70 + vendor/laravelcollective/html/CONTRIBUTING.md | 3 + vendor/laravelcollective/html/LICENSE.txt | 21 + vendor/laravelcollective/html/composer.json | 57 + vendor/laravelcollective/html/readme.md | 9 + .../html/src/Componentable.php | 110 ++ .../html/src/Eloquent/FormAccessible.php | 119 ++ .../html/src/FormBuilder.php | 1360 +++++++++++++++++ .../laravelcollective/html/src/FormFacade.php | 22 + .../html/src/HtmlBuilder.php | 566 +++++++ .../laravelcollective/html/src/HtmlFacade.php | 22 + .../html/src/HtmlServiceProvider.php | 107 ++ vendor/laravelcollective/html/src/helpers.php | 70 + 43 files changed, 3254 insertions(+), 167 deletions(-) create mode 100644 app/Http/Controllers/RateController.php create mode 100644 app/Http/Controllers/SettingBeneficiaryController.php create mode 100644 app/Http/Controllers/SettingCreditController.php create mode 100644 app/Http/Controllers/SettingSupplierController.php create mode 100644 app/SettingBeneficiary.php delete mode 100644 app/SettingCIEFBeneficiary.php create mode 100644 app/SettingCredit.php delete mode 100644 app/TimeLimit.php create mode 100644 database/factories/RateFactory.php create mode 100644 database/factories/SettingBeneficiaryFactory.php create mode 100644 database/factories/SettingCreditFactory.php create mode 100644 database/factories/SettingSupplierFactory.php rename database/migrations/{2018_04_23_030854_create_rates_table.php => 2018_04_25_085705_create_rates_table.php} (100%) rename database/migrations/{2018_04_23_033128_create_time_limits_table.php => 2018_04_25_090015_create_setting_credits_table.php} (76%) rename database/migrations/{2018_04_23_032746_create_setting_suppliers_table.php => 2018_04_25_090031_create_setting_suppliers_table.php} (100%) rename database/migrations/{2018_04_23_033425_create_setting_c_i_e_f_beneficiaries_table.php => 2018_04_25_090057_create_setting_beneficiaries_table.php} (72%) create mode 100755 vendor/laravelcollective/html/CONTRIBUTING.md create mode 100644 vendor/laravelcollective/html/LICENSE.txt create mode 100755 vendor/laravelcollective/html/composer.json create mode 100644 vendor/laravelcollective/html/readme.md create mode 100644 vendor/laravelcollective/html/src/Componentable.php create mode 100644 vendor/laravelcollective/html/src/Eloquent/FormAccessible.php create mode 100644 vendor/laravelcollective/html/src/FormBuilder.php create mode 100644 vendor/laravelcollective/html/src/FormFacade.php create mode 100755 vendor/laravelcollective/html/src/HtmlBuilder.php create mode 100644 vendor/laravelcollective/html/src/HtmlFacade.php create mode 100755 vendor/laravelcollective/html/src/HtmlServiceProvider.php create mode 100644 vendor/laravelcollective/html/src/helpers.php diff --git a/.idea/exchange.iml b/.idea/exchange.iml index e596649c..ae29d527 100644 --- a/.idea/exchange.iml +++ b/.idea/exchange.iml @@ -20,6 +20,7 @@ + diff --git a/.idea/php.xml b/.idea/php.xml index d0b92ee8..ab7087a0 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -73,6 +73,7 @@ + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 357c6527..968a365c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,27 @@ - + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - + + - + @@ -68,8 +70,26 @@ @@ -158,15 +178,18 @@ + - + + - @@ -176,35 +199,47 @@ - - + + - - - + + + - - - - + + + + - - - + + + + + - - - - + + + - - - + + + + + + + + + + + + + + "); + } + + /** + * Create a select range field. + * + * @param string $name + * @param string $begin + * @param string $end + * @param string $selected + * @param array $options + * + * @return \Illuminate\Support\HtmlString + */ + public function selectRange($name, $begin, $end, $selected = null, $options = []) + { + $range = array_combine($range = range($begin, $end), $range); + + return $this->select($name, $range, $selected, $options); + } + + /** + * Create a select year field. + * + * @param string $name + * @param string $begin + * @param string $end + * @param string $selected + * @param array $options + * + * @return mixed + */ + public function selectYear() + { + return call_user_func_array([$this, 'selectRange'], func_get_args()); + } + + /** + * Create a select month field. + * + * @param string $name + * @param string $selected + * @param array $options + * @param string $format + * + * @return \Illuminate\Support\HtmlString + */ + public function selectMonth($name, $selected = null, $options = [], $format = '%B') + { + $months = []; + + foreach (range(1, 12) as $month) { + $months[$month] = strftime($format, mktime(0, 0, 0, $month, 1)); + } + + return $this->select($name, $months, $selected, $options); + } + + /** + * Get the select option for the given value. + * + * @param string $display + * @param string $value + * @param string $selected + * @param array $attributes + * @param array $optgroupAttributes + * + * @return \Illuminate\Support\HtmlString + */ + public function getSelectOption($display, $value, $selected, array $attributes = [], array $optgroupAttributes = []) + { + if (is_array($display)) { + return $this->optionGroup($display, $value, $selected, $optgroupAttributes, $attributes); + } + + return $this->option($display, $value, $selected, $attributes); + } + + /** + * Create an option group form element. + * + * @param array $list + * @param string $label + * @param string $selected + * @param array $attributes + * @param array $optionsAttributes + * @param integer $level + * + * @return \Illuminate\Support\HtmlString + */ + protected function optionGroup($list, $label, $selected, array $attributes = [], array $optionsAttributes = [], $level = 0) + { + $html = []; + $space = str_repeat(" ", $level); + foreach ($list as $value => $display) { + $optionAttributes = $optionsAttributes[$value] ?? []; + if (is_array($display)) { + $html[] = $this->optionGroup($display, $value, $selected, $attributes, $optionAttributes, $level+5); + } else { + $html[] = $this->option($space.$display, $value, $selected, $optionAttributes); + } + } + return $this->toHtmlString('html->attributes($attributes) . '>' . implode('', $html) . ''); + } + + /** + * Create a select element option. + * + * @param string $display + * @param string $value + * @param string $selected + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + protected function option($display, $value, $selected, array $attributes = []) + { + $selected = $this->getSelectedValue($value, $selected); + + $options = array_merge(['value' => $value, 'selected' => $selected], $attributes); + + $string = 'html->attributes($options) . '>'; + if ($display !== null) { + $string .= e($display, false) . ''; + } + + return $this->toHtmlString($string); + } + + /** + * Create a placeholder select element option. + * + * @param $display + * @param $selected + * + * @return \Illuminate\Support\HtmlString + */ + protected function placeholderOption($display, $selected) + { + $selected = $this->getSelectedValue(null, $selected); + + $options = [ + 'selected' => $selected, + 'value' => '', + ]; + + return $this->toHtmlString('html->attributes($options) . '>' . e($display, false) . ''); + } + + /** + * Determine if the value is selected. + * + * @param string $value + * @param string $selected + * + * @return null|string + */ + protected function getSelectedValue($value, $selected) + { + if (is_array($selected)) { + return in_array($value, $selected, true) || in_array((string) $value, $selected, true) ? 'selected' : null; + } elseif ($selected instanceof Collection) { + return $selected->contains($value) ? 'selected' : null; + } + if (is_int($value) && is_bool($selected)) { + return (bool)$value === $selected; + } + return ((string) $value === (string) $selected) ? 'selected' : null; + } + + /** + * Create a checkbox input field. + * + * @param string $name + * @param mixed $value + * @param bool $checked + * @param array $options + * + * @return \Illuminate\Support\HtmlString + */ + public function checkbox($name, $value = 1, $checked = null, $options = []) + { + return $this->checkable('checkbox', $name, $value, $checked, $options); + } + + /** + * Create a radio button input field. + * + * @param string $name + * @param mixed $value + * @param bool $checked + * @param array $options + * + * @return \Illuminate\Support\HtmlString + */ + public function radio($name, $value = null, $checked = null, $options = []) + { + if (is_null($value)) { + $value = $name; + } + + return $this->checkable('radio', $name, $value, $checked, $options); + } + + /** + * Create a checkable input field. + * + * @param string $type + * @param string $name + * @param mixed $value + * @param bool $checked + * @param array $options + * + * @return \Illuminate\Support\HtmlString + */ + protected function checkable($type, $name, $value, $checked, $options) + { + $this->type = $type; + + $checked = $this->getCheckedState($type, $name, $value, $checked); + + if ($checked) { + $options['checked'] = 'checked'; + } + + return $this->input($type, $name, $value, $options); + } + + /** + * Get the check state for a checkable input. + * + * @param string $type + * @param string $name + * @param mixed $value + * @param bool $checked + * + * @return bool + */ + protected function getCheckedState($type, $name, $value, $checked) + { + switch ($type) { + case 'checkbox': + return $this->getCheckboxCheckedState($name, $value, $checked); + + case 'radio': + return $this->getRadioCheckedState($name, $value, $checked); + + default: + return $this->compareValues($name, $value); + } + } + + /** + * Get the check state for a checkbox input. + * + * @param string $name + * @param mixed $value + * @param bool $checked + * + * @return bool + */ + protected function getCheckboxCheckedState($name, $value, $checked) + { + $request = $this->request($name); + + if (isset($this->session) && ! $this->oldInputIsEmpty() && is_null($this->old($name)) && !$request) { + return false; + } + + if ($this->missingOldAndModel($name) && is_null($request)) { + return $checked; + } + + $posted = $this->getValueAttribute($name, $checked); + + if (is_array($posted)) { + return in_array($value, $posted); + } elseif ($posted instanceof Collection) { + return $posted->contains('id', $value); + } else { + return (bool) $posted; + } + } + + /** + * Get the check state for a radio input. + * + * @param string $name + * @param mixed $value + * @param bool $checked + * + * @return bool + */ + protected function getRadioCheckedState($name, $value, $checked) + { + $request = $this->request($name); + + if ($this->missingOldAndModel($name) && !$request) { + return $checked; + } + + return $this->compareValues($name, $value); + } + + /** + * Determine if the provide value loosely compares to the value assigned to the field. + * Use loose comparison because Laravel model casting may be in affect and therefore + * 1 == true and 0 == false. + * + * @param string $name + * @param string $value + * @return bool + */ + protected function compareValues($name, $value) + { + return $this->getValueAttribute($name) == $value; + } + + /** + * Determine if old input or model input exists for a key. + * + * @param string $name + * + * @return bool + */ + protected function missingOldAndModel($name) + { + return (is_null($this->old($name)) && is_null($this->getModelValueAttribute($name))); + } + + /** + * Create a HTML reset input element. + * + * @param string $value + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function reset($value, $attributes = []) + { + return $this->input('reset', null, $value, $attributes); + } + + /** + * Create a HTML image input element. + * + * @param string $url + * @param string $name + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function image($url, $name = null, $attributes = []) + { + $attributes['src'] = $this->url->asset($url); + + return $this->input('image', $name, null, $attributes); + } + + /** + * Create a color input field. + * + * @param string $name + * @param string $value + * @param array $options + * + * @return \Illuminate\Support\HtmlString + */ + public function color($name, $value = null, $options = []) + { + return $this->input('color', $name, $value, $options); + } + + /** + * Create a submit button element. + * + * @param string $value + * @param array $options + * + * @return \Illuminate\Support\HtmlString + */ + public function submit($value = null, $options = []) + { + return $this->input('submit', null, $value, $options); + } + + /** + * Create a button element. + * + * @param string $value + * @param array $options + * + * @return \Illuminate\Support\HtmlString + */ + public function button($value = null, $options = []) + { + if (! array_key_exists('type', $options)) { + $options['type'] = 'button'; + } + + return $this->toHtmlString('html->attributes($options) . '>' . $value . ''); + } + + /** + * Parse the form action method. + * + * @param string $method + * + * @return string + */ + protected function getMethod($method) + { + $method = strtoupper($method); + + return $method !== 'GET' ? 'POST' : $method; + } + + /** + * Get the form action from the options. + * + * @param array $options + * + * @return string + */ + protected function getAction(array $options) + { + // We will also check for a "route" or "action" parameter on the array so that + // developers can easily specify a route or controller action when creating + // a form providing a convenient interface for creating the form actions. + if (isset($options['url'])) { + return $this->getUrlAction($options['url']); + } + + if (isset($options['route'])) { + return $this->getRouteAction($options['route']); + } + + // If an action is available, we are attempting to open a form to a controller + // action route. So, we will use the URL generator to get the path to these + // actions and return them from the method. Otherwise, we'll use current. + elseif (isset($options['action'])) { + return $this->getControllerAction($options['action']); + } + + return $this->url->current(); + } + + /** + * Get the action for a "url" option. + * + * @param array|string $options + * + * @return string + */ + protected function getUrlAction($options) + { + if (is_array($options)) { + return $this->url->to($options[0], array_slice($options, 1)); + } + + return $this->url->to($options); + } + + /** + * Get the action for a "route" option. + * + * @param array|string $options + * + * @return string + */ + protected function getRouteAction($options) + { + if (is_array($options)) { + return $this->url->route($options[0], array_slice($options, 1)); + } + + return $this->url->route($options); + } + + /** + * Get the action for an "action" option. + * + * @param array|string $options + * + * @return string + */ + protected function getControllerAction($options) + { + if (is_array($options)) { + return $this->url->action($options[0], array_slice($options, 1)); + } + + return $this->url->action($options); + } + + /** + * Get the form appendage for the given method. + * + * @param string $method + * + * @return string + */ + protected function getAppendage($method) + { + list($method, $appendage) = [strtoupper($method), '']; + + // If the HTTP method is in this list of spoofed methods, we will attach the + // method spoofer hidden input to the form. This allows us to use regular + // form to initiate PUT and DELETE requests in addition to the typical. + if (in_array($method, $this->spoofedMethods)) { + $appendage .= $this->hidden('_method', $method); + } + + // If the method is something other than GET we will go ahead and attach the + // CSRF token to the form, as this can't hurt and is convenient to simply + // always have available on every form the developers creates for them. + if ($method !== 'GET') { + $appendage .= $this->token(); + } + + return $appendage; + } + + /** + * Get the ID attribute for a field name. + * + * @param string $name + * @param array $attributes + * + * @return string + */ + public function getIdAttribute($name, $attributes) + { + if (array_key_exists('id', $attributes)) { + return $attributes['id']; + } + + if (in_array($name, $this->labels)) { + return $name; + } + } + + /** + * Get the value that should be assigned to the field. + * + * @param string $name + * @param string $value + * + * @return mixed + */ + public function getValueAttribute($name, $value = null) + { + if (is_null($name)) { + return $value; + } + + $old = $this->old($name); + + if (! is_null($old) && $name !== '_method') { + return $old; + } + + if (function_exists('app')) { + $hasNullMiddleware = app("Illuminate\Contracts\Http\Kernel") + ->hasMiddleware(ConvertEmptyStringsToNull::class); + + if ($hasNullMiddleware + && is_null($old) + && is_null($value) + && ! is_null($this->view->shared('errors')) + && count($this->view->shared('errors')) > 0 + ) { + return null; + } + } + + $request = $this->request($name); + if (! is_null($request) && $name != '_method') { + return $request; + } + + if (! is_null($value)) { + return $value; + } + + if (isset($this->model)) { + return $this->getModelValueAttribute($name); + } + } + + /** + * Get value from current Request + * @param $name + * @return array|null|string + */ + protected function request($name) + { + if (! isset($this->request)) { + return null; + } + + return $this->request->input($this->transformKey($name)); + } + + /** + * Get the model value that should be assigned to the field. + * + * @param string $name + * + * @return mixed + */ + protected function getModelValueAttribute($name) + { + $key = $this->transformKey($name); + + if (method_exists($this->model, 'getFormValue')) { + return $this->model->getFormValue($key); + } + + return data_get($this->model, $this->transformKey($name)); + } + + /** + * Get a value from the session's old input. + * + * @param string $name + * + * @return mixed + */ + public function old($name) + { + if (isset($this->session)) { + $key = $this->transformKey($name); + $payload = $this->session->getOldInput($key); + + if (! is_array($payload)) { + return $payload; + } + + if (! in_array($this->type, ['select', 'checkbox'])) { + if (! isset($this->payload[$key])) { + $this->payload[$key] = collect($payload); + } + + if (! empty($this->payload[$key])) { + $value = $this->payload[$key]->shift(); + return $value; + } + } + + return $payload; + } + } + + /** + * Determine if the old input is empty. + * + * @return bool + */ + public function oldInputIsEmpty() + { + return (isset($this->session) && count((array) $this->session->getOldInput()) === 0); + } + + /** + * Transform key from array to dot syntax. + * + * @param string $key + * + * @return mixed + */ + protected function transformKey($key) + { + return str_replace(['.', '[]', '[', ']'], ['_', '', '.', ''], $key); + } + + /** + * Transform the string to an Html serializable object + * + * @param $html + * + * @return \Illuminate\Support\HtmlString + */ + protected function toHtmlString($html) + { + return new HtmlString($html); + } + + /** + * Get the session store implementation. + * + * @return \Illuminate\Contracts\Session\Session $session + */ + public function getSessionStore() + { + return $this->session; + } + + /** + * Set the session store implementation. + * + * @param \Illuminate\Contracts\Session\Session $session + * + * @return $this + */ + public function setSessionStore(Session $session) + { + $this->session = $session; + + return $this; + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method + * @param array $parameters + * + * @return \Illuminate\Contracts\View\View|mixed + * + * @throws \BadMethodCallException + */ + public function __call($method, $parameters) + { + if (static::hasComponent($method)) { + return $this->componentCall($method, $parameters); + } + + if (static::hasMacro($method)) { + return $this->macroCall($method, $parameters); + } + + throw new BadMethodCallException("Method {$method} does not exist."); + } +} diff --git a/vendor/laravelcollective/html/src/FormFacade.php b/vendor/laravelcollective/html/src/FormFacade.php new file mode 100644 index 00000000..24d2610e --- /dev/null +++ b/vendor/laravelcollective/html/src/FormFacade.php @@ -0,0 +1,22 @@ +url = $url; + $this->view = $view; + } + + /** + * Convert an HTML string to entities. + * + * @param string $value + * + * @return string + */ + public function entities($value) + { + return htmlentities($value, ENT_QUOTES, 'UTF-8', false); + } + + /** + * Convert entities to HTML characters. + * + * @param string $value + * + * @return string + */ + public function decode($value) + { + return html_entity_decode($value, ENT_QUOTES, 'UTF-8'); + } + + /** + * Generate a link to a JavaScript file. + * + * @param string $url + * @param array $attributes + * @param bool $secure + * + * @return \Illuminate\Support\HtmlString + */ + public function script($url, $attributes = [], $secure = null) + { + $attributes['src'] = $this->url->asset($url, $secure); + + return $this->toHtmlString('attributes($attributes) . '>'); + } + + /** + * Generate a link to a CSS file. + * + * @param string $url + * @param array $attributes + * @param bool $secure + * + * @return \Illuminate\Support\HtmlString + */ + public function style($url, $attributes = [], $secure = null) + { + $defaults = ['media' => 'all', 'type' => 'text/css', 'rel' => 'stylesheet']; + + $attributes = array_merge($defaults, $attributes); + + $attributes['href'] = $this->url->asset($url, $secure); + + return $this->toHtmlString('attributes($attributes) . '>'); + } + + /** + * Generate an HTML image element. + * + * @param string $url + * @param string $alt + * @param array $attributes + * @param bool $secure + * + * @return \Illuminate\Support\HtmlString + */ + public function image($url, $alt = null, $attributes = [], $secure = null) + { + $attributes['alt'] = $alt; + + return $this->toHtmlString('attributes($attributes) . '>'); + } + + /** + * Generate a link to a Favicon file. + * + * @param string $url + * @param array $attributes + * @param bool $secure + * + * @return \Illuminate\Support\HtmlString + */ + public function favicon($url, $attributes = [], $secure = null) + { + $defaults = ['rel' => 'shortcut icon', 'type' => 'image/x-icon']; + + $attributes = array_merge($attributes, $defaults); + + $attributes['href'] = $this->url->asset($url, $secure); + + return $this->toHtmlString('attributes($attributes) . '>'); + } + + /** + * Generate a HTML link. + * + * @param string $url + * @param string $title + * @param array $attributes + * @param bool $secure + * @param bool $escape + * + * @return \Illuminate\Support\HtmlString + */ + public function link($url, $title = null, $attributes = [], $secure = null, $escape = true) + { + $url = $this->url->to($url, [], $secure); + + if (is_null($title) || $title === false) { + $title = $url; + } + + if ($escape) { + $title = $this->entities($title); + } + + return $this->toHtmlString('attributes($attributes) . '>' . $title . ''); + } + + /** + * Generate a HTTPS HTML link. + * + * @param string $url + * @param string $title + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function secureLink($url, $title = null, $attributes = []) + { + return $this->link($url, $title, $attributes, true); + } + + /** + * Generate a HTML link to an asset. + * + * @param string $url + * @param string $title + * @param array $attributes + * @param bool $secure + * + * @return \Illuminate\Support\HtmlString + */ + public function linkAsset($url, $title = null, $attributes = [], $secure = null) + { + $url = $this->url->asset($url, $secure); + + return $this->link($url, $title ?: $url, $attributes, $secure); + } + + /** + * Generate a HTTPS HTML link to an asset. + * + * @param string $url + * @param string $title + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function linkSecureAsset($url, $title = null, $attributes = []) + { + return $this->linkAsset($url, $title, $attributes, true); + } + + /** + * Generate a HTML link to a named route. + * + * @param string $name + * @param string $title + * @param array $parameters + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function linkRoute($name, $title = null, $parameters = [], $attributes = []) + { + return $this->link($this->url->route($name, $parameters), $title, $attributes); + } + + /** + * Generate a HTML link to a controller action. + * + * @param string $action + * @param string $title + * @param array $parameters + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function linkAction($action, $title = null, $parameters = [], $attributes = []) + { + return $this->link($this->url->action($action, $parameters), $title, $attributes); + } + + /** + * Generate a HTML link to an email address. + * + * @param string $email + * @param string $title + * @param array $attributes + * @param bool $escape + * + * @return \Illuminate\Support\HtmlString + */ + public function mailto($email, $title = null, $attributes = [], $escape = true) + { + $email = $this->email($email); + + $title = $title ?: $email; + + if ($escape) { + $title = $this->entities($title); + } + + $email = $this->obfuscate('mailto:') . $email; + + return $this->toHtmlString('attributes($attributes) . '>' . $title . ''); + } + + /** + * Obfuscate an e-mail address to prevent spam-bots from sniffing it. + * + * @param string $email + * + * @return string + */ + public function email($email) + { + return str_replace('@', '@', $this->obfuscate($email)); + } + + /** + * Generates non-breaking space entities based on number supplied. + * + * @param int $num + * + * @return string + */ + public function nbsp($num = 1) + { + return str_repeat(' ', $num); + } + + /** + * Generate an ordered list of items. + * + * @param array $list + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString|string + */ + public function ol($list, $attributes = []) + { + return $this->listing('ol', $list, $attributes); + } + + /** + * Generate an un-ordered list of items. + * + * @param array $list + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString|string + */ + public function ul($list, $attributes = []) + { + return $this->listing('ul', $list, $attributes); + } + + /** + * Generate a description list of items. + * + * @param array $list + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function dl(array $list, array $attributes = []) + { + $attributes = $this->attributes($attributes); + + $html = ""; + + foreach ($list as $key => $value) { + $value = (array) $value; + + $html .= "
$key
"; + + foreach ($value as $v_key => $v_value) { + $html .= "
$v_value
"; + } + } + + $html .= ''; + + return $this->toHtmlString($html); + } + + /** + * Create a listing HTML element. + * + * @param string $type + * @param array $list + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString|string + */ + protected function listing($type, $list, $attributes = []) + { + $html = ''; + + if (count($list) === 0) { + return $html; + } + + // Essentially we will just spin through the list and build the list of the HTML + // elements from the array. We will also handled nested lists in case that is + // present in the array. Then we will build out the final listing elements. + foreach ($list as $key => $value) { + $html .= $this->listingElement($key, $type, $value); + } + + $attributes = $this->attributes($attributes); + + return $this->toHtmlString("<{$type}{$attributes}>{$html}"); + } + + /** + * Create the HTML for a listing element. + * + * @param mixed $key + * @param string $type + * @param mixed $value + * + * @return string + */ + protected function listingElement($key, $type, $value) + { + if (is_array($value)) { + return $this->nestedListing($key, $type, $value); + } else { + return '
  • ' . e($value, false) . '
  • '; + } + } + + /** + * Create the HTML for a nested listing attribute. + * + * @param mixed $key + * @param string $type + * @param mixed $value + * + * @return string + */ + protected function nestedListing($key, $type, $value) + { + if (is_int($key)) { + return $this->listing($type, $value); + } else { + return '
  • ' . $key . $this->listing($type, $value) . '
  • '; + } + } + + /** + * Build an HTML attribute string from an array. + * + * @param array $attributes + * + * @return string + */ + public function attributes($attributes) + { + $html = []; + + foreach ((array) $attributes as $key => $value) { + $element = $this->attributeElement($key, $value); + + if (! is_null($element)) { + $html[] = $element; + } + } + + return count($html) > 0 ? ' ' . implode(' ', $html) : ''; + } + + /** + * Build a single attribute element. + * + * @param string $key + * @param string $value + * + * @return string + */ + protected function attributeElement($key, $value) + { + // For numeric keys we will assume that the value is a boolean attribute + // where the presence of the attribute represents a true value and the + // absence represents a false value. + // This will convert HTML attributes such as "required" to a correct + // form instead of using incorrect numerics. + if (is_numeric($key)) { + return $value; + } + + // Treat boolean attributes as HTML properties + if (is_bool($value) && $key !== 'value') { + return $value ? $key : ''; + } + + if (! is_null($value)) { + return $key . '="' . e($value, false) . '"'; + } + } + + /** + * Obfuscate a string to prevent spam-bots from sniffing it. + * + * @param string $value + * + * @return string + */ + public function obfuscate($value) + { + $safe = ''; + + foreach (str_split($value) as $letter) { + if (ord($letter) > 128) { + return $letter; + } + + // To properly obfuscate the value, we will randomly convert each letter to + // its entity or hexadecimal representation, keeping a bot from sniffing + // the randomly obfuscated letters out of the string on the responses. + switch (rand(1, 3)) { + case 1: + $safe .= '&#' . ord($letter) . ';'; + break; + + case 2: + $safe .= '&#x' . dechex(ord($letter)) . ';'; + break; + + case 3: + $safe .= $letter; + } + } + + return $safe; + } + + /** + * Generate a meta tag. + * + * @param string $name + * @param string $content + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function meta($name, $content, array $attributes = []) + { + $defaults = compact('name', 'content'); + + $attributes = array_merge($defaults, $attributes); + + return $this->toHtmlString('attributes($attributes) . '>'); + } + + /** + * Generate an html tag. + * + * @param string $tag + * @param mixed $content + * @param array $attributes + * + * @return \Illuminate\Support\HtmlString + */ + public function tag($tag, $content, array $attributes = []) + { + $content = is_array($content) ? implode('', $content) : $content; + return $this->toHtmlString('<' . $tag . $this->attributes($attributes) . '>' . $this->toHtmlString($content) . ''); + } + + /** + * Transform the string to an Html serializable object + * + * @param $html + * + * @return \Illuminate\Support\HtmlString + */ + protected function toHtmlString($html) + { + return new HtmlString($html); + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method + * @param array $parameters + * + * @return \Illuminate\Contracts\View\View|mixed + * + * @throws \BadMethodCallException + */ + public function __call($method, $parameters) + { + if (static::hasComponent($method)) { + return $this->componentCall($method, $parameters); + } + + if (static::hasMacro($method)) { + return $this->macroCall($method, $parameters); + } + + throw new BadMethodCallException("Method {$method} does not exist."); + } +} diff --git a/vendor/laravelcollective/html/src/HtmlFacade.php b/vendor/laravelcollective/html/src/HtmlFacade.php new file mode 100644 index 00000000..127cdc82 --- /dev/null +++ b/vendor/laravelcollective/html/src/HtmlFacade.php @@ -0,0 +1,22 @@ +registerHtmlBuilder(); + + $this->registerFormBuilder(); + + $this->app->alias('html', HtmlBuilder::class); + $this->app->alias('form', FormBuilder::class); + + $this->registerBladeDirectives(); + } + + /** + * Register the HTML builder instance. + * + * @return void + */ + protected function registerHtmlBuilder() + { + $this->app->singleton('html', function ($app) { + return new HtmlBuilder($app['url'], $app['view']); + }); + } + + /** + * Register the form builder instance. + * + * @return void + */ + protected function registerFormBuilder() + { + $this->app->singleton('form', function ($app) { + $form = new FormBuilder($app['html'], $app['url'], $app['view'], $app['session.store']->token(), $app['request']); + + return $form->setSessionStore($app['session.store']); + }); + } + + /** + * Register Blade directives. + * + * @return void + */ + protected function registerBladeDirectives() + { + $this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) { + $namespaces = [ + 'Html' => get_class_methods(HtmlBuilder::class), + 'Form' => get_class_methods(FormBuilder::class), + ]; + + foreach ($namespaces as $namespace => $methods) { + foreach ($methods as $method) { + if (in_array($method, $this->directives)) { + $snakeMethod = Str::snake($method); + $directive = strtolower($namespace).'_'.$snakeMethod; + + $bladeCompiler->directive($directive, function ($expression) use ($namespace, $method) { + return ""; + }); + } + } + } + }); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return ['html', 'form', HtmlBuilder::class, FormBuilder::class]; + } +} diff --git a/vendor/laravelcollective/html/src/helpers.php b/vendor/laravelcollective/html/src/helpers.php new file mode 100644 index 00000000..14f03610 --- /dev/null +++ b/vendor/laravelcollective/html/src/helpers.php @@ -0,0 +1,70 @@ +link($url, $title, $attributes, $secure, $escape); + } +} + +if (! function_exists('link_to_asset')) { + /** + * Generate a HTML link to an asset. + * + * @param string $url + * @param string $title + * @param array $attributes + * @param bool $secure + * + * @return string + */ + function link_to_asset($url, $title = null, $attributes = [], $secure = null) + { + return app('html')->linkAsset($url, $title, $attributes, $secure); + } +} + +if (! function_exists('link_to_route')) { + /** + * Generate a HTML link to a named route. + * + * @param string $name + * @param string $title + * @param array $parameters + * @param array $attributes + * + * @return string + */ + function link_to_route($name, $title = null, $parameters = [], $attributes = []) + { + return app('html')->linkRoute($name, $title, $parameters, $attributes); + } +} + +if (! function_exists('link_to_action')) { + /** + * Generate a HTML link to a controller action. + * + * @param string $action + * @param string $title + * @param array $parameters + * @param array $attributes + * + * @return string + */ + function link_to_action($action, $title = null, $parameters = [], $attributes = []) + { + return app('html')->linkAction($action, $title, $parameters, $attributes); + } +}