um-admin-blocks.js 7.97 KB
'use strict';

var um_components = wp.components,
	umSelectControl = um_components.SelectControl,
	umTextareaControl = um_components.TextareaControl;


function um_admin_blocks_custom_fields( um_condition_fields, props ) {
	return wp.hooks.applyFilters( 'um_admin_blocks_custom_fields', [], um_condition_fields, props );
}

var um_block_restriction = wp.compose.createHigherOrderComponent( function( BlockEdit ) {
	var um_condition_fields = {
		um_who_access:      'um_block_settings_hide',
		um_roles_access:    'um_block_settings_hide',
		um_message_type:    'um_block_settings_hide',
		um_message_content: 'um_block_settings_hide'
	};

	um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields_default', um_condition_fields );

	return function( props ) {

		if ( props.attributes.um_is_restrict !== true ) {
			um_condition_fields['um_who_access'] = 'um_block_settings_hide';
			um_condition_fields['um_roles_access'] = 'um_block_settings_hide';
			um_condition_fields['um_message_type'] = 'um_block_settings_hide';
			um_condition_fields['um_message_content'] = 'um_block_settings_hide';
		} else {
			um_condition_fields['um_who_access'] = '';

			if ( parseInt( props.attributes.um_who_access ) === 0 || typeof props.attributes.um_who_access === 'undefined' ) {
				um_condition_fields['um_roles_access'] = 'um_block_settings_hide';
				um_condition_fields['um_message_type'] = 'um_block_settings_hide';
				um_condition_fields['um_message_content'] = 'um_block_settings_hide';
			} else if ( parseInt( props.attributes.um_who_access ) === 1  ) {
				um_condition_fields['um_roles_access'] = '';
				um_condition_fields['um_message_type'] = '';

				if ( parseInt( props.attributes.um_message_type ) === 2 ) {
					um_condition_fields['um_message_content'] = '';
				} else {
					um_condition_fields['um_message_content'] = 'um_block_settings_hide';
				}
			} else {
				um_condition_fields['um_message_type'] = '';

				if ( parseInt( props.attributes.um_message_type ) === 2 ) {
					um_condition_fields['um_message_content'] = '';
				} else {
					um_condition_fields['um_message_content'] = 'um_block_settings_hide';
				}
			}
		}

		um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields', um_condition_fields, props );

		return wp.element.createElement(
			wp.element.Fragment,
			{},
			wp.element.createElement( BlockEdit, props ),
			wp.element.createElement(
				wp.blockEditor.InspectorControls,
				{},
				wp.element.createElement(
					wp.components.PanelBody,
					{
						title: wp.i18n.__( 'Ultimate Member: Content Restriction', 'ultimate-member' ),
						className: 'um_block_settings'
					},
					wp.element.createElement(
						wp.components.ToggleControl,
						{
							label: wp.i18n.__( 'Restrict access?', 'ultimate-member' ),
							checked: props.attributes.um_is_restrict,
							onChange: function onChange( value ) {
								props.setAttributes({ um_is_restrict: value });
								if ( value === false ) {
									um_condition_fields['um_who_access'] = 'um_block_settings_hide';
									um_condition_fields['um_roles_access'] = 'um_block_settings_hide';
									um_condition_fields['um_message_type'] = 'um_block_settings_hide';
									um_condition_fields['um_message_content'] = 'um_block_settings_hide';
								} else {
									um_condition_fields['um_who_access'] = '';
								}

								um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields_on_change', um_condition_fields, 'um_is_restrict', value );
							}
						}
					),
					wp.element.createElement(
						umSelectControl,
						{
							type: 'number',
							className: um_condition_fields['um_who_access'],
							label: wp.i18n.__( 'Who can access this block?', 'ultimate-member' ),
							value: props.attributes.um_who_access,
							options: [
								{
									label: wp.i18n.__( 'Everyone', 'ultimate-member' ),
									value: 0
								},
								{
									label: wp.i18n.__( 'Logged in users', 'ultimate-member' ),
									value: 1
								},
								{
									label: wp.i18n.__( 'Logged out users', 'ultimate-member' ),
									value: 2
								}
							],
							onChange: function onChange( value ) {
								props.setAttributes({ um_who_access: value });
								if ( parseInt( value ) === 0 ) {
									um_condition_fields['um_message_type'] = 'um_block_settings_hide';
									um_condition_fields['um_message_content'] = 'um_block_settings_hide';
									um_condition_fields['um_roles_access'] = 'um_block_settings_hide';
								} else if ( parseInt( value ) === 1 ) {
									um_condition_fields['um_message_type'] = '';
									um_condition_fields['um_roles_access'] = '';
								} else {
									um_condition_fields['um_message_type'] = '';
									um_condition_fields['um_roles_access'] = 'um_block_settings_hide';
								}

								um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields_on_change', um_condition_fields, 'um_who_access', value );
							}
						}
					),
					wp.element.createElement(
						umSelectControl,
						{
							multiple: true,
							className: um_condition_fields['um_roles_access'],
							label: wp.i18n.__( 'What roles can access this block?', 'ultimate-member' ),
							value: props.attributes.um_roles_access,
							options: um_restrict_roles,
							onChange: function onChange( value ) {
								props.setAttributes({ um_roles_access: value });
							}
						}
					),
					wp.element.createElement(
						umSelectControl,
						{
							type: 'number',
							className: um_condition_fields['um_message_type'],
							label: wp.i18n.__( 'Restriction action', 'ultimate-member' ),
							value: props.attributes.um_message_type,
							options: [
								{
									label: wp.i18n.__( 'Hide block', 'ultimate-member' ),
									value: 0
								},
								{
									label: wp.i18n.__( 'Show global default message', 'ultimate-member' ),
									value: 1
								},
								{
									label: wp.i18n.__( 'Show custom message', 'ultimate-member' ),
									value: 2
								}
							],
							onChange: function onChange( value ) {
								props.setAttributes({ um_message_type: value });
								if ( parseInt( value ) === 2 ) {
									um_condition_fields['um_message_content'] = '';
								} else {
									um_condition_fields['um_message_content'] = 'um_block_settings_hide';
								}
							}
						}
					),
					wp.element.createElement(
						umTextareaControl,
						{
							type: 'number',
							className: um_condition_fields['um_message_content'],
							label: wp.i18n.__( 'Custom restricted access message', 'ultimate-member' ),
							value: props.attributes.um_message_content,
							onChange: function onChange( value ) {
								props.setAttributes({ um_message_content: value });
							}
						}
					),
					um_admin_blocks_custom_fields( um_condition_fields, props )
				)
			)
		);
	};
}, 'um_block_restriction' );

wp.hooks.addFilter( 'editor.BlockEdit', 'um-block/um_block_restriction', um_block_restriction );


/**
 * Save Attributes
 *
 * @type {{um_is_restrict: {type: string}, um_who_access: {type: string}, um_message_type: {type: string}, um_message_content: {type: string}}}
 */
var um_block_restrict_settings = {
	um_is_restrict: {
		type: "boolean"
	},
	um_who_access: {
		type: "select"
	},
	um_roles_access: {
		type: "select"
	},
	um_message_type: {
		type: "select"
	},
	um_message_content: {
		type: "string"
	}
};

um_block_restrict_settings = wp.hooks.applyFilters( 'um_admin_blocks_restrict_settings', um_block_restrict_settings );


/**
 *
 * @param settings
 * @returns {*}
 */
function um_add_block_attributes( settings ) {
	var _lodash = lodash,
		assign = _lodash.assign;

	settings.attributes = assign( settings.attributes, um_block_restrict_settings );
	return settings;
}

wp.hooks.addFilter( 'blocks.registerBlockType', 'um-block/um_add_block_attributes', um_add_block_attributes );