code-atlantic / content-control

GNU General Public License v3.0
20 stars 8 forks source link

Notes for Fields API refactor #99

Open danieliser opened 11 months ago

danieliser commented 11 months ago

/**
 * New v2.2 fields method should account for.
 *
 * - Id
 * - Tab
 * - Section/panel
 * - Priority
 * - Component/Slot
 * - Component props
 *
 * Tab & section sorting default to order of registration.
 * - Add filter to allow custom sorting.
 *
 * Should allow passing fields, props, and an options object through the filter.
 * - Fields should be an array of objects.
 * - Props should be an object containing settings, updateSettings.
 * - Options should be an object containing additional info such as:
 *   - Shared instanceId.
 *   - fieldIsVisible method
 *   - tabIsVisible method
 *   - sectionIsVisible method
 * - Should return an array of objects.
 *
 * New helper methods should account for:
 * - getFields should be modified to accept tab & section filters.
 *   - Sort fields by priority after filtering.
 * - sortFields should sort by tab (priority) => section (priority) => field (priority)
 * - tabIsVisible
 * - sectionIsVisible
 */
addFilter(
    'contentControl.restrictionEditor.fields',
    'content-control',
    ( fields, { settings, updateSettings }, options ) => {
        return [
            ...fields,
            {
                id: 'protectionMethod',
                tab: 'protection',
                section: 'general',
                priority: 1,
                component: (
                    <RadioButtonControl
                        label={ __(
                            'How do you want to protect your content?',
                            'content-control'
                        ) }
                        value={ settings.protectionMethod }
                        onChange={ ( protectionMethod ) =>
                            updateSettings( { protectionMethod } )
                        }
                        options={ ( () =>
                            applyFilters(
                                'contentControl.restrictionEditor.protectionMethodOptions',
                                protectionMethodOptions
                            ) as typeof protectionMethodOptions )() }
                    />
                ),
            },
            {
                id: 'protectionFieldsSlot',
                tab: 'protection',
                section: '',
                priority: 2,
                component: <ProtectionFieldsSlot />,
            },
        ];
    }
);