Skip to content

Commit

Permalink
reorder fields for an asset definition
Browse files Browse the repository at this point in the history
  • Loading branch information
cconard96 authored and cedric-anne committed Dec 3, 2024
1 parent fc473e3 commit e0987fe
Show file tree
Hide file tree
Showing 23 changed files with 1,683 additions and 989 deletions.
109 changes: 109 additions & 0 deletions ajax/asset/assetdefinition.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<?php

/**
* ---------------------------------------------------------------------
*
* GLPI - Gestionnaire Libre de Parc Informatique
*
* http://glpi-project.org
*
* @copyright 2015-2024 Teclib' and contributors.
* @licence https://www.gnu.org/licenses/gpl-3.0.html
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* ---------------------------------------------------------------------
*/

use Glpi\Asset\AssetDefinition;
use Glpi\Asset\CustomFieldDefinition;
use Glpi\Exception\Http\BadRequestHttpException;
use Glpi\Exception\Http\NotFoundHttpException;

/** @var \Glpi\Controller\LegacyFileLoadController $this */
$this->setAjax();

Session::checkRight(AssetDefinition::$rightname, READ);
Session::writeClose();

if ($_REQUEST['action'] === 'get_all_fields') {
header("Content-Type: application/json; charset=UTF-8");
$definition = new AssetDefinition();
if (!$definition->getFromDB($_GET['assetdefinitions_id'])) {
throw new NotFoundHttpException();
}
$all_fields = $definition->getAllFields();
$field_results = [];
foreach ($all_fields as $k => $v) {
if (!empty($_POST['searchText']) && stripos($v['text'], $_POST['searchText']) === false) {
continue;
}
$v['id'] = $k;
$field_results[] = $v;
}
echo json_encode([
'results' => $field_results,
'count' => count($all_fields)
], JSON_THROW_ON_ERROR);
return;
} else if ($_REQUEST['action'] === 'get_field_placeholder' && isset($_POST['fields']) && is_array($_POST['fields'])) {
header("Content-Type: application/json; charset=UTF-8");
$custom_field = new CustomFieldDefinition();
$results = [];
foreach ($_POST['fields'] as $field) {
if ($field['customfields_id'] > 0) {
if (!$custom_field->getFromDB($field['customfields_id'])) {
throw new NotFoundHttpException();
}
} else {
$custom_field->fields['name'] = '';
$custom_field->fields['label'] = $field['label'];
$custom_field->fields['type'] = $field['type'];
$custom_field->fields['itemtype'] = 'Computer'; // Doesn't matter what it is as long as it's not empty
$custom_field->fields['default_value'] = '';

$asset_definition = new AssetDefinition();
if (!$asset_definition->getFromDB($field['assetdefinitions_id'])) {
throw new NotFoundHttpException();
}
$fields_display = $asset_definition->getDecodedFieldsField();
foreach ($fields_display as $field_display) {
if ($field_display['key'] === $field['key']) {
$custom_field->fields['field_options'] = $field_display['field_options'] ?? [];
break;
}
}
}
$custom_field->fields['field_options'] = array_merge($custom_field->fields['field_options'] ?? [], $field['field_options'] ?? []);
$custom_field->fields['field_options']['disabled'] = true;
$results[$field['key']] = $custom_field->getFieldType()->getFormInput('', null);
}
echo json_encode($results, JSON_THROW_ON_ERROR);
return;
} else if ($_REQUEST['action'] === 'get_core_field_editor') {
header("Content-Type: text/html; charset=UTF-8");
$asset_definition = new AssetDefinition();
if (!$asset_definition->getFromDB($_GET['assetdefinitions_id'])) {
throw new NotFoundHttpException();
}
$asset_definition->showFieldOptionsForCoreField($_GET['key'], $_GET['field_options'] ?? []);
return;
}
throw new BadRequestHttpException();
3 changes: 2 additions & 1 deletion install/migrations/update_10.0.x_to_11.0.0/assets.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
`capacities` JSON NOT NULL,
`profiles` JSON NOT NULL,
`translations` JSON NOT NULL,
`fields_display` JSON NOT NULL,
`date_creation` timestamp NULL DEFAULT NULL,
`date_mod` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
Expand All @@ -65,7 +66,7 @@
SQL;
$DB->doQuery($query);
} else {
foreach (['profiles', 'translations'] as $field) {
foreach (['profiles', 'translations', 'fields_display'] as $field) {
$migration->addField('glpi_assets_assetdefinitions', $field, 'JSON NOT NULL', ['update' => "'[]'"]);
}
}
Expand Down
1 change: 1 addition & 0 deletions install/mysql/glpi-empty.sql
Original file line number Diff line number Diff line change
Expand Up @@ -9900,6 +9900,7 @@ CREATE TABLE `glpi_assets_assetdefinitions` (
`capacities` JSON NOT NULL,
`profiles` JSON NOT NULL,
`translations` JSON NOT NULL,
`fields_display` JSON NOT NULL,
`date_creation` timestamp NULL DEFAULT NULL,
`date_mod` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
Expand Down
58 changes: 58 additions & 0 deletions js/src/vue/CustomObject/FieldPreview/Field.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<script setup>
import {computed} from 'vue';
const props = defineProps({
field_key: String,
customfields_id: {
type: Number,
default: -1,
},
label_classes: {
type: String,
default: 'col-form-label cursor-grab col-xxl-5 text-xxl-end',
},
field_classes: {
type: String,
default: 'col-xxl-7 field-container btn-group shadow-none',
},
wrapper_classes: {
type: String,
default: 'form-field row flex-grow-1',
},
});
const sortable_classes = computed(() => {
return props.wrapper_classes.split(' ').filter((cls) => cls.startsWith('col-')).join(' ');
});
</script>

<template>
<div :class="`sortable-field align-items-center p-1 ${(!!$slots.field_preview) ? sortable_classes : 'col-12 col-sm-6'}`"
:data-key="field_key" :data-customfield-id="customfields_id" :style="`display: ${(!!$slots.field_preview) ? 'flex' : 'none'};`">
<input type="hidden" name="fields_display[]" :value="field_key" />
<slot name="field_options"></slot>
<div :class="wrapper_classes">
<label :class="label_classes">
<slot name="field_label"></slot>
<slot name="field_markers"></slot>
<i class="ti ti-grip-vertical sort-handle align-middle"></i>
</label>
<div :class="field_classes">
<slot name="field_preview"></slot>
<button type="button" class="btn btn-ghost-secondary btn-sm edit-field" :title="__('Edit')">
<i class="ti ti-pencil"></i>
</button>
<button type="button" class="btn btn-ghost-danger btn-sm hide-field" :title="__('Hide')">
<i class="ti ti-eye-off"></i>
</button>
</div>
</div>
</div>
</template>

<style scoped>
.sortable-field .btn-group .select2-container {
flex-basis: auto;
width: 100% !important;
}
</style>
Loading

0 comments on commit e0987fe

Please sign in to comment.