phases one of time logged now with log display

This commit is contained in:
Mark Gregory
2026-06-22 12:53:56 +01:00
parent c1a9d0de27
commit 052bae718e
231 changed files with 15113 additions and 12891 deletions
@@ -13,7 +13,7 @@
$isRequired = $isRequired();
$isConcealed = $isConcealed();
$isHtmlAllowed = $isHtmlAllowed();
$isNative = (! ($isSearchable || $isMultiple || $isHtmlAllowed) && $isNative());
$isNative = !($isSearchable || $isMultiple || $isHtmlAllowed) && $isNative();
$isPrefixInline = $isPrefixInline();
$isSuffixInline = $isSuffixInline();
$key = $getKey();
@@ -31,59 +31,41 @@
$livewireKey = $getLivewireKey();
@endphp
<x-dynamic-component
:component="$fieldWrapperView"
:field="$field"
class="fi-fo-select-wrp"
>
<x-filament::input.wrapper
:disabled="$isDisabled"
:inline-prefix="$isPrefixInline"
:inline-suffix="$isSuffixInline"
:prefix="$prefixLabel"
:prefix-actions="$prefixActions"
:prefix-icon="$prefixIcon"
:prefix-icon-color="$prefixIconColor"
:suffix="$suffixLabel"
:suffix-actions="$suffixActions"
:suffix-icon="$suffixIcon"
:suffix-icon-color="$suffixIconColor"
:valid="! $errors->has($statePath)"
<x-dynamic-component :component="$fieldWrapperView" :field="$field" class="fi-fo-select-wrp">
<x-filament::input.wrapper :disabled="$isDisabled" :inline-prefix="$isPrefixInline" :inline-suffix="$isSuffixInline" :prefix="$prefixLabel" :prefix-actions="$prefixActions"
:prefix-icon="$prefixIcon" :prefix-icon-color="$prefixIconColor" :suffix="$suffixLabel" :suffix-actions="$suffixActions" :suffix-icon="$suffixIcon" :suffix-icon-color="$suffixIconColor"
:valid="!$errors->has($statePath)"
:x-on:focus-input.stop="$isNative ? '$el.querySelector(\'select\')?.focus()' : '$el.querySelector(\'.fi-select-input-btn\')?.focus()'"
:attributes="
\Filament\Support\prepare_inherited_attributes($getExtraAttributeBag())
->class([
'fi-fo-select',
'fi-fo-select-has-inline-prefix' => $isPrefixInline && (count($prefixActions) || $prefixIcon || filled($prefixLabel)),
'fi-fo-select-native' => $isNative,
])
"
>
:attributes="\Filament\Support\prepare_inherited_attributes($getExtraAttributeBag())->class([
'fi-fo-select',
'fi-fo-select-has-inline-prefix' =>
$isPrefixInline && (count($prefixActions) || $prefixIcon || filled($prefixLabel)),
'fi-fo-select-native' => $isNative,
])">
@if ($isNative)
@php
$options = $getOptions();
@endphp
<select
{{
$extraInputAttributeBag
->merge([
{{ $extraInputAttributeBag->merge(
[
'autofocus' => $isAutofocused,
'disabled' => $isDisabled,
'id' => $id,
'required' => $isRequired && (! $isConcealed),
'wire:key' => $hasDynamicOptions ? ($livewireKey . '.' . substr(md5(serialize($options)), 0, 64)) : null,
'required' => $isRequired && !$isConcealed,
'wire:key' => $hasDynamicOptions ? $livewireKey . '.' . substr(md5(serialize($options)), 0, 64) : null,
$applyStateBindingModifiers('wire:model') => $statePath,
], escape: false)
->class([
'fi-select-input',
'fi-select-input-has-inline-prefix' => $isPrefixInline && (count($prefixActions) || $prefixIcon || filled($prefixLabel)),
])
}}
>
],
escape: false,
)->class([
'fi-select-input',
'fi-select-input-has-inline-prefix' =>
$isPrefixInline && (count($prefixActions) || $prefixIcon || filled($prefixLabel)),
]) }}>
@if ($canSelectPlaceholder)
<option value="">
@if (! $isDisabled)
@if (!$isDisabled)
{{ $getPlaceholder() }}
@endif
</option>
@@ -93,10 +75,7 @@
@if (is_array($label))
<optgroup label="{{ $value }}">
@foreach ($label as $groupedValue => $groupedLabel)
<option
@disabled($isOptionDisabled($groupedValue, $groupedLabel))
value="{{ $groupedValue }}"
>
<option @disabled($isOptionDisabled($groupedValue, $groupedLabel)) value="{{ $groupedValue }}">
@if ($isHtmlAllowed)
{!! $groupedLabel !!}
@else
@@ -106,10 +85,7 @@
@endforeach
</optgroup>
@else
<option
@disabled($isOptionDisabled($value, $label))
value="{{ $value }}"
>
<option @disabled($isOptionDisabled($value, $label)) value="{{ $value }}">
@if ($isHtmlAllowed)
{!! $label !!}
@else
@@ -120,102 +96,83 @@
@endforeach
</select>
@else
<div
class="fi-hidden"
x-data="{
isDisabled: @js($isDisabled),
init() {
const container = $el.nextElementSibling
container.dispatchEvent(
new CustomEvent('set-select-property', {
detail: { isDisabled: this.isDisabled },
}),
)
},
}"
></div>
<div
x-load
<div class="fi-hidden" x-data="{
isDisabled: @js($isDisabled),
init() {
const container = $el.nextElementSibling
container.dispatchEvent(
new CustomEvent('set-select-property', {
detail: { isDisabled: this.isDisabled },
}),
)
},
}"></div>
<div x-load
x-load-src="{{ \Filament\Support\Facades\FilamentAsset::getAlpineComponentSrc('select', 'filament/forms') }}"
x-data="selectFormComponent({
canOptionLabelsWrap: @js($canOptionLabelsWrap),
canSelectPlaceholder: @js($canSelectPlaceholder),
getOptionLabelUsing: async () => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getOptionLabel'],
{ async: true },
)
},
getOptionLabelsUsing: async () => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getOptionLabelsForJs'],
{ async: true },
)
},
getOptionsUsing: async () => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getOptionsForJs'],
{ async: true },
)
},
getSearchResultsUsing: async (search) => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getSearchResultsForJs', { search }],
{ async: true },
)
},
hasDynamicOptions: @js($hasDynamicOptions),
hasDynamicSearchResults: @js($hasDynamicSearchResults()),
hasInitialNoOptionsMessage: @js($hasInitialNoOptionsMessage),
initialOptionLabel: @js((blank($state) || $isMultiple) ? null : $getOptionLabel()),
initialOptionLabels: @js((filled($state) && $isMultiple) ? $getOptionLabelsForJs() : []),
initialState: @js($state),
isAutofocused: @js($isAutofocused),
isDisabled: @js($isDisabled),
isHtmlAllowed: @js($isHtmlAllowed),
isMultiple: @js($isMultiple),
isReorderable: @js($isReorderable),
isSearchable: @js($isSearchable),
livewireId: @js($this->getId()),
loadingMessage: @js($getLoadingMessage()),
maxItems: @js($getMaxItems()),
maxItemsMessage: @js($getMaxItemsMessage()),
noOptionsMessage: @js($getNoOptionsMessage()),
noSearchResultsMessage: @js($getNoSearchResultsMessage()),
options: @js($getOptionsForJs()),
optionsLimit: @js($getOptionsLimit()),
placeholder: @js($getPlaceholder()),
position: @js($getPosition()),
searchDebounce: @js($getSearchDebounce()),
searchingMessage: @js($getSearchingMessage()),
searchPrompt: @js($getSearchPrompt()),
searchableOptionFields: @js($getSearchableOptionFields()),
state: $wire.{{ $applyStateBindingModifiers("\$entangle('{$statePath}')") }},
statePath: @js($statePath),
})"
wire:ignore
wire:key="{{ $livewireKey }}.{{
substr(md5(serialize([
$isDisabled,
$isReorderable,
])), 0, 64)
}}"
canOptionLabelsWrap: @js($canOptionLabelsWrap),
canSelectPlaceholder: @js($canSelectPlaceholder),
getOptionLabelUsing: async () => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getOptionLabel'], { async: true },
)
},
getOptionLabelsUsing: async () => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getOptionLabelsForJs'], { async: true },
)
},
getOptionsUsing: async () => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getOptionsForJs'], { async: true },
)
},
getSearchResultsUsing: async (search) => {
return await Livewire.fireAction(
$wire.__instance,
'callSchemaComponentMethod',
[@js($key), 'getSearchResultsForJs', { search }], { async: true },
)
},
hasDynamicOptions: @js($hasDynamicOptions),
hasDynamicSearchResults: @js($hasDynamicSearchResults()),
hasInitialNoOptionsMessage: @js($hasInitialNoOptionsMessage),
initialOptionLabel: @js(blank($state) || $isMultiple ? null : $getOptionLabel()),
initialOptionLabels: @js(filled($state) && $isMultiple ? $getOptionLabelsForJs() : []),
initialState: @js($state),
isAutofocused: @js($isAutofocused),
isDisabled: @js($isDisabled),
isHtmlAllowed: @js($isHtmlAllowed),
isMultiple: @js($isMultiple),
isReorderable: @js($isReorderable),
isSearchable: @js($isSearchable),
livewireId: @js($this->getId()),
loadingMessage: @js($getLoadingMessage()),
maxItems: @js($getMaxItems()),
maxItemsMessage: @js($getMaxItemsMessage()),
noOptionsMessage: @js($getNoOptionsMessage()),
noSearchResultsMessage: @js($getNoSearchResultsMessage()),
options: @js($getOptionsForJs()),
optionsLimit: @js($getOptionsLimit()),
placeholder: @js($getPlaceholder()),
position: @js($getPosition()),
searchDebounce: @js($getSearchDebounce()),
searchingMessage: @js($getSearchingMessage()),
searchPrompt: @js($getSearchPrompt()),
searchableOptionFields: @js($getSearchableOptionFields()),
state: $wire.{{ $applyStateBindingModifiers("\$entangle('{$statePath}')") }},
statePath: @js($statePath),
})" wire:ignore
wire:key="{{ $livewireKey }}.{{ substr(md5(serialize([$isDisabled, $isReorderable])), 0, 64) }}"
x-on:keydown.esc="select.dropdown.isActive && $event.stopPropagation()"
x-on:set-select-property="$event.detail.isDisabled ? select.disable() : select.enable()"
{{
$attributes
->merge($getExtraAlpineAttributes(), escape: false)
->class(['fi-select-input'])
}}
>
{{ $attributes->merge($getExtraAlpineAttributes(), escape: false)->class(['fi-select-input']) }}>
<div x-ref="select"></div>
</div>
@endif