Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(fields): Select group mode #410

Merged
merged 2 commits into from
Jul 31, 2023

Conversation

YouMixx
Copy link

@YouMixx YouMixx commented Jul 28, 2023

Поле Select имеет возможность принимать значения в виде многоуровневого массива - для построения групп.
Но в этом случае выбранное значение не будет отображено в index/show.
Это происходит по той причине, что в функции indexViewValue возвращается значение взятое из массива по ключу.
А если массив поделен на группы - это значение достать не получится.

Мое решение заключается в том, что я добавил новую функцию smoothedValues и использую её в indexViewValue.
Эта функция сглаживает массив до одного уровня, убирая деление на группы.

Я использовал mapWithKeys вместо того-же flatten, дабы не потерять ключи.


Остается одна проблема, которую на мой взгляд не нужно решать. Она заключается в том, если в options передали массив поделенный на группы, но при этом не поставили ключи массиву, пример:

'group1' => [
    'test1', // ключ 0
    'test2', // ключ 1
],
'group2' => [
    'test3', // ключ 0
    'test4', // ключ 1
]

В этом случае при сглаживании некоторые значения пропадут из-за не уникальных ключей.
Можно дописать функцию options, делая ключи уникальными. Но в этом случае, если ключи были и так уникальными мы их просто собьем.

Не вижу делать доп.проверки на то, уникальные ли уже ключи и если нет - делать уникальными. Это задача пользователя, так-что единственное что я рекомендую, упомянуть в документации к информации про группы, что ключи должны быть уникальными.

@@ -26,6 +26,13 @@ public function values(): array
return $this->options;
}

public function smoothedValues() : array
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай использовать более привычные наименования unwrappedValues либо flattenValues

@@ -26,6 +26,13 @@ public function values(): array
return $this->options;
}

public function smoothedValues() : array
{
return collect($this->values())->mapWithKeys(function($item, $i) : array {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

переменные вместо $item, $i => $value, $key

public function smoothedValues() : array
{
return collect($this->values())->mapWithKeys(function($item, $i) : array {
return is_array($item) ? $item : [$i => $item];
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут лучше использовать стрелочную функцию так как логика в строку
fn($value, $key) => is_array($value) ? $value : [$key => $value];

@@ -58,6 +58,6 @@ public function indexViewValue(Model $item, bool $container = true): string
->implode(',');
}

return (string) ($this->values()[$value] ?? '');
return (string) ($this->smoothedValues()[$value] ?? '');
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в поле Enum тоже надо сделать так в indexViewValue

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Enum разве можно сделать многоуровневым?

@lee-to lee-to merged commit 3160c1f into moonshine-software:1.5.x Jul 31, 2023
2 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants