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

Nova Flexible Content #17

Open
dividy opened this issue Dec 13, 2019 · 25 comments
Open

Nova Flexible Content #17

dividy opened this issue Dec 13, 2019 · 25 comments
Labels
enhancement New feature or request help wanted Extra attention is needed

Comments

@dividy
Copy link

dividy commented Dec 13, 2019

Hello,

Is it compatible with Nova Flexible Content ?

I tried it and had a JS error..

Thanks !

@milewski milewski added the enhancement New feature or request label Dec 14, 2019
@milewski
Copy link
Member

Currently it doesn't work with flexible content

@dividy
Copy link
Author

dividy commented Dec 14, 2019 via email

@milewski
Copy link
Member

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: epartment/nova-dependency-container@d408149 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 milewski added the help wanted Extra attention is needed label Dec 16, 2019
@milewski
Copy link
Member

@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 :(

@dividy
Copy link
Author

dividy commented Dec 16, 2019

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

@dividy
Copy link
Author

dividy commented Dec 31, 2019

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
Copy link
Author

dividy commented Dec 31, 2019

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

@bernhardh
Copy link

bernhardh commented Jan 11, 2020

@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')
    ])

@milewski
Copy link
Member

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
Copy link
Member

@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
Copy link
Member

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

@bernhardh
Copy link

bernhardh commented Jan 12, 2020

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?

@milewski
Copy link
Member

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

@bernhardh
Copy link

bernhardh commented Jan 12, 2020

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
Copy link

bernhardh commented Jan 12, 2020

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?

@milewski
Copy link
Member

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

@bernhardh
Copy link

bernhardh commented Jan 12, 2020

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);
}

@milewski
Copy link
Member

Ah ok let me add

@milewski
Copy link
Member

Pushed

@bernhardh
Copy link

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?

@milewski
Copy link
Member

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

@bernhardh
Copy link

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?

@dividy
Copy link
Author

dividy commented Jan 13, 2020

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!

@patrickleemsantos
Copy link

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

@anditsung
Copy link

anditsung commented May 19, 2020

@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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

5 participants