JSFiddle - React, Tailwind, and code Playground

Fake Task Form Editor

by DugSohn

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.2/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.2.2/gridstack.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.2.2/gridstack.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/sidr/2.2.1/stylesheets/jquery.sidr.light.min.css">
<script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=qagffr3pkuv17a8on1afax661irst1hbr4e6tbv888sz91jc"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/css-element-queries/1.1.1/ElementQueries.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/css-element-queries/1.1.1/ResizeSensor.js"></script>
<div id="sidr" class="sidr left " style="transition: left 0.2s ease 0s; left: 0px;">
<h2 style="padding:10px"><button class="btn   btn-primary" title="Field Options"><i class="fa fa-wrench fa-2x"></i></button> <button class="btn   btn-link"title="set IFFTY"> <i class="fa fa-gears fa-2x"></i></button> <button class="btn   btn-link" title="View Options">  <i class="fa fa-eye fa-2x"></i></button></h2>
	<div class="container-fluid">
		<div class="row">
			<div class="col-sm-12">
			<br/>
				<div><b> Text Field Options</b></div>
				<div><br/>
				<b>Label:</b>
				</div>
				<br/>
				
				<small><ul>
				<li><input type="checkbox"> Hide Label</li>
				<li><input type="checkbox">  Placeholder
				<div>
				<input type="text" class="form-control">
				</div></li>
				<li><input type="checkbox"> Enable...

SCSS

@import url(http://fonts.googleapis.com/css?family=Roboto+Slab|Open+Sans:400italic,700italic,400,700);

.ui-yakaimage {

display: inline-block;
background-color: rgba(0,0,0,.2);
box-shadow: inset 0 0 2px rgba(0,0,0,.6);
}
.addCondition {
	
	    font-size: 10px;
    text-align: center;
    margin: 0 auot;
    margin-left: -17px;
    margin-top: -10px;
    opacity: .4;
    margin-bottom: 20px;
    display: block;
	
}


.ui-builder {
  
  .form-group {
    border-top: none;
  }
    .form-group:hover {
    background: transparent;
  }
    
.row > div[class^="col-"] {
    background-color: #fff;
    border: 1px solid #fff;
    padding: 15px 0;
    text-align:left;
    flex:1 0 0 ;
    min-height:40px
    }
    

.row.ui-builder-has-layout > div[class^="col-"] {
    box-shadow: inset 15px 0 0 #f5f5f5, inset -15px 0 0 #f5f5f5, inset 0 15px 0 #f5f5f5, inset 0 -15px 0 #f5f5f5;
    background-color: #fff;
    border: 1px solid #eee;
    padding: 15px 0;
    text-align:left;
    flex:1 0 0 ;
    min-height:40px
    }
    
    .row > div[class^="col-"] > .row {
    margin: -15px 0;
    }
    
    .row {
    display:flex;
    flex-direction:row;
}
}

.ui-yakabox-dash-button-wrapper {
  display: none;
}


.ui-builder-has-layout .ui-yakabox-dash-button-wrapper {
  display:block;
    text-align: center;
    width: 100%;
    position: absolute;
    left: 47.5%;
    z-index: 498;
    height: 1px;
    bottom: 8px;
}

.ui-yakabox-dash-button-wrapper button {

    background-color: transparent;
    border:none;
    margin-right: -1px;
    color: #999;
    float: none;

}

.btn-default:hover, .btn-default:hover .fa {
  color:#000;
}

.ui-dash-widget-tools {
right: 4px;
top: 35%;
height: 40px;
width: 13px;
position: absolute;
z-index: 3000;


.ui-dash-widget-menu {
  display:none;
  top: 0;
height: 100%;
}

}

.ui-dash-widget-tools.hover, .ui-dash-widget-tools:focus {
right: 0;
top: 0;
height: 100%;
width: 320px;;
position: absolute;
z-index: 3000;
background-color:...

JavaScript

var options = {
  cell_height: 80,
  vertical_margin: 10
};



$('.grid-stack').gridstack(options);

$(document).ready(function() {
  $('[data-toggle="tooltip"]').tooltip();
});

$('#first_widget').click(function() {
  var el = $.parseHTML("<div><div class=\"grid-stack-item-content\"/><div class=\"row grid-stack-item-content ui-selected  \"><div class=\"form-group clearfix\"><label class=\"control-label col-xs-12 col-sm-3\" contenteditable=\"true\">Label</label><div class=\"col-xs-12 col-sm-9 control-wrapper\"><input type=\"text\" class=\"form-control\"><div class=\"ui-field-type\">Text Field</div><div class=\"help-block\" contenteditable=\"true\" style=\"display:none\">Click to add helpful instructions</div> </div></div> <div/></div>");
  var grids = $('.grid-stack').data('gridstack');
		$('.grid-stack-item-content').removeClass('ui-selected');
grids.add_widget(el, 1, 1, 6, 1, true);



  $('.control-label').click(
    function() {
		  var $this = $(this),
			    $parent = $this.closest('.form-group'),
			    $sibling = $parent.find('.control-wrapper');
$this.focus( function() {

document.execCommand('selectAll',false,null);

});

//$this.focus();
			grids.movable('.grid-stack-item', false);
			grids.resizable('.grid-stack-item', false);
			$this.focus();

			$this.resizable({
 				 handles: "e"
});
			$($this).resize(function(){
   $($sibling).width($($parent).width()-$($this).width()-75); 
		});
			
			
			$this.blur( function(){
			//$this.resizable( "destroy" );
				grids.movable('.grid-stack-item', true);
			grids.resizable('.grid-stack-item', true);
			
			});
			
    });
		
		  $('.help-block').click(
    function() {
		  var $this = $(this);
			$this.focus().text('');

			grids.movable('.grid-stack-item', false);
			grids.resizable('.grid-stack-item', false);
			
			$this.blur( function(){
			
				grids.movable('.grid-stack-item', true);
			grids.resizable('.grid-stack-item', true);
			
			});
			
    });
		
		$('.ui-field-type').click(...