mirror of
https://github.com/snipe/snipe-it.git
synced 2025-01-12 22:37:28 -08:00
Merge branch 'develop' into fixes/purify-factories
This commit is contained in:
commit
f7577bff52
|
@ -2864,6 +2864,24 @@
|
|||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "spencerrlongg",
|
||||
"name": "Spencer Long",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/7305753?v=4",
|
||||
"profile": "http://spencerlong.com",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "marcusmoore",
|
||||
"name": "Marcus Moore",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1141514?v=4",
|
||||
"profile": "https://github.com/marcusmoore",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
2
.github/workflows/codacy-analysis.yml
vendored
2
.github/workflows/codacy-analysis.yml
vendored
|
@ -36,7 +36,7 @@ jobs:
|
|||
|
||||
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
|
||||
- name: Run Codacy Analysis CLI
|
||||
uses: codacy/codacy-analysis-cli-action@v4.2.0
|
||||
uses: codacy/codacy-analysis-cli-action@v4.3.0
|
||||
with:
|
||||
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
|
||||
# You can also omit the token and run the tools that support default configurations
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
![Build Status](https://app.chipperci.com/projects/0e5f8979-31eb-4ee6-9abf-050b76ab0383/status/master) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade)
|
||||
[![All Contributors](https://img.shields.io/badge/all_contributors-315-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev)
|
||||
[![All Contributors](https://img.shields.io/badge/all_contributors-317-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev)
|
||||
|
||||
## Snipe-IT - Open Source Asset Management System
|
||||
|
||||
|
@ -141,6 +141,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
|
|||
| [<img src="https://avatars.githubusercontent.com/u/32363424?v=4" width="110px;"/><br /><sub>Peace</sub>](https://github.com/julian-piehl)<br />[💻](https://github.com/snipe/snipe-it/commits?author=julian-piehl "Code") | [<img src="https://avatars.githubusercontent.com/u/231528?v=4" width="110px;"/><br /><sub>Kyle Gordon</sub>](https://github.com/kylegordon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kylegordon "Code") | [<img src="https://avatars.githubusercontent.com/u/53009155?v=4" width="110px;"/><br /><sub>Katharina Drexel</sub>](http://www.bfh.ch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sunflowerbofh "Code") | [<img src="https://avatars.githubusercontent.com/u/1931963?v=4" width="110px;"/><br /><sub>David Sferruzza</sub>](https://david.sferruzza.fr/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dsferruzza "Code") | [<img src="https://avatars.githubusercontent.com/u/19511639?v=4" width="110px;"/><br /><sub>Rick Nelson</sub>](https://github.com/rnelsonee)<br />[💻](https://github.com/snipe/snipe-it/commits?author=rnelsonee "Code") | [<img src="https://avatars.githubusercontent.com/u/94169344?v=4" width="110px;"/><br /><sub>BasO12</sub>](https://github.com/BasO12)<br />[💻](https://github.com/snipe/snipe-it/commits?author=BasO12 "Code") | [<img src="https://avatars.githubusercontent.com/u/111710123?v=4" width="110px;"/><br /><sub>Vautia</sub>](https://github.com/Vautia)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Vautia "Code") |
|
||||
| [<img src="https://avatars.githubusercontent.com/u/28321?v=4" width="110px;"/><br /><sub>Chris Hartjes</sub>](http://www.littlehart.net/atthekeyboard)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chartjes "Code") | [<img src="https://avatars.githubusercontent.com/u/2404584?v=4" width="110px;"/><br /><sub>geo-chen</sub>](https://github.com/geo-chen)<br />[💻](https://github.com/snipe/snipe-it/commits?author=geo-chen "Code") | [<img src="https://avatars.githubusercontent.com/u/6006620?v=4" width="110px;"/><br /><sub>Phan Nguyen</sub>](https://github.com/nh314)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nh314 "Code") | [<img src="https://avatars.githubusercontent.com/u/115993812?v=4" width="110px;"/><br /><sub>Iisakki Jaakkola</sub>](https://github.com/StarlessNights)<br />[💻](https://github.com/snipe/snipe-it/commits?author=StarlessNights "Code") | [<img src="https://avatars.githubusercontent.com/u/22633385?v=4" width="110px;"/><br /><sub>Ikko Ashimine</sub>](https://bandism.net/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=eltociear "Code") | [<img src="https://avatars.githubusercontent.com/u/56871540?v=4" width="110px;"/><br /><sub>Lukas Fehling</sub>](https://github.com/lukasfehling)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lukasfehling "Code") | [<img src="https://avatars.githubusercontent.com/u/1975990?v=4" width="110px;"/><br /><sub>Fernando Almeida</sub>](https://github.com/fernando-almeida)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fernando-almeida "Code") |
|
||||
| [<img src="https://avatars.githubusercontent.com/u/116301219?v=4" width="110px;"/><br /><sub>akemidx</sub>](https://github.com/akemidx)<br />[💻](https://github.com/snipe/snipe-it/commits?author=akemidx "Code") | [<img src="https://avatars.githubusercontent.com/u/144778?v=4" width="110px;"/><br /><sub>Oguz Bilgic</sub>](http://oguz.site)<br />[💻](https://github.com/snipe/snipe-it/commits?author=oguzbilgic "Code") | [<img src="https://avatars.githubusercontent.com/u/9262438?v=4" width="110px;"/><br /><sub>Scooter Crawford</sub>](https://github.com/scoo73r)<br />[💻](https://github.com/snipe/snipe-it/commits?author=scoo73r "Code") | [<img src="https://avatars.githubusercontent.com/u/5957345?v=4" width="110px;"/><br /><sub>subdriven</sub>](https://github.com/subdriven)<br />[💻](https://github.com/snipe/snipe-it/commits?author=subdriven "Code") | [<img src="https://avatars.githubusercontent.com/u/658865?v=4" width="110px;"/><br /><sub>Andrew Savinykh</sub>](https://github.com/AndrewSav)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AndrewSav "Code") | [<img src="https://avatars.githubusercontent.com/u/1155067?v=4" width="110px;"/><br /><sub>Tadayuki Onishi</sub>](https://kenchan0130.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kenchan0130 "Code") | [<img src="https://avatars.githubusercontent.com/u/112496896?v=4" width="110px;"/><br /><sub>Florian</sub>](https://github.com/floschoepfer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=floschoepfer "Code") |
|
||||
| [<img src="https://avatars.githubusercontent.com/u/7305753?v=4" width="110px;"/><br /><sub>Spencer Long</sub>](http://spencerlong.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=spencerrlongg "Code") | [<img src="https://avatars.githubusercontent.com/u/1141514?v=4" width="110px;"/><br /><sub>Marcus Moore</sub>](https://github.com/marcusmoore)<br />[💻](https://github.com/snipe/snipe-it/commits?author=marcusmoore "Code") |
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
|
||||
|
|
|
@ -20,6 +20,7 @@ use Auth;
|
|||
use Illuminate\Http\Request;
|
||||
use App\Http\Requests\ImageUploadRequest;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class UsersController extends Controller
|
||||
{
|
||||
|
@ -457,6 +458,13 @@ class UsersController extends Controller
|
|||
|
||||
// Check if the request has groups passed and has a value
|
||||
if ($request->filled('groups')) {
|
||||
$validator = Validator::make($request->all(), [
|
||||
'groups.*' => 'integer|exists:permission_groups,id',
|
||||
]);
|
||||
|
||||
if ($validator->fails()){
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, $user->getErrors()));
|
||||
}
|
||||
$user->groups()->sync($request->input('groups'));
|
||||
// The groups field has been passed but it is null, so we should blank it out
|
||||
} elseif ($request->has('groups')) {
|
||||
|
|
|
@ -627,7 +627,11 @@ class AssetsController extends Controller
|
|||
$csv->setHeaderOffset(0);
|
||||
$header = $csv->getHeader();
|
||||
$isCheckinHeaderExplicit = in_array('checkin date', (array_map('strtolower', $header)));
|
||||
$results = $csv->getRecords();
|
||||
try {
|
||||
$results = $csv->getRecords();
|
||||
} catch (\Exception $e) {
|
||||
return back()->with('error', 'There was an error reading the CSV file: '.$e->getMessage());
|
||||
}
|
||||
$item = [];
|
||||
$status = [];
|
||||
$status['error'] = [];
|
||||
|
|
|
@ -8,47 +8,82 @@ use App\Models\Setting;
|
|||
|
||||
class SlackSettingsForm extends Component
|
||||
{
|
||||
public $slack_endpoint;
|
||||
public $slack_channel;
|
||||
public $slack_botname;
|
||||
public $webhook_endpoint;
|
||||
public $webhook_channel;
|
||||
public $webhook_botname;
|
||||
public $isDisabled ='disabled' ;
|
||||
public $webhook_name;
|
||||
public $webhook_link;
|
||||
public $webhook_placeholder;
|
||||
public $webhook_icon;
|
||||
public $webhook_selected;
|
||||
public array $webhook_text;
|
||||
|
||||
public Setting $setting;
|
||||
|
||||
protected $rules = [
|
||||
'slack_endpoint' => 'url|required_with:slack_channel|starts_with:https://hooks.slack.com/|nullable',
|
||||
'slack_channel' => 'required_with:slack_endpoint|starts_with:#|nullable',
|
||||
'slack_botname' => 'string|nullable',
|
||||
'webhook_endpoint' => 'url|required_with:webhook_channel|starts_with:https://hooks.slack.com/services|nullable',
|
||||
'webhook_channel' => 'required_with:webhook_endpoint|starts_with:#|nullable',
|
||||
'webhook_botname' => 'string|nullable',
|
||||
];
|
||||
|
||||
|
||||
public function mount(){
|
||||
$this->webhook_text= [
|
||||
"slack" => array(
|
||||
"name" => trans('admin/settings/general.slack') ,
|
||||
"icon" => 'fab fa-slack',
|
||||
"placeholder" => "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX",
|
||||
"link" => 'https://api.slack.com/messaging/webhooks',
|
||||
),
|
||||
"general"=> array(
|
||||
"name" => trans('admin/settings/general.general_webhook'),
|
||||
"icon" => "fab fa-hashtag",
|
||||
"placeholder" => "",
|
||||
"link" => "",
|
||||
),
|
||||
];
|
||||
|
||||
$this->setting = Setting::getSettings();
|
||||
$this->slack_endpoint = $this->setting->slack_endpoint;
|
||||
$this->slack_channel = $this->setting->slack_channel;
|
||||
$this->slack_botname = $this->setting->slack_botname;
|
||||
$this->webhook_selected = $this->setting->webhook_selected;
|
||||
$this->webhook_placeholder = $this->webhook_text[$this->setting->webhook_selected]["placeholder"];
|
||||
$this->webhook_name = $this->webhook_text[$this->setting->webhook_selected]["name"];
|
||||
$this->webhook_icon = $this->webhook_text[$this->setting->webhook_selected]["icon"];
|
||||
$this->webhook_endpoint = $this->setting->webhook_endpoint;
|
||||
$this->webhook_channel = $this->setting->webhook_channel;
|
||||
$this->webhook_botname = $this->setting->webhook_botname;
|
||||
$this->webhook_options = $this->setting->webhook_selected;
|
||||
|
||||
|
||||
}
|
||||
public function updated($field){
|
||||
if($this->webhook_selected != 'general') {
|
||||
$this->validateOnly($field, $this->rules);
|
||||
}
|
||||
}
|
||||
public function updatedWebhookSelected(){
|
||||
$this->webhook_name = $this->webhook_text[$this->webhook_selected]['name'];
|
||||
$this->webhook_icon = $this->webhook_text[$this->webhook_selected]["icon"]; ;
|
||||
$this->webhook_placeholder = $this->webhook_text[$this->webhook_selected]["placeholder"];
|
||||
$this->webhook_link = $this->webhook_text[$this->webhook_selected]["link"];
|
||||
|
||||
$this->validateOnly($field ,$this->rules);
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
if(empty($this->slack_channel || $this->slack_endpoint)){
|
||||
if(empty($this->webhook_channel || $this->webhook_endpoint)){
|
||||
$this->isDisabled= 'disabled';
|
||||
}
|
||||
if(empty($this->slack_endpoint && $this->slack_channel)){
|
||||
if(empty($this->webhook_endpoint && $this->webhook_channel)){
|
||||
$this->isDisabled= '';
|
||||
}
|
||||
return view('livewire.slack-settings-form');
|
||||
}
|
||||
|
||||
public function testSlack(){
|
||||
public function testWebhook(){
|
||||
|
||||
$slack = new Client([
|
||||
'base_url' => e($this->slack_endpoint),
|
||||
$webhook = new Client([
|
||||
'base_url' => e($this->webhook_endpoint),
|
||||
'defaults' => [
|
||||
'exceptions' => false,
|
||||
],
|
||||
|
@ -56,35 +91,39 @@ class SlackSettingsForm extends Component
|
|||
|
||||
$payload = json_encode(
|
||||
[
|
||||
'channel' => e($this->slack_channel),
|
||||
'text' => trans('general.slack_test_msg'),
|
||||
'username' => e($this->slack_botname),
|
||||
'channel' => e($this->webhook_channel),
|
||||
'text' => trans('general.webhook_test_msg'),
|
||||
'username' => e($this->webhook_botname),
|
||||
'icon_emoji' => ':heart:',
|
||||
]);
|
||||
|
||||
try {
|
||||
$slack->post($this->slack_endpoint, ['body' => $payload]);
|
||||
$webhook->post($this->webhook_endpoint, ['body' => $payload]);
|
||||
$this->isDisabled='';
|
||||
return session()->flash('success' , 'Your Slack Integration works!');
|
||||
return session()->flash('success' , 'Your '.$this->webhook_name.' Integration works!');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$this->isDisabled= 'disabled';
|
||||
return session()->flash('error' , trans('admin/settings/message.slack.error', ['error_message' => $e->getMessage()]));
|
||||
return session()->flash('error' , trans('admin/settings/message.webhook.error', ['error_message' => $e->getMessage(), 'app' => $this->webhook_name]));
|
||||
}
|
||||
|
||||
//}
|
||||
return session()->flash('message' , trans('admin/settings/message.slack.error_misc'));
|
||||
return session()->flash('message' , trans('admin/settings/message.webhook.error_misc'));
|
||||
|
||||
|
||||
|
||||
}
|
||||
public function submit()
|
||||
{
|
||||
$this->validate($this->rules);
|
||||
if($this->webhook_selected != 'general') {
|
||||
$this->validate($this->rules);
|
||||
}
|
||||
|
||||
$this->setting->webhook_selected = $this->webhook_selected;
|
||||
$this->setting->webhook_endpoint = $this->webhook_endpoint;
|
||||
$this->setting->webhook_channel = $this->webhook_channel;
|
||||
$this->setting->webhook_botname = $this->webhook_botname;
|
||||
|
||||
$this->setting->slack_endpoint = $this->slack_endpoint;
|
||||
$this->setting->slack_channel = $this->slack_channel;
|
||||
$this->setting->slack_botname = $this->slack_botname;
|
||||
|
||||
$this->setting->save();
|
||||
|
||||
|
|
|
@ -127,6 +127,9 @@
|
|||
"sort-packages": true,
|
||||
"optimize-autoloader": true,
|
||||
"discard-changes": true,
|
||||
"process-timeout": 3000
|
||||
"process-timeout": 3000,
|
||||
"allow-plugins": {
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ class ComponentFactory extends Factory
|
|||
'serial' => $this->faker->uuid,
|
||||
'qty' => $this->faker->numberBetween(3, 10),
|
||||
'order_number' => $this->faker->numberBetween(1000000, 50000000),
|
||||
'purchase_date' => $this->faker->dateTime(),
|
||||
'purchase_date' => $this->faker->dateTime()->format('Y-m-d'),
|
||||
'purchase_cost' => $this->faker->randomFloat(2),
|
||||
'min_amt' => $this->faker->numberBetween($min = 1, $max = 2),
|
||||
'company_id' => Company::factory(),
|
||||
|
|
|
@ -38,7 +38,7 @@ class ConsumableFactory extends Factory
|
|||
},
|
||||
'item_no' => $this->faker->numberBetween(1000000, 50000000),
|
||||
'order_number' => $this->faker->numberBetween(1000000, 50000000),
|
||||
'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get()),
|
||||
'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'),
|
||||
'purchase_cost' => $this->faker->randomFloat(2, 1, 50),
|
||||
'qty' => $this->faker->numberBetween(5, 10),
|
||||
'min_amt' => $this->faker->numberBetween($min = 1, $max = 2),
|
||||
|
|
|
@ -23,7 +23,7 @@ class AddEolDateOnAssetsTable extends Migration
|
|||
});
|
||||
|
||||
// Chunk the model query to get the models that do have an EOL date
|
||||
AssetModel::whereNotNull('eol')->with('assets')->chunk(200, function ($models) {
|
||||
AssetModel::whereNotNull('eol')->chunk(10, function ($models) {
|
||||
foreach ($models as $model) {
|
||||
foreach ($model->assets as $asset) {
|
||||
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddsWebhookOptionToSettingsTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('settings', function (Blueprint $table) {
|
||||
$table->string('webhook_selected')->after('slack_botname')->default('slack')->nullable();
|
||||
$table->renameColumn('slack_botname', 'webhook_botname');
|
||||
$table->renameColumn('slack_endpoint', 'webhook_endpoint');
|
||||
$table->renameColumn('slack_channel', 'webhook_channel');
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('settings', function (Blueprint $table) {
|
||||
$table->dropColumn('webhook_selected');
|
||||
$table->renameColumn('webhook_botname', 'slack_botname');
|
||||
$table->renameColumn('webhook_endpoint', 'slack_endpoint');
|
||||
$table->renameColumn('webhook_channel', 'slack_channel');
|
||||
});
|
||||
}
|
||||
}
|
|
@ -198,16 +198,20 @@ return [
|
|||
'show_images_in_email' => 'Show images in emails',
|
||||
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.',
|
||||
'site_name' => 'Site Name',
|
||||
'integrations' => 'Integrations',
|
||||
'slack' => 'Slack',
|
||||
'slack_title' => 'Update Slack Settings',
|
||||
'slack_help' => 'Slack settings',
|
||||
'slack_botname' => 'Slack Botname',
|
||||
'slack_channel' => 'Slack Channel',
|
||||
'slack_endpoint' => 'Slack Endpoint',
|
||||
'slack_integration' => 'Slack Settings',
|
||||
'slack_integration_help' => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new" rel="noopener">create an incoming webhook</a> on your Slack account. Click on the <strong>Test Slack Integration</strong> button to confirm your settings are correct before saving. ',
|
||||
'slack_integration_help_button' => 'Once you have saved your Slack information, a test button will appear.',
|
||||
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.',
|
||||
'general_webhook' => 'General Webhook',
|
||||
'webhook' => ':app',
|
||||
'webhook_title' => 'Update Webhook Settings',
|
||||
'webhook_help' => 'Integration settings',
|
||||
'webhook_botname' => ':app Botname',
|
||||
'webhook_channel' => ':app Channel',
|
||||
'webhook_endpoint' => ':app Endpoint',
|
||||
'webhook_integration' => ':app Settings',
|
||||
'webhook_test' =>'Test :app integration',
|
||||
'webhook_integration_help' => ':app integration is optional, however the endpoint and channel are required if you wish to use it. To configure :app integration, you must first <a href=":webhook_link" target="_new" rel="noopener">create an incoming webhook</a> on your :app account. Click on the <strong>Test :app Integration</strong> button to confirm your settings are correct before saving. ',
|
||||
'webhook_integration_help_button' => 'Once you have saved your :app information, a test button will appear.',
|
||||
'webhook_test_help' => 'Test whether your :app integration is configured correctly. YOU MUST SAVE YOUR UPDATED :app SETTINGS FIRST.',
|
||||
'snipe_version' => 'Snipe-IT version',
|
||||
'support_footer' => 'Support Footer Links ',
|
||||
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual',
|
||||
|
|
|
@ -33,12 +33,12 @@ return [
|
|||
'testing_authentication' => 'Testing LDAP Authentication...',
|
||||
'authentication_success' => 'User authenticated against LDAP successfully!'
|
||||
],
|
||||
'slack' => [
|
||||
'sending' => 'Sending Slack test message...',
|
||||
'webhook' => [
|
||||
'sending' => 'Sending :app test message...',
|
||||
'success_pt1' => 'Success! Check the ',
|
||||
'success_pt2' => ' channel for your test message, and be sure to click SAVE below to store your settings.',
|
||||
'500' => '500 Server Error.',
|
||||
'error' => 'Something went wrong. Slack responded with: :error_message',
|
||||
'error' => 'Something went wrong. :app responded with: :error_message',
|
||||
'error_misc' => 'Something went wrong. :( ',
|
||||
]
|
||||
];
|
||||
|
|
|
@ -250,8 +250,8 @@ return [
|
|||
'signature' => 'Signature',
|
||||
'signed_off_by' => 'Signed Off By',
|
||||
'skin' => 'Skin',
|
||||
'slack_msg_note' => 'A slack message will be sent',
|
||||
'slack_test_msg' => 'Oh hai! Looks like your Slack integration with Snipe-IT is working!',
|
||||
'webhook_msg_note' => 'A :app message will be sent',
|
||||
'webhook_test_msg' => 'Oh hai! Looks like your :app integration with Snipe-IT is working!',
|
||||
'some_features_disabled' => 'DEMO MODE: Some features are disabled for this installation.',
|
||||
'site_name' => 'Site Name',
|
||||
'state' => 'State',
|
||||
|
@ -406,6 +406,7 @@ return [
|
|||
'tasks_view_all' => 'View all tasks',
|
||||
'true' => 'True',
|
||||
'false' => 'False',
|
||||
'integration_option' => 'Integration Option',
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,99 +1,173 @@
|
|||
{{-- Page title --}}
|
||||
@section('title')
|
||||
{{ trans('admin/settings/general.webhook_title') }}
|
||||
@parent
|
||||
@stop
|
||||
|
||||
@section('header_right')
|
||||
<a href="{{ route('settings.index') }}" class="btn btn-primary"> {{ trans('general.back') }}</a>
|
||||
@stop
|
||||
|
||||
|
||||
<div class="col-md-12" style="border-top: 0px;">
|
||||
@if (session()->has('save'))
|
||||
<div class="alert alert-success fade in">
|
||||
{{session('save')}}
|
||||
</div>
|
||||
@endif
|
||||
{{-- Page content --}}
|
||||
@section('content')
|
||||
|
||||
@if(session()->has('success'))
|
||||
<div class="alert alert-success fade in">
|
||||
{{session('success')}}
|
||||
</div>
|
||||
@endif
|
||||
@if(session()->has('error'))
|
||||
<div class="alert alert-danger fade in">
|
||||
{{session('error')}}
|
||||
</div>
|
||||
@endif
|
||||
@if(session()->has('message'))
|
||||
<div class="alert alert-danger fade in">
|
||||
{{session('message')}}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<form class="form-horizontal" role="form" wire:submit.prevent="submit">
|
||||
<div>
|
||||
<form class="form-horizontal" role="form" wire:submit.prevent="submit">
|
||||
{{csrf_field()}}
|
||||
|
||||
<!--slack endpoint-->
|
||||
<div class="form-group{{ $errors->has('slack_endpoint') ? ' error' : '' }}">
|
||||
<div class="col-md-2">
|
||||
{{ Form::label('slack_endpoint', trans('admin/settings/general.slack_endpoint')) }}
|
||||
</div>
|
||||
<div class="col-md-8 required">
|
||||
@if (config('app.lock_passwords')===true)
|
||||
<p class="text-warning"><i class="fas fa-lock"></i> {{ trans('general.feature_disabled') }}</p>
|
||||
<input type="text" wire:model="slack_endpoint" class= 'form-control' placeholder="https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX" {{old('slack_endpoint', $slack_endpoint)}}>
|
||||
@else
|
||||
<input type="text" wire:model="slack_endpoint" class= 'form-control' placeholder="https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX" {{old('slack_endpoint', $slack_endpoint)}}>
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
|
||||
<div class="panel box box-default">
|
||||
<div class="box-header with-border">
|
||||
<h2 class="box-title">
|
||||
<i class="{{$webhook_icon}}"></i> {{ trans('admin/settings/general.webhook', ['app' => $webhook_name] ) }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="col-md-12">
|
||||
@if($webhook_selected != 'general')
|
||||
<p>
|
||||
{!! trans('admin/settings/general.webhook_integration_help',array('webhook_link' => $webhook_link, 'app' => $webhook_name)) !!}
|
||||
</p>
|
||||
@endif
|
||||
{!! $errors->first('slack_endpoint', '<span class="alert-msg" aria-hidden="true">:message</span>') !!}
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12">
|
||||
@if (session()->has('save'))
|
||||
<div class="alert alert-success fade in">
|
||||
{{session('save')}}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(session()->has('success'))
|
||||
<div class="alert alert-success fade in">
|
||||
{{session('success')}}
|
||||
</div>
|
||||
@endif
|
||||
@if(session()->has('error'))
|
||||
<div class="alert alert-danger fade in">
|
||||
{{session('error')}}
|
||||
</div>
|
||||
@endif
|
||||
@if(session()->has('message'))
|
||||
<div class="alert alert-danger fade in">
|
||||
{{session('message')}}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
||||
<div class="form-group col-md-12 required">
|
||||
<div class="col-md-3">
|
||||
<label for="webhook_selected">
|
||||
{{ trans('general.integration_option') }}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="col-md-9">
|
||||
<select wire:model="webhook_selected" aria-label="webhook_selected" class="form-control">
|
||||
<option value="slack">{{ trans('admin/settings/general.slack') }}</option>
|
||||
<option value="general">{{ trans('admin/settings/general.general_webhook') }}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!--Webhook endpoint-->
|
||||
<div class="form-group col-md-12 required{{ $errors->has('webhook_endpoint') ? ' error' : '' }}">
|
||||
|
||||
<div class="col-md-3">
|
||||
{{ Form::label('webhook_endpoint', trans('admin/settings/general.webhook_endpoint',['app' => ucwords($webhook_selected) ])) }}
|
||||
</div>
|
||||
|
||||
<div class="col-md-9">
|
||||
@if (config('app.lock_passwords')===true)
|
||||
<p class="text-warning">
|
||||
<i class="fas fa-lock" aria-hidden="true"></i>
|
||||
{{ trans('general.feature_disabled') }}
|
||||
</p>
|
||||
<input type="text" wire:model="webhook_endpoint" class="form-control" placeholder="{{ $webhook_placeholder }}" value="{{ old('webhook_endpoint', $webhook_endpoint) }}">
|
||||
@else
|
||||
<input type="text" wire:model="webhook_endpoint" class="form-control" placeholder="{{ $webhook_placeholder }}" value="{{ old('webhook_endpoint', $webhook_endpoint) }}">
|
||||
@endif
|
||||
{!! $errors->first('webhook_endpoint', '<span class="alert-msg">:message</span>') !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Webhook channel -->
|
||||
<div class="col-md-12 form-group required{{ $errors->has('webhook_channel') ? ' error' : '' }}">
|
||||
<div class="col-md-3">
|
||||
{{ Form::label('webhook_channel', trans('admin/settings/general.webhook_channel',['app' => ucwords($webhook_selected) ])) }}
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
|
||||
@if (config('app.lock_passwords')===true)
|
||||
<input type="text" wire:model="webhook_channel" class="form-control" placeholder="#IT-Ops" value="{{ old('webhook_channel', $webhook_channel) }}">
|
||||
<p class="text-warning">
|
||||
<i class="fas fa-lock" aria-hidden="true"></i> {{ trans('general.feature_disabled') }}</p>
|
||||
@else
|
||||
<input type="text" wire:model="webhook_channel" class="form-control" placeholder="#IT-Ops" value="{{ old('webhook_channel', $webhook_channel) }}">
|
||||
@endif
|
||||
{!! $errors->first('webhook_channel', '<span class="alert-msg">:message</span>') !!}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Webhook botname -->
|
||||
<div class="col-md-12 form-group required{{ $errors->has('webhook_botname') ? ' error' : '' }}">
|
||||
<div class="col-md-3">
|
||||
{{ Form::label('webhook_botname', trans('admin/settings/general.webhook_botname',['app' => ucwords($webhook_selected) ])) }}
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
@if (config('app.lock_passwords')===true)
|
||||
<input type="text" wire:model="webhook_botname" class='form-control'
|
||||
placeholder="Snipe-Bot" {{old('webhook_botname', $webhook_botname)}}>
|
||||
<p class="text-warning"><i class="fas fa-lock"></i>
|
||||
{{ trans('general.feature_disabled') }}
|
||||
</p>
|
||||
@else
|
||||
<input type="text" wire:model="webhook_botname" class="form-control" placeholder="Snipe-Bot" {{old('webhook_botname', $webhook_botname)}}>
|
||||
@endif
|
||||
{!! $errors->first('webhook_botname', '<span class="alert-msg" aria-hidden="true">:message</span>') !!}
|
||||
</div><!--col-md-10-->
|
||||
</div>
|
||||
|
||||
<!--Webhook Integration Test-->
|
||||
@if($webhook_selected == 'Slack' || $webhook_selected == 'Discord')
|
||||
@if($webhook_endpoint != null && $webhook_channel != null)
|
||||
<div class="form-group col-md-12">
|
||||
<div class="col-md-offset-3 col-md-9">
|
||||
|
||||
<a href="#" wire:click.prevent="testWebhook"
|
||||
class="btn btn-default btn-sm pull-left">
|
||||
<i class="{{$webhook_icon}}" aria-hidden="true"></i>
|
||||
{!! trans('admin/settings/general.webhook_test',['app' => ucwords($webhook_selected) ]) !!}
|
||||
</a>
|
||||
<div wire:loading>
|
||||
<span style="padding-left: 5px; font-size: 20px">
|
||||
<i class="fas fa-spinner fa-spin" aria-hidden="true"></i>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
|
||||
<div class="box-footer" style="margin-top: 45px;">
|
||||
<div class="text-right col-md-12">
|
||||
<a class="btn btn-link text-left"
|
||||
href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
|
||||
<button type="submit" {{$isDisabled}} class="btn btn-primary"><i
|
||||
class="fas fa-check icon-white"
|
||||
aria-hidden="true"></i> {{ trans('general.save') }}</button>
|
||||
</div>
|
||||
</div><!--box-footer-->
|
||||
</div> <!-- /box -->
|
||||
</div> <!-- /.col-md-8-->
|
||||
</div>
|
||||
|
||||
<!-- slack channel -->
|
||||
<div class="form-group{{ $errors->has('slack_channel') ? ' error' : '' }}">
|
||||
<div class="col-md-2">
|
||||
{{ Form::label('slack_channel', trans('admin/settings/general.slack_channel')) }}
|
||||
</div>
|
||||
<div class="col-md-8 required">
|
||||
@if (config('app.lock_passwords')===true)
|
||||
<input type="text" wire:model="slack_channel" class='form-control' placeholder="#IT-Ops" value="{{old('slack_channel', $slack_channel)}}">
|
||||
<p class="text-warning"><i class="fas fa-lock"></i> {{ trans('general.feature_disabled') }}</p>
|
||||
|
||||
@else
|
||||
<input type="text" wire:model="slack_channel" class= 'form-control' placeholder="#IT-Ops" value="{{old('slack_channel', $slack_channel)}}">
|
||||
@endif
|
||||
{!! $errors->first('slack_channel', '<span class="alert-msg" aria-hidden="true">:message</span>') !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- slack botname -->
|
||||
<div class="form-group{{ $errors->has('slack_botname') ? ' error' : '' }}">
|
||||
<div class="col-md-2">
|
||||
{{ Form::label('slack_botname', trans('admin/settings/general.slack_botname')) }}
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
@if (config('app.lock_passwords')===true)
|
||||
<input type="text" wire:model="slack_botname" class= 'form-control' placeholder="Snipe-Bot" {{old('slack_botname', $slack_botname)}}>
|
||||
<p class="text-warning"><i class="fas fa-lock"></i> {{ trans('general.feature_disabled') }}</p>
|
||||
|
||||
@else
|
||||
<input type="text" wire:model="slack_botname" class= 'form-control' placeholder="Snipe-Bot" {{old('slack_botname', $slack_botname)}}>
|
||||
@endif
|
||||
{!! $errors->first('slack_botname', '<span class="alert-msg" aria-hidden="true">:message</span>') !!}
|
||||
</div><!--col-md-10-->
|
||||
</div>
|
||||
|
||||
<!--Slack Integration Test-->
|
||||
@if($slack_endpoint != null && $slack_channel != null)
|
||||
<div class="form-group">
|
||||
<div class="col-md-offset-2 col-md-8">
|
||||
<a href="#" wire:click.prevent="testSlack" class="btn btn-default btn-sm pull-left"><span>{!! trans('admin/settings/general.slack_test') !!}</span></a>
|
||||
<div wire:loading><span style="padding-left: 5px; font-size: 20px"><i class="fas fa-spinner fa-spin"></i></span></div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="box-footer" style="margin-top: 45px;">
|
||||
<div class="text-right col-md-12">
|
||||
<a class="btn btn-link text-left" href="{{ route('settings.index') }}">{{ trans('button.cancel') }}</a>
|
||||
<button type="submit" {{$isDisabled}} class="btn btn-primary"><i class="fas fa-check icon-white" aria-hidden="true"></i> {{ trans('general.save') }}</button>
|
||||
</div>
|
||||
</div><!--box-footer-->
|
||||
</form>
|
||||
|
||||
</div> <!-- /box -->
|
||||
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -164,12 +164,12 @@
|
|||
<div class="box-body text-center">
|
||||
<h5>
|
||||
<a href="{{ route('settings.slack.index') }}" class="settings_button">
|
||||
<i class="fab fa-slack fa-4x" aria-hidden="true"></i>
|
||||
<i class="fa-solid fa-hashtag fa-4x" aria-hidden="true"></i>
|
||||
<br><br>
|
||||
<span class="name">{{ trans('admin/settings/general.slack') }}</span>
|
||||
<span class="name">{{ trans('admin/settings/general.integrations') }}</span>
|
||||
</a>
|
||||
</h5>
|
||||
<p class="help-block">{{ trans('admin/settings/general.slack_help') }}</p>
|
||||
<p class="help-block">{{ trans('admin/settings/general.webhook_help') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,43 +1,5 @@
|
|||
@extends('layouts/default')
|
||||
|
||||
{{-- Page title --}}
|
||||
@section('title')
|
||||
{{ trans('admin/settings/general.slack_title') }}
|
||||
@parent
|
||||
@stop
|
||||
|
||||
@section('header_right')
|
||||
<a href="{{ route('settings.index') }}" class="btn btn-primary"> {{ trans('general.back') }}</a>
|
||||
@stop
|
||||
|
||||
|
||||
{{-- Page content --}}
|
||||
@section('content')
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
|
||||
|
||||
<div class="panel box box-default">
|
||||
<div class="box-header with-border">
|
||||
<h2 class="box-title">
|
||||
<i class="fab fa-slack"></i> {{ trans('admin/settings/general.slack') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="col-md-12">
|
||||
<p>
|
||||
{!! trans('admin/settings/general.slack_integration_help',array('slack_link' => 'https://my.slack.com/services/new/incoming-webhook')) !!}
|
||||
</p>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
@livewire('slack-settings-form')
|
||||
|
||||
</div> <!-- /.col-md-8-->
|
||||
</div> <!-- /.row-->
|
||||
|
||||
|
||||
@livewire('slack-settings-form')
|
||||
@stop
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue