conditional-container icon indicating copy to clipboard operation
conditional-container copied to clipboard

Nova Flexible Content

Open dividy opened this issue 4 years ago • 25 comments

Hello,

Is it compatible with Nova Flexible Content ?

I tried it and had a JS error..

Thanks !

dividy avatar Dec 13 '19 15:12 dividy

Currently it doesn't work with flexible content

milewski avatar Dec 14 '19 01:12 milewski

Yep, that's why i tried Nova Dependency Container but I encountered 2 issues with that package too :

  • The conditional field doesn't show on the detail view

  • Some values are overwritten by the last item of the layout

I've seen you used that package too, do these issues ring a bell to you ?

Thanks.

Le sam. 14 déc. 2019 à 02:34, Rafael Milewski [email protected] a écrit :

Currently it doesn't work with flexible content

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/dcasia/conditional-container/issues/17?email_source=notifications&email_token=AEV5PSOYN3CPZ25FQU3FBOTQYQZ23A5CNFSM4J2O6QCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEG3WQSQ#issuecomment-565667914, or unsubscribe https://github.com/notifications/unsubscribe-auth/AEV5PSJZRTECFPWA5OZNMJTQYQZ23ANCNFSM4J2O6QCA .

dividy avatar Dec 14 '19 09:12 dividy

Yeah I used that package before too but had too many issues for my use case so I built this one instead, I have seen how the Nova Dependency Container implemented support for the flexible content on this commit: https://github.com/epartment/nova-dependency-container/commit/d4081499c45b86111d5d95ef3c4457db4dd4bbdf perhaps it may be very simple to port it over... I will give it a shoot, and about the 2 issues, I don't see how conditional-container would fail in there

milewski avatar Dec 14 '19 09:12 milewski

@dividy I got it almost working and I had pushed my proof of concept to a branch called flexible field, it works on create, on update and on details view as expected, however validation is still broken :(

milewski avatar Dec 16 '19 14:12 milewski

Wow.. This sounds like a great step forward to something functional ;-) I'll try to have a look at this too!

dividy avatar Dec 16 '19 15:12 dividy

Just did a composer require digital-creative/conditional-container:dev-flexible-content

Tried the package, and I'm still having an issue inside Flexible Content...

Here's the code, can you try it on your side and tell me if it works ?

Flexible::make('Produits', 'products')
            ->addLayout('Product', 'product', [
                Select::make('Type de contrat', 'type')->options([
                    'L' => 'Location',
                    'VL' => 'Vente & Location',
                    'R' => 'Relevé',
                    'V' => 'Vente',
                    'VU' => 'Vente unique',
                ])->displayUsingLabels()->rules('required'),
    
                ConditionalContainer::make([ Text::make('Prix en Location (htva)', 'price_rent') ])
                ->if('type = L'),
              
                ConditionalContainer::make([ Text::make('Prix de Vente (htva)', 'price_sale') ])
                ->if('type = V')
                ->if('type = VU'), 
    
                ConditionalContainer::make([ 
                    Text::make('Prix en Location (htva)', 'price_rent'),
                    Text::make('Prix de Vente (htva)', 'price_sale')
                ])->if('type = VL'),
    
                ConditionalContainer::make([ 
                    Text::make('Prix du Relevé (htva)', 'price_reading'),
                ])->if('type = R'),        
            ]),

dividy avatar Dec 31 '19 11:12 dividy

On my side, it never works, and displays all the fields when I select 'R - Relevé'.. Strange ;)

dividy avatar Dec 31 '19 11:12 dividy

@milewski I just used the branch as well and tried the code of @dividy but i get

TypeError: Cannot read property 'join' of undefined
    at _loop (conditional-container:175)

And I even dont see the fields.

I also tried my own, simpler example with the same result:

Flexible::make("Data")
    ->addLayout("Simple Layout", "html", [
        Select::make("Type", "type")->options([
            "html" => "HTML",
            "plain" => "Plaintext"
        ]),
        ConditionalContainer::make([
            Trix::make('Content', 'html_content')
        ])->if('type = html'),
        ConditionalContainer::make([
            Textarea::make('Content', 'plain_content')
        ])->if('type = plain')
    ])

bernhardh avatar Jan 11 '20 19:01 bernhardh

The join issue is because the HasConditionalContainer wasn't included ... but yeah indeed there are several issues, it did work for the example I had when I was developing it but using your samples has some bugs...

milewski avatar Jan 12 '20 02:01 milewski

@bernhardh I just fixed the issues with your example you can try again it should be working perfectly now (but without validation of course)

Form View

image

Detail View

image

milewski avatar Jan 12 '20 03:01 milewski

@dividy your example also works now for me... I think the issue were you forgot the trait

milewski avatar Jan 12 '20 03:01 milewski

Oh. So stupid. Thank you!

Now I get

Method Whitecube\NovaFlexibleContent\Flexible::resolveConditionalContainer does not exist.

The

if ($flexibleContent->isNotEmpty()) {
    $this->registerFlexibleMacros($request, $flexibleContent);
}

is false, so this macro is never added?

bernhardh avatar Jan 12 '20 10:01 bernhardh

whats the endpoint nova is trying to hit that throws that error Method Whitecube\NovaFlexibleContent\Flexible::resolveConditionalContainer does not exist. ?

milewski avatar Jan 12 '20 11:01 milewski

It occurs on edit and detail page. And the endpoint throwing it is /nova-api/MODELNAME/ID

On

vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php:103

bernhardh avatar Jan 12 '20 13:01 bernhardh

Btw. I am on dev-flexible-content 7e5e620 atm.

Ok, found it out, that if I don't use the https://github.com/eminiarts/nova-tabs package, than it works. Wrapping it into it, throws the error. The same goes with https://github.com/armincms/json package. It seems, that the FlexibleContent Element has to be on top Level?

bernhardh avatar Jan 12 '20 13:01 bernhardh

Oh I see when you use the nova-tabs the "flexible" content is not found, so the macros are not added to it, that's why it crashes, I think it might be possible to detect, I think it is possible to add a check and see if its an instance of panel and recursively try to find flexible contents within its children

milewski avatar Jan 12 '20 13:01 milewski

Ok, at least I can fix the issue with the tabs package (and all other packages based on Panel items).

In HasConditionalContainer.php:460 just add

if($field instanceof Panel && $field->data) {
    return $this->findAllFlexibleContentFields($field->data);
}

bernhardh avatar Jan 12 '20 13:01 bernhardh

Ah ok let me add

milewski avatar Jan 12 '20 13:01 milewski

Pushed

milewski avatar Jan 12 '20 13:01 milewski

Ok, now it only worked on empty data. After save i get

Cannot bind an instance to a static closure

To fix this change HasConditionalContainer:178

$field::macro('generateFieldName', static function (array $fields) {

to

$field::macro('generateFieldName', function (array $fields = []) {

Not sure why it is decleared static in the first place? Or does this have any sideeffects?

bernhardh avatar Jan 12 '20 14:01 bernhardh

That was a mistake, I didn't know macros wouldnt run in static context, I have removed it and pushed again

milewski avatar Jan 13 '20 04:01 milewski

Thank you very much, for your help, this package (and nova-mega-filter and collapsible-resource-manager). Do you have a "buy me a cup of coffee" link or something else?

bernhardh avatar Jan 13 '20 07:01 bernhardh

Good job guys, I watched all the action from far away, getting spammed by notifications.

I had to deliver the application to my customer, so I finally chose another working option, I used different presets instead of conditional fields. However, great work!

dividy avatar Jan 13 '20 18:01 dividy

@dividy Can I know what you use in order to fix this issue?

patrickleemsantos avatar Apr 30 '20 16:04 patrickleemsantos

@dividy I got it almost working and I had pushed my proof of concept to a branch called flexible field, it works on create, on update and on details view as expected, however validation is still broken :(

if ($controller instanceof CreationFieldController ||
            $controller instanceof UpdateFieldController) {

this is the part where you check the fields for creation?


i have able to make the validation work for flexible but got other issue.

Flexible::make('Produits', 'content')
                ->addLayout('Product', 'product', [
                    Select::make('Type de contrat', 'type')->options([
                        'L' => 'Location',
                        'VL' => 'Vente & Location',
                    ])->displayUsingLabels()->rules('required'),

                    ConditionalContainer::make([
                        Text::make('Prix en Location (htva)', 'price_rent')
                            ->rules('required')
                    ])
                        ->if('type = L'),

                    ConditionalContainer::make([
                        Text::make('Prix en Location (htva)', 'price_rent'),
                        Text::make('Prix de Vente (htva)', 'price_sale'),
                    ])->if('type = VL'),
                ]),

this will make all price_rent will required

https://github.com/anditsung/conditional-container/tree/flexible-content

anditsung avatar May 19 '20 08:05 anditsung